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 root@192.168.100.131
ssh-copy-id root@192.168.100.132    #配置密钥对验证

为了实现免交互代理,可以输入以下命令:

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' 

(2)使用被管理主机的分类运行

ansible mysql -m command -a 'date'

(3)在所有主机清单中的主机运行

ansible all -m command -a 'date'

(4)不加-m选项,默认运行command模块

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'

进webserver组的主机查看 (2)移除任务计划

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'

(2)删除用户

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/'

(3)删除文件/opt/fstab.back

ansible mysql -m file -a "path=/opt/fstab.back state=absent" 

(4)创建文件/opt/test。

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'

(2)卸载zsh软件包

ansible mysql -m yum -a 'name=zsh state=absent'

(3)安装httpd软件包

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 

以上皆是Ansible常用的模块,如果用到其他模块可以使用ansible-doc工具。