Ansible简介:
Ansible基于Python开发,默认通过SSH协议进行远程命令执行或下发配置,无需部署任何客户端代理软件,可同时支持多台主机进行管理。ansible是基于模块工作的,本身没有批量部署的能力,真正具有批量部署的是ansible所运行的模块,能够实现批量运行命令、部署程序、配置系统等功能。
Ansible的基本架构主要包括:
(1)Ansible core核心引擎。
(2)Host inventory 主机清单:用来定义Ansible管理的主机,默认是在Ansible配置文件中定义被管理主机,同时也支持自定义动态主机清单。
(3)Comecton pugins连接插件:负责和被管理主机实现通信。除支持使用SSH连接被管理主机外,Ansible还支持其他的连接方式,所以需要有连接插件将各个主机用连接插件连接到Ansible。
(4)Core modules核心模块:是Ansible自带的模块,使用这些模块将资源分发到被管理主机,使其执行特定任务或匹配特定的状态。
(5)Custom meodle自定义模块:用于完成模块功能的补充,可借助相关插件完成记
录日志、发送邮件等功能。
(6)Playbooks (yaml, jinja2) 剧本:用来集中定义Ansible任务的配置文件,即将多个任务定义在一个剧本中由Ansible自动执行,可以由控制主机针对多台被管理主机同时运行多个任务。
系统环境:
主机 | 操作系统 | IP地址 | 组名 |
---|---|---|---|
控制主机 | CentOS 7.4 x86_64 | 192.168.100.138 | |
被管理主机 | CentOS 7.4 x86_64 | 192.168.100.131 | webserver |
被管理主机 | CentOS 7.4 x86_64 | 192.168.100.132 | mysql |
安装部署Ansible服务
1.安装Ansible
准备yum源,直接使用yum命令安装Ansible
yum install -y epel-release #安装epel源
yum install ansible -y
查看ansible软件的版本信息
ansible --version
Ansible主要相关配置文件在/etc/ansible目录下。
[root@promote ~]# cd /etc/ansible/
[root@promote ansible]# pwd
/etc/ansible
[root@promote ansible]# ll
总用量 24
-rw-r--r--. 1 root root 19549 7月 6 23:53 ansible.cfg #配置文件
-rw-r--r--. 1 root root 1016 7月 6 23:53 hosts #管控主机文件
drwxr-xr-x. 2 root root 6 7月 6 23:53 roles
2.配置主机清单
修改主机与组配置后,可同时连接到多个被管理主机上执行任务。
cd /etc/ansible
vim hosts
[webserver] #被管理主机分类
192.168.100.131
[mysql]
192.168.100.132 #被管理主机分类
3.设置SSH无密码登录
使用ssh-keygen产生一对密钥,使用ssh-copy-id来下发生成的公钥。
ssh-keygen -t rsa #基于ssh密钥的连接
ssh-copy-id [email protected]
ssh-copy-id [email protected] #配置密钥对验证
ssh-agent bash
ssh-add
Ansible命令应用
Ansible可以使用命令行方式进行自动化管理,它的命令行管理工具都是由一系列模块、参数所支持的,基本语法如下:
ansible [主机] [-m 模块] [-a args]
Ansible自带了很多模块,能够下发执行Ansible的各种管理任务。不过查看模块帮助信息可以用ansible-doc工具。
ansible-doc -l #列出所有已安装的模块 注:按q退出
ansible-doc -s yum #-s列出yum模块描述信息和操作动作
1.command模块
-m选项指定使用模块,默认使用command模块,用于在被管理主机上运行命令。
(1)使用IP地址指定运行主机
ansible 192.168.100.131 -m command -a 'date'
ansible mysql -m command -a 'date'
ansible all -m command -a 'date'
ansible all -a 'tail -1 /etc/passwd'
2.cron模块
cron模块用于定义任务计划。其中有两种状态(state ):present表示添加(省略状态默认使用),absent表示移除。
(1)添加任务计划
ansible webserver -m cron -a 'minute="*/1" job="/bin/echo heihei" name="test cron job"'
#查看计划是否添加成功
ansible webserver -a 'crontab -l'
ansible webserver -m cron -a 'name="test cron job" state=absent'
3.user模块
user模块用于创建新用户和更改、删除已存在的用户。其中name选项用来指明创建的用户名称。请求的是useradd, userdel, usermod三个指令
(1)创建用户
ansible mysql -m user -a 'name="test01"'
#查看用户是否添加成功
ansible mysql -m command -a 'tail /etc/passwd'
ansible mysql -m user -a 'name="test01" state=absent'
4.group模块
group模块用于对用户组进行管理。请求的是groupadd, groupdel, groupmod 三个指令。
例如:创建mysql组,将已创建好的用户test01添加到mysql组中。
#创建mysql组
ansible mysql -m group -a 'name=mysql gid=306 system=yes'
#查看组是否添加
ansible mysql -a 'tail /etc/group'
#将用户mysql添加到mysql组中
ansible mysql -m user -a 'name=mysql uid=306 system=yes group=mysql'
#查看用户mysql是否添加到mysql组中
ansible mysql -a 'tail -1 /etc/passwd'
5.copy模块
copy模块用于实现文件复制和批量下发文件。其中使用src来定义本地源文件路径,使用dest定义被管理主机文件路径,使用content则是通过指定信息内容来生成目标文件。
(1)将本地文件/etc/fstab复制到被管理主机上的/opt/fstab.back,将所有者设置为root,权限设置为640.
ansible mysql -m copy -a 'src=/etc/fstab dest=/opt/fstab.back owner=root mode=640'
#查看是否存在复制的文件
ansible mysql -a 'ls -l /opt'
(2)将hello heihei!写入/opt/fstab.back。
ansible mysql -m copy -a 'content="hello heihei!"
dest=/opt/fstab.back'
#查看内容是否写入
ansible mysql -a 'cat /opt/fstab.back'
6.file模块
file模块来设置文件属性。其中使用path指定文件路径,使用src定义源文件路径,使用name或dest来替换创建文件的符号链接。
(1)设置文件/opt/fstab.back的所属主为mysql,所属组为mysql,权限为644.
ansible mysql -m file -a 'owner=mysql group=mysql mode=644 path=/opt/fstab.back'
#查看文件的属性
ansible mysql -a 'ls -l /opt/'
(2)设置/opt/fstab.link为/opt/fstab.back的链接文件。
ansible mysql -m file -a 'path=/opt/fstab.link src=/opt/fstab.back state=link'
#查看链接文件
ansible mysql -a 'ls -l /opt/'
ansible mysql -m file -a "path=/opt/fstab.back state=absent"
ansible mysql -m file -a "path=/opt/test state=touch"
7.ping模块
ping,模块是用来检测指定主机的连通性。
ansible all -m ping
8.shell模块
shell模块可以在被管理主机上运行命令,并支持像管道符等功能的复杂命令。
例如,创建用户使用无交互模式给用户设置密码。
#创建用户user1
ansible mysql -m user -a 'name=user1'
#无交互给用户user1设置密码
ansible mysql -m shell -a 'echo abc123|passwd --stdin user1'
9.script模块
script模块可以将本地脚本复制到被管理主机上进行运行。需要注意的是,使用相对路径来指定脚本。
例如,编辑一个本地脚本test.sh,复制到被管理主机上运行。
vi /opt/test.sh
#!/bin/bash
echo "hello ansible from script"> /opt/script.txt
chmod +x /opt/test.sh
ansible mysql -m script -a '/opt/test.sh'
#查看脚本实现
ansible mysql -a 'cat /opt/script.txt'
10.yum模块
yum模块复责在被管理主机上安装与卸载软件包,其中使用name指定要安装的软件包,使用state指定安装软件包的状态,present、latest用来表示安装,absent表示卸载。
(1)安装zsh软件包
ansible mysql -m yum -a 'name=zsh'
#查看是否安装
ansible mysql -a 'rpm -q zsh'
ansible mysql -m yum -a 'name=zsh state=absent'
ansible webserver -m yum -a 'name=httpd'
11.service模块
service模块用来控制管理服务的运行状态。其中enabled表示是否开机自启动,取值为true或false,使用name定义服务名称,使用state指定服务状态,取值分别为started、stoped、restarted.
(1)启动httpd服务并设置开机自启动。
ansible webserver -m service -a 'enabled=true name=httpd state=started'
(2)查看httpd服务的状态
ansible webserver -a 'systemctl status httpd'
12.setup模块
setup模块收集、查看被管理主机的facts。每个被管理主机在接并运行管理命令之前,都会将自己的相关信息(操作系统、IP地址)发送给控制主机。
例如,查看mysql组的facts信息。
ansible mysql -m setup