在初次使用Ansible服务时,大家可能会遇到这种情况:参数明明已经修改了,但却不生效。这是因为Ansible服务的主配置文件存在优先级的顺序关系,默认存放在/etc/ansible目录中的主配置文件优先级最低。如果在当前目录或用户家目录中也存放着一份主配置文件,则以当前目录或用户家目录中的主配置文件为主。同时存在多个Ansible服务主配置文件时,具体优先级顺序如表16-2所示。

表16-2 Ansible服务主配置文件优先级顺序

优先级

文件位置


./ansible.cfg


~/.ansible.cfg


/etc/ansible/ansible.cfg

既然Ansible服务是用于实现主机批量自动化控制的管理工具,受管的主机一定不是一两台台,而是数十台甚至成百上千台,那么主机清单(inventory)在生产环境中就可以帮上大忙了。用户可以把要管理的主机IP地址预先写入/etc/ansible/hosts文件,这样后续再通过执行ansible命令来执行任务时就自动包含这些主机了,也就不需要每次都重复输入受管主机的地址了。例如,要管理5台主机,对应的IP地址如表16-3所示。

表16-3 受管主机信息

操作系统

IP地址

功能用途

RHEL 8

192.168.10.20

dev

RHEL 8

192.168.10.21

test

RHEL 8

192.168.10.22

prod

RHEL 8

192.168.10.23

prod

RHEL 8

192.168.10.24

balancers

首先需要说明的是,受管主机的系统默认使用RHEL 8,这是为了避免大家在准备实验机阶段产生歧义而给出的建议值,也可以用其他Linux系统。主机清单文件/etc/ansible/hosts中默认存在大量的注释信息,建议全部删除,然后替换成实验信息。


[root@localhost ~]# vim /etc/ansible/hosts
192.168.10.20
192.168.10.21
192.168.10.22
192.168.10.23
192.168.10.24


为了增加实验难度,“通吃”生产环境中的常见需求,我们又为这5台主机分别规划了功能用途,有开发机(dev)、测试机(test)、产品机(prod)(两台)和负载均衡机(balancers)。在对主机进行分组标注后,后期在管理时就方便多了。


[root@localhost ~]# vim /etc/ansible/hosts
[dev]
192.168.10.20
[test]
192.168.10.21
[prod]
192.168.10.22
192.168.10.23
[balancers]
192.168.10.24

主机清单文件在修改后会立即生效,一般使用“ansible-inventory --graph”命令以结构化的方式显示出受管主机的信息。因为我们对受管主机进行了分组,因此这种方式非常便于我们的阅读。


[root@localhost ~]# ansible-inventory --graph
@all:
  |--@balancers:
  |  |--192.168.10.24
  |--@dev:
  |  |--192.168.10.20
  |--@prod:
  |  |--192.168.10.22
  |  |--192.168.10.23
  |--@test:
  |  |--192.168.10.21
  |--@ungrouped:


等等!先不要着急开始后面的实验。前文讲过,Ansible服务是基于SSH协议进行自动化控制的,这是开展后面实验的前提条件。曾经讲到,sshd服务在初次连接时会要求用户接受一次对方主机的指纹信息。准备输入受管主机的账号和密码。例如,正常的第一次SSH远程连接过程是这样的:


[root@localhost ~]# ssh 192.168.10.10
The authenticity of host '192.168.10.10 (192.168.10.10)' can't be established.
ECDSA key fingerprint is SHA256:QRW1wrqdwN0PI2bsUvBlW5XOIpBjE+ujCB8yiCqjMQQ.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.10.10' (ECDSA) to the list of known hosts.
root@192.168.10.10's password: 此处应输入管理员密码后回车确认
Activate the web console with: systemctl enable --now cockpit.socket

Last login: Mon Mar 29 06:30:15 2021
[root@localhost ~]#


众所周知,自动化运维的一个好处就是能提高工作效率。但是,如果每次执行操作都要输入受管主机的密码,也是比较麻烦的事情。好在Ansible服务已经对此有了解决办法,那就是使用如表16-4所示的变量。

表16-4 Ansible常用变量汇总

参数

作用

ansible_ssh_host

受管主机名

ansible_ssh_port

端口号

ansible_ssh_user

默认账号

ansible_ssh_pass

默认密码

ansible_shell_type

Shell终端类型

用户只需要将对应的变量及信息填写到主机清单文件中,在执行任务时便会自动对账号和密码进行匹配,而不用每次重复输入它们。继续修改主机清单文件:


[root@localhost ~]# vim /etc/ansible/hosts
[dev]
192.168.10.20
[test]
192.168.10.21
[prod]
192.168.10.22
192.168.10.23
[balancers]
192.168.10.24
[all:vars]
ansible_user=root
ansible_password=123456


还剩最后一步。将Ansible主配置文件中的第71行设置成默认不需要SSH协议的指纹验证,以及将第107行设置成默认执行剧本时所使用的管理员名称为root:


[root@localhost ~]# vim /etc/ansible/ansible.cfg
69
70 # uncomment this to disable SSH key host checking
71 host_key_checking = False
72
………………省略部分输出信息………………
104
105 # default user to use for playbooks if user is not specified
106 # (/usr/bin/ansible will use current user as default)
107 remote_user = root
108


不需要重启服务,在以上操作完全搞定后就可以开始后面的实验了。在修改完成后自行在主机之间执行ping操作。保证主机之间的网络能够互通是后续实验的基石。