1.1 Ansible主机清单
在主机清单中,Ansible将所有机器分成不同的组并定义不同的组名,运行命令时只需要指定特定的组名就能达到批量操作的目的。下面将从六个方面对Ansible的主机清单作具体讲解。
1.1.1 设置主机组
在Ansible的hosts文件中可以增删主机/主机组,下面将之前配置的主机清单进行修改,具体代码如下所示。
[root@ansible ~]# vim /etc/ansible/hosts
[root@ansible ~]# cat /etc/ansible/hosts
[webserver]
host1
host2
host3
host4
上述示例中,定义了一个“webserver”组,并将客户机host1、host2、host3与host4都添加到webserver组中。使用Ansible测试webserver组中,具体代码如下所示。
[root@ansible ~]# ansible webserver -m ping -u root -k -o
SSH password:
host4 | UNREACHABLE!: Failed to connect to the host via ssh: ssh: Could not resolve hostname host4: Name or service not known
host1 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
host2 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
host3 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
通过代码可以看到,Ansible服务器只需要通过指定主机清单中的组名即可对组中所有客户机进行操作。本次案例只配置了三台主机,并不存在host4,故host4的反馈结果为不可达。
1.1.2 设置用户名/密码
在Ansible的hosts文件中除了定义主机及主机组外,还可以设置被控主机的SSH用户及密码。在没有配置免密登录的状况下,将客户机的信息写入主机清单,即可实现免密连接。首先在Ansible服务器中删除密钥,具体代码如下所示。
[root@ansible ~]# ls -a
. .ansible .bash_profile init1.sh .tcshrc
.. .bash_history .bashrc .pki .viminfo
anaconda-ks.cfg .bash_logout .cshrc .ssh
[root@ansible ~]# ls .ssh
id_rsa id_rsa.pub known_hosts
[root@ansible ~]# rm -rf .ssh/id_rsa .ssh/id_rsa.pub
删除Ansible服务器中的密钥之后,新定义一个webservers组,代码如下所示。
[root@ansible ~]# vim /etc/ansible/hosts
[root@ansible ~]# cat /etc/ansible/hosts
[webserver]
host1
host2
host3
host4
[webservers]
host1
host2
host3
接下来尝试连接webservers组,具体代码如下所示。
[root@ansible ~]# ansible webservers -m ping
host2 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: ssh: connect to host host2 port 22: Connection refused",
"unreachable": true
}
host3 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).",
"unreachable": true
}
host1 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).",
"unreachable": true
}
通过代码的反馈结果可以看到,删除密钥之后Ansible服务器便无法连接客户机。接着给主机清单中配置客户机的用户与密码,具体代码如下所示。
[root@ansible ~]# vim /etc/ansible/hosts
[root@ansible ~]# cat /etc/ansible/hosts
[webserver]
host1
host2
host3
host4
[webservers]
#注意,这里的用户名与密码以自己的为准,此处使用的是作者的用户名及密码,仅供参考。
host[1:3] ansible_ssh_user='root' ansible_ssh_pass='f'
再次尝试连接客户机,具体代码如下所示。
[root@ansible ~]# ansible webservers -m ping -o
host2 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
host3 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
host1 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
通过代码可以看到,在主机清单中配置了用户名与密码的客户机能够被Ansible服务器自动连接。当拥有多个客户机时,则需要在主机清单中的每个客户机都添加用户名与密码。此处只添加了一条用户信息,这样做的前提是3台客户机的用户名与密码都是相同的。若客户机的登录用户及密码不同,则需要单独设置。
1.1.3 设置端口
当Ansible用ping模块去ping客户机的SSH连接状态时,使用的是SSH协议的默认端口。通常,在企业中为了网站的安全性,会修改一些协议的默认端口,如此一来,Ansible便无法通过默认端口连接客户机。解决的办法也很简单,将修改后的端口写入配置文件即可,示例如下所示。
修改hoost1的SSH端口为2222,具体代码如下所示。
[root@host1 ~]# vim /etc/ssh/sshd_config
大概在第十八行左右
#Port 22
Port 2222
修改完成后,在host1客户机中重启SSH服务,代码如下所示。
[root@host1 ~]# systemctl restart sshd
接着,使用Ansible服务器去连接webservers组,代码及结果如下所示。
[root@ansible ~]# ansible webservers -m ping -o
host1 | UNREACHABLE!: Failed to connect to the host via ssh: ssh: connect to host host1 port 22: Connection refused
host3 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
host2 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
通过代码的反馈结果可以看到,客户机host1的SSH服务端口被修改之后便无法被Ansible服务器连接,而未做修改的host2及host3连接正常。在主机清单中单独修改werversers组下host1的SSH端口信息,具体代码如下所示。
[root@ansible ~]# vim /etc/ansible/hosts
[root@ansible ~]# cat /etc/ansible/hosts
[webserver]
host1
host2
host3
host4
[webservers]
host1 ansible_ssh_user='root' ansible_ssh_pass='f' ansible_ssh_port='2222'
host[2:3] ansible_ssh_user='root' ansible_ssh_pass='f'
修改完成之后,再次尝试连接webservers,结果如下所示。
[root@ansible ~]# ansible webservers -m ping -o
host2 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
host1 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
host3 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
通过代码的反馈结果可以看到,所有客户机都可正常被连接。操作完成后,将host1的端口恢复到默认状态,以便进行后续知识点的学习。