Ansible是最近几年特别火的一款开源运维自动化工具,它能够帮助运维人员肉眼可见地提高工作效率,并减少人为失误。Ansible有上千个功能丰富且实用的模块,而且有详尽的帮助信息可供查阅,因此即便是小白用户也可以轻松上手。
-
Ansible介绍与安装
Ansible目前是运维自动化工具中最简单、容易上手的一款优秀软件,能够用来管理各种资源。
可以使用Ansible自动部署应用程序,以此实现IT基础架构的全面部署。
例如,借助于Ansible,可以轻松地对服务器进行初始化配置、安全基线配置,以及进行更新和打补丁操作。
相较于Chef、Puppet、SaltStack等C/S(客户端/服务器)架构的自动化工具来讲,尽管Ansible的性能并不是最好的,但由于它基于SSH远程会话协议,不需要客户端程序,只要知道受管主机的账号密码,就能直接用SSH协议进行远程控制,因此使用起来优势明显。
Ansible服务本身并没有批量部署的功能,它仅仅是一个框架,真正具有批量部署能力的是其所运行的模块。
Ansible内置的模块非常丰富,几乎可以满足一切需求,使用起来也非常简单,一条命令甚至影响上千台主机。
如果需要更高级的功能,也可以运用Python语言对Ansible进行二次开发。
Ansible服务专用术语对照表
术语 |
中文叫法 |
含义 |
Control node |
控制节点 |
指的是安装了Ansible服务的主机,也被称为Ansible控制端,主要是用来发布运行任务、调用功能模块,对其他主机进行批量控制。 |
Managed nodes |
受控节点 |
指的是被Ansible服务所管理的主机,也被称为受控主机或客户端,是模块命令的被执行对象。 |
Inventory |
主机清单 |
指的是受控节点的列表,可以是IP地址、主机名称或者域名。 |
Modules |
模块 |
指的是上文提到的特定功能代码,默认自带有上千款功能模块,在Ansible Galaxy有超多可供选择。 |
Task |
任务 |
指的是Ansible客户端上面要被执行的操作。 |
Playbook |
剧本 |
指的是通过YAML语言编写的可重复执行的任务列表,把常做的操作写入到剧本文件中,下次可以直接重复执行一遍。 |
Roles |
角色 |
从Ansible 1.2版本开始引入的新特性,用于结构化的组织Playbook,通过调用角色实现一连串的功能。 |
由于受控节点不需要安装客户端,外加SSH协议是Linux系统的标配,因此可以直接通过SSH协议进行远程控制。在控制节点上,也不用每次都重复开启服务程序,使用ansible命令直接调用模块进行控制即可。
RHEL 8系统的镜像文件默认不带有Ansible服务程序,需要从Extra Packages for Enterprise Linux(EPEL)扩展软件包仓库获取。EPEL软件包仓库由红帽公司提供,是一个用于创建、维护和管理企业版Linux的高质量软件扩展仓库,通用于RHEL、CentOS、Oracle Linux等多种红帽系企业版系统,目的是对于默认系统仓库软件包进行扩展。
下面准备在系统上部署Ansible服务程序。
第1步:在“虚拟机设置”界面中,将“网络适配器”的“网络连接”选项调整为“桥接模式”,并将系统的网卡设置成“Automatic(DHCP)”模式
[root@localhost ~]# ping www.baidu.com -c 4
PING www.baidu.com (180.101.49.11) 56(84) bytes of data.
64 bytes from 180.101.49.11 (180.101.49.11): icmp_seq=1 ttl=52 time=24.7 ms
64 bytes from 180.101.49.11 (180.101.49.11): icmp_seq=2 ttl=52 time=96.6 ms
64 bytes from 180.101.49.11 (180.101.49.11): icmp_seq=3 ttl=52 time=16.2 ms
64 bytes from 180.101.49.11 (180.101.49.11): icmp_seq=4 ttl=52 time=16.6 ms
--- www.baidu.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 173ms
rtt min/avg/max/mdev = 16.173/38.527/96.608/33.703 ms
[root@localhost ~]#
第2步:在原有软件仓库配置的下方,追加EPEL扩展软件包安装源的信息。
[root@localhost ~]# ls /etc/yum.repos.d/
redhat.repo rhel8.repo
[root@localhost ~]# vim /etc/yum.repos.d/rhel8.repo
[BaseOS]
name=BaseOS
baseurl=file:///media/cdrom/BaseOS
enabled=1
gpgcheck=0
[AppStream]
name=AppStream
baseurl=file:///media/cdrom/AppStream
enabled=1
gpgcheck=0
[EPEL]
name=EPEL
baseurl=https://dl.fedoraproject.org/pub/epel/8/Everything/x86_64/
enabled=1
gpgcheck=0
[root@localhost ~]#
第3步:安装!
[root@localhost ~]# dnf install -y ansible
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
AppStream 351 kB/s | 3.2 kB 00:00
BaseOS 184 kB/s | 2.7 kB 00:00
EPEL 479 kB/s | 10 MB 00:21
Dependencies resolved.
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
ansible noarch 2.9.24-1.el8 EPEL 17 M
Installing dependencies:
python3-babel noarch 2.5.1-3.el8 AppStream 4.8 M
python3-jinja2 noarch 2.10-9.el8 AppStream 537 k
python3-jmespath noarch 0.9.0-11.el8 AppStream 45 k
python3-markupsafe x86_64 0.23-19.el8 AppStream 39 k
python3-pyasn1 noarch 0.3.7-6.el8 AppStream 126 k
libsodium x86_64 1.0.18-2.el8 EPEL 162 k
python3-bcrypt x86_64 3.1.6-2.el8.1 EPEL 44 k
python3-pynacl x86_64 1.3.0-5.el8 EPEL 100 k
sshpass x86_64 1.06-9.el8 EPEL 27 k
Installing weak dependencies:
python3-paramiko noarch 2.4.3-1.el8 EPEL 289 k
Transaction Summary
================================================================================
Install 11 Packages
Total size: 23 M
Total download size: 18 M
Installed size: 122 M
Downloading Packages:
(1/6): python3-bcrypt-3.1.6-2.el8.1.x86_64.rpm 18 kB/s | 44 kB 00:02
(2/6): libsodium-1.0.18-2.el8.x86_64.rpm 52 kB/s | 162 kB 00:03
(3/6): python3-pynacl-1.3.0-5.el8.x86_64.rpm 37 kB/s | 100 kB 00:02
(4/6): sshpass-1.06-9.el8.x86_64.rpm 103 kB/s | 27 kB 00:00
(5/6): python3-paramiko-2.4.3-1.el8.noarch.rpm 60 kB/s | 289 kB 00:04
(6/6): ansible-2.9.24-1.el8.noarch.rpm 529 kB/s | 17 MB 00:32
--------------------------------------------------------------------------------
Total 548 kB/s | 18 MB 00:32
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : sshpass-1.06-9.el8.x86_64 1/11
Installing : python3-bcrypt-3.1.6-2.el8.1.x86_64 2/11
Installing : libsodium-1.0.18-2.el8.x86_64 3/11
Installing : python3-pynacl-1.3.0-5.el8.x86_64 4/11
Installing : python3-pyasn1-0.3.7-6.el8.noarch 5/11
Installing : python3-paramiko-2.4.3-1.el8.noarch 6/11
Installing : python3-markupsafe-0.23-19.el8.x86_64 7/11
Installing : python3-jmespath-0.9.0-11.el8.noarch 8/11
Installing : python3-babel-2.5.1-3.el8.noarch 9/11
Installing : python3-jinja2-2.10-9.el8.noarch 10/11
Installing : ansible-2.9.24-1.el8.noarch 11/11
Running scriptlet: ansible-2.9.24-1.el8.noarch 11/11
Verifying : python3-babel-2.5.1-3.el8.noarch 1/11
Verifying : python3-jinja2-2.10-9.el8.noarch 2/11
Verifying : python3-jmespath-0.9.0-11.el8.noarch 3/11
Verifying : python3-markupsafe-0.23-19.el8.x86_64 4/11
Verifying : python3-pyasn1-0.3.7-6.el8.noarch 5/11
Verifying : ansible-2.9.24-1.el8.noarch 6/11
Verifying : libsodium-1.0.18-2.el8.x86_64 7/11
Verifying : python3-bcrypt-3.1.6-2.el8.1.x86_64 8/11
Verifying : python3-paramiko-2.4.3-1.el8.noarch 9/11
Verifying : python3-pynacl-1.3.0-5.el8.x86_64 10/11
Verifying : sshpass-1.06-9.el8.x86_64 11/11
Installed products updated.
Installed:
ansible-2.9.24-1.el8.noarch python3-paramiko-2.4.3-1.el8.noarch
python3-babel-2.5.1-3.el8.noarch python3-jinja2-2.10-9.el8.noarch
python3-jmespath-0.9.0-11.el8.noarch python3-markupsafe-0.23-19.el8.x86_64
python3-pyasn1-0.3.7-6.el8.noarch libsodium-1.0.18-2.el8.x86_64
python3-bcrypt-3.1.6-2.el8.1.x86_64 python3-pynacl-1.3.0-5.el8.x86_64
sshpass-1.06-9.el8.x86_64
Complete!
[root@localhost ~]#
安装完毕后,Ansible服务便默认已经启动。使用--version参数可以看到Ansible服务的版本及配置信息。
[root@localhost ~]# ansible --version
ansible 2.9.25
config file = /etc/ansible/ansible.cfg
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3.6/site-packages/ansible
executable location = /usr/bin/ansible
python version = 3.6.8 (default, Jan 11 2019, 02:17:16) [GCC 8.2.1 20180905 (Red Hat 8.2.1-3)]
[root@localhost ~]#
-
设置主机清单
Ansible服务的主配置文件存在优先级的顺序关系,默认存放在/etc/ansible目录中的主配置文件优先级最低。如果在当前目录或用户家目录中也存放着一份主配置文件,则以当前目录或用户家目录中的主配置文件为主。同时存在多个Ansible服务主配置文件时,
Ansible服务主配置文件优先级顺序
优先级 |
文件位置 |
高 |
./ansible.cfg |
中 |
~/.ansible.cfg |
低 |
/etc/ansible/ansible.cfg |
Ansible服务是用于实现主机批量自动化控制的管理工具,可以把要管理的主机IP地址预先写入主机清单文件(/etc/ansible/hosts),这样后续再通过执行ansible命令来执行任务时就自动包含这些主机了
测试受管主机信息
操作系统 |
IP地址 |
功能用途 |
RHEL 8 |
192.168.10.20 |
dev |
RHEL 8 |
192.168.10.30 |
test |
将测试主机写入到主机清单文件中,并将主机进行分组,主机清单文件在修改后会立即生效,一般使用“ansible-inventory --graph”命令以结构化的方式显示出受管主机的信息。
[root@localhost ~]# vim /etc/ansible/hosts
[dev]
192.168.10.20
[test]
192.168.10.30
[root@localhost ~]# ansible-inventory --graph
@all:
|--@dev:
| |--192.168.10.20
|--@test:
| |--192.168.10.30
|--@ungrouped:
[root@localhost ~]#
Ansible常用变量汇总
参数 |
作用 |
ansible_ssh_host |
受管主机名 |
ansible_ssh_port |
端口号 |
ansible_ssh_user |
默认账号 |
ansible_ssh_pass |
默认密码 |
ansible_shell_type |
Shell终端类型 |
再次配置主机清单文件,使其登录各主机时自动登录,因测试主机密码都一样,可以使用all统一配置。
[root@localhost ~]# cat /etc/ansible/hosts
[dev]
192.168.10.20
[test]
192.168.10.30
[root@localhost ~]# vim /etc/ansible/hosts
[root@localhost ~]# cat /etc/ansible/hosts
[dev]
192.168.10.20
[test]
192.168.10.30
[all:vars]
ansible_user=root
ansible_password=123456
[root@localhost ~]#
将Ansible主配置文件中的第71行设置成默认不需要SSH协议的指纹验证,以及将第107行设置成默认执行剧本时所使用的管理员名称为root
[root@localhost ~]# vim /etc/ansible/ansible.cfg
...
70 # uncomment this to disable SSH key host checking
- 71 #host_key_checking = False
+ 71 host_key_checking = False
72
73 # change the default callback, you can only have one 'stdout' type enabled at a time.
...
106 # (/usr/bin/ansible will use current user as default)
- 107 #remote_user = root
+ 107 remote_user = root
108
109 # logging is off by default unless this path is defined
[root@localhost ~]#
不需要重启服务,在以上操作完全搞定后就可以开始后面的实验了。
由于刚才是将Ansible服务器设置成了桥接及DHCP模式,现在将网络适配器修改回“仅主机模式”以及192.168.10.10/24的IP地址。在修改完成后重启网卡,然后执行ping操作,测试 192.168.10.20、192.168.10.30 通信。
[root@localhost ~]# ifconfig
ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.133 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fe80::a7bc:9261:b95:a2f6 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:4a:53:0b txqueuelen 1000 (Ethernet)
RX packets 10650 bytes 12302250 (11.7 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2147 bytes 170750 (166.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 48 bytes 4608 (4.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 48 bytes 4608 (4.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:53:93:e3 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@localhost ~]# ifconfig
ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.10.10 netmask 255.255.255.0 broadcast 192.168.10.255
inet6 fe80::a7bc:9261:b95:a2f6 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:4a:53:0b txqueuelen 1000 (Ethernet)
RX packets 10723 bytes 12309131 (11.7 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2222 bytes 179074 (174.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0