Ansible是最近几年特别火的一款开源运维自动化工具,它能够帮助运维人员肉眼可见地提高工作效率,并减少人为失误。Ansible有上千个功能丰富且实用的模块,而且有详尽的帮助信息可供查阅,因此即便是小白用户也可以轻松上手。
本章首先介绍了Ansible服务的产生背景、相关术语以及主机清单的配置,期间会带领大家深入学习ping、yum、firewalld、service、template、setup、lvol、lvg、copy、file、debug等十余个常用的Ansible模块,以满足日常工作中的需要。然后,本章采用动手实操的方式介绍了从系统中加载角色、从外部环境获取角色以及自行创建角色的方法,旨在让读者能够学到如何在生产环境中掌控任务工作流程。此外,本章借助于通过精心编写的playbook(剧本)文件,以动手实操的方式介绍了创建逻辑卷设备,依据主机改写文件、管理文件属性的方法。本章最后以使用Ansible的vault对变量以及剧本文件进行加密来收尾。
本章全面涵盖了Ansible的使用细节,且内容环环相扣,相信读者在学完本章内容之后会有酣畅淋漓之感。
本章目录结构
- 16.1 Ansible介绍与安装
- 16.2 设置主机清单
- 16.3 运行临时命令
- 16.4 剧本文件实战
- 16.5 创建及使用角色
- 16.6 创建和使用逻辑卷
- 16.7 判断主机组名
- 16.8 管理文件属性
- 16.9 管理密码库文件
16.1 Ansible介绍与安装
Ansible目前是运维自动化工具中最简单、容易上手的一款优秀软件,能够用来管理各种资源。用户可以使用Ansible自动部署应用程序,以此实现IT基础架构的全面部署。例如,借助于Ansible,我们可以轻松地对服务器进行初始化配置、安全基线配置,以及进行更新和打补丁操作。相较于Chef、Puppet、SaltStack等C/S(客户端/服务器)架构的自动化工具来讲,尽管Ansible的性能并不是最好的,但由于它基于SSH远程会话协议,不需要客户端程序,只要知道受管主机的账号密码,就能直接用SSH协议进行远程控制,因此使用起来优势明显。
2012年2月,程序员Michael DeHaan发布了Ansible的第一个版本。Michael DeHaan在配置管理和架构设计方面拥有丰富的经验,他此前红帽公司任职时,就研发了Cobbler自动化系统安装工具。在就职于红帽公司的期间,他被各种自动化软件折磨了好久,最终决定自己打造一款集众多软件的优点于一身的自动化工具。Ansible由此诞生。由于Ansible实在太好用了,以至于它在GitHub上的star和fork数量是SaltStack的两倍多,这足以看出受欢迎的程度。2015年,Ansible正式被红帽公司收购,其发展潜力更是不可估量。
使用自动化运维工具,可以肉眼可见地提高运维人员的工作效率,并减少人为错误。Ansible服务本身并没有批量部署的功能,它仅仅是一个框架,真正具有批量部署能力的是其所运行的模块。Ansible内置了上千个模块,会在安装Ansible时一并安装,通过调用指定的模块,就能实现特定的功能。Ansible内置的模块非常丰富,几乎可以满足一切需求,使用起来也非常简单,一条命令甚至影响上千台主机。如果需要更高级的功能,也可以运用Python语言对Ansible进行二次开发。
当前,Ansible已经被Amazon、Google、Microsoft、Cisco、HP、VMware、Twitter等大科技公司接纳并投入使用。红帽公司更是对自家产品进行了不遗余力的支持。从2020年8月1日起,RHCE考试的内容由配置多款服务转变成Ansible专项考题内容。现在,要想顺利拿到RHCE认证,真的有必要好好学习一下本章了。
在正式介绍Ansible之前,我们先普及一下相关的专用术语,好让大家对术语有统一的理解,以便在后续实验时能直奔主题。这里整理的与Ansible相关的专用术语如表16-1所示。
表16-1 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)”模式,如图16-1及图16-2所示。
图16-1 将“网络连接”设置为“桥接模式”
图16-2 将网卡设置为“Automatic(DHCP)”模式
在大多数情况下,只要把虚拟机设置成桥接模式,且Linux系统的网卡信息与物理机相同,然后再重启网络服务,就可以连接外部网络了。如果不放心,可以通过ping命令进行测试。
[root@linuxprobe ~]# nmcli connection up ens160 Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4) [root@linuxprobe ~]# ping -c 4 www.linuxprobe.com PING www.linuxprobe.com.w.kunlunno.com (124.95.157.160) 56(84) bytes of data. 64 bytes from www.linuxprobe.com (124.95.157.160): icmp_seq=1 ttl=53 time=17.1 ms 64 bytes from www.linuxprobe.com (124.95.157.160): icmp_seq=2 ttl=53 time=15.6 ms 64 bytes from www.linuxprobe.com (124.95.157.160): icmp_seq=3 ttl=53 time=16.8 ms 64 bytes from www.linuxprobe.com (124.95.157.160): icmp_seq=4 ttl=53 time=17.5 ms --- www.linuxprobe.com.w.kunlunno.com ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 10ms rtt min/avg/max/mdev = 15.598/16.732/17.452/0.708 ms
第2步:在原有软件仓库配置的下方,追加EPEL扩展软件包安装源的信息。
[root@linuxprobe ~]# vim /etc/yum.repos.d/rhel.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
第3步:安装!
[root@linuxprobe ~]# 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. Last metadata expiration check: 0:01:31 ago on Sun 04 Apr 2021 02:23:32 AM CST. Dependencies resolved. =========================================================================================== Package Arch Version Repository Size =========================================================================================== Installing: ansible noarch 2.9.18-2.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 ………………省略部分输出信息………… Installed: ansible-2.9.18-2.el8.noarch python3-paramiko-2.4.3-1.el8.noarch python3-babel-2.5.1-3