在初次使用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操作。保证主机之间的网络能够互通是后续实验的基石。