2020-03-16 Ansible批量管理方式

利用Ansible批量远程管理主机有两种方式,一个是传统的密码认证的管理方式;另一个是利用密钥的管理方式,即前面SSHD服务的方式。在分别介绍这两种方式前,先准备基础环境如下,编写最简单的Ansible被管理主机列表清单:

[root@m01 ~]# cp /etc/ansible/hosts{,.ori}
[root@m01 ~]# >/etc/ansible/hosts
[root@m01 ~]# vim /etc/ansible/hosts
[oldboy]    ---组名,用中括号括起来,组里是被管理的远程主机IP
192.168.9.6
192.168.9.5
[oldgirl]    ---这里是前面SSHD项目做过免密码认证的一组机器
192.168.9.7
192.168.9.9
说明:先简单列表IP,后面再详细讲解这个hosts文件。

1. 通过SSH密码认证方式批量管理主机

Ansible是利用本地的SSH及一些远程SSH服务作为客户端管理主机的,由于客户端SSH服务默认就是开启状态,因此不需要单独进行部署配置,直接利用远程主机的SSH服务即可实现批量管理。
1)执行ansible命令进行批量远程管理。

[root@m01 ~]# ansible oldboy -m command -a "cat /etc/redhat-release" -k -u root    ---执行远程管理命令
---利用ansible命令,指定批量管理oldboy组中主机,利用-m指定模块,-a指定执行的命令,-u指定以什么身份远程登录
--- -k采用密码方式登录
SSH password:     ---输入root密码
192.168.9.6 | FAILED | rc=-1 >>
Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this.  Please add this host's fingerprint to your known_hosts file to manage this host.
192.168.9.5 | SUCCESS | rc=0 >>
CentOS Linux release 7.6.1810 (Core)

注意:该操作需要管理机本地存放了目标机器的密钥文件才能正常执行,不然会报错。所以上面192.168.9.6报错了。

[root@m01 ~]# cat .ssh/known_hosts     ---检查管理机本地存放密钥文件,只有5/7/9,没有6。
192.168.9.5 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBHQknKE6wRYzrnZIF4reI0HyIthWvj/Ffm3LOY8UeXqs+gP203FizDnUbRy+OLIg9TpUUY8F3/9h207o3Xufeb4=
192.168.9.7 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBHQknKE6wRYzrnZIF4reI0HyIthWvj/Ffm3LOY8UeXqs+gP203FizDnUbRy+OLIg9TpUUY8F3/9h207o3Xufeb4=
192.168.9.9 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBHQknKE6wRYzrnZIF4reI0HyIthWvj/Ffm3LOY8UeXqs+gP203FizDnUbRy+OLIg9TpUUY8F3/9h207o3Xufeb4=

[root@m01 ~]# ssh 192.168.9.6 cat /etc/redhat-release     ---手动访问6,生成密钥文件
The authenticity of host '192.168.9.6 (192.168.9.6)' can't be established.
ECDSA key fingerprint is SHA256:lpAQ77XAqJ/27nex4tZvKv8y9craDayqf12ZB9V3QKk.
ECDSA key fingerprint is MD5:c8:94:09:a2:27:8b:92:6f:b7:60:fc:94:bd:f9:14:88.
Are you sure you want to continue connecting (yes/no)? yes    ---输入yes
Warning: Permanently added '192.168.9.6' (ECDSA) to the list of known hosts.
[email protected]'s password:     ---输入root密码
CentOS Linux release 7.6.1810 (Core)
[root@m01 ~]# tail -1 .ssh/known_hosts     ---重新检查一遍,已经多了6
192.168.9.6 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBHQknKE6wRYzrnZIF4reI0HyIthWvj/Ffm3LOY8UeXqs+gP203FizDnUbRy+OLIg9TpUUY8F3/9h207o3Xufeb4=

2)重新执行测试。

[root@m01 ~]# ansible oldboy -m command -a "cat /etc/redhat-release" -k -u root
SSH password: 
192.168.9.5 | SUCCESS | rc=0 >>
CentOS Linux release 7.6.1810 (Core) 
192.168.9.6 | SUCCESS | rc=0 >>
CentOS Linux release 7.6.1810 (Core) 

3)配置不用输入密码进行批量管理。
每次执行ansible命令都要输入root用户的密码,如果不同主机的密码不一致,就要输入很多次,其实是可以解决的,可以在/etc/ansible/hosts主机列表文件中添加指定配置参数信息,实现远程管理主机的效果,主机列表文件中常见配置参数如下表所示:

Ansible主机列表文件参数信息

根据以上配置参数信息进行配置参数实践练习。
Ansible软件服务使用的前提是SSH+Key免密码认证环境部署完毕,而在没有部署SSH+Key的环境下,如果同样想用Ansible,还可以用一下方式配置hosts文件,实现Ansible批量不需要输入密码管理功能。

[root@m01 ~]# cat /etc/ansible/hosts
[oldboy]
192.168.9.6 ansible_ssh_user=root ansible_ssh_pass=123456    ---在主机配置文件里指定用户和密码,执行命令时就不需要密码了
192.168.9.5 ansible_ssh_user=root ansible_ssh_pass=123456
[oldgirl]
192.168.9.7
192.168.9.9
# 说明:
1)后面的用户和密码项是非必须的,在配置免密码Key认证的情况下,不使用密码参数也可以进行批量管理。
2)未配置免密码Key认证的情况下,要么通过-k参数在操作命令前询问手动输入密码,或者按照上述配置将密码加入主机配置文件里。
[root@m01 ~]# ansible oldboy -m command -a "cat /etc/redhat-release"    ---去掉-k -u root参数
192.168.9.6 | SUCCESS | rc=0 >>
CentOS Linux release 7.6.1810 (Core) 
192.168.9.5 | SUCCESS | rc=0 >>
CentOS Linux release 7.6.1810 (Core)

这才是我们想要的不输入密码批量管理远程主机的方式。采用SSH密码认证方式批量管理是值得推荐的Ansible批量管理方式之一,另一种管理方式就是利用免密码认证(事先配置密钥)的方式进行批量管理。

2. 通过SSH密钥方式进行批量管理

前面的批量管理方式利用Ansible进行管理时,还需要输入SSH登录密码信息,或者在hosts文件中配置用户和密码参数信息,看起来初始管理略微复杂了点,其实还可以利用SSH免密钥方式实现批量管理。
1)创建SSH密钥对信息。

[root@m01 ~]# ssh-keygen -f /root/.ssh/id_rsa -P "" >/dev/null 2>&1
# 说明:利用ssh-keygen命令参数实现免密交互创建密钥对
-f    ---表示指定将密钥文件创建在什么路径下
-P/-N    ---表示指定密钥文件的密码信息是什么,此处设置为空
-q    ---表示创建的密码结果信息不用输出,等价于追加到空(>/dev/null 2>&1)
[root@m01 ~]# ll .ssh/
总用量 12
-rw-------  1 root root 1679 3月  14 12:48 id_rsa    ---生成的私钥
-rw-r--r--  1 root root  390 3月  14 12:48 id_rsa.pub    ---生成的公钥

2)采用非交互方式分发公钥信息,将SSH服务创建的公钥信息分发到被管理主机。

sshpass -p123456 ssh-copy-id -f -i ~/.ssh/id_rsa.pub "-o StrictHostKeyChecking=no" 192.168.9.5
sshpass -p123456 ssh-copy-id -f -i ~/.ssh/id_rsa.pub "-o StrictHostKeyChecking=no" 192.168.9.6
说明:采用非交互方式分发公钥需借助命令sshpass指定SSH密码信息,利用-o StrictHostKeyChecking=no参数信息,跳过SSH连接确认信息

3)如果机器很多,可以编写分发公钥脚本文件实现批量分发公钥。

[root@m01 ~]# cat /server/scripts/dis.sh 
#!/bin/bash
rm -f ~/.ssh/id_rsa*
ssh-keygen -f ~/.ssh/id_rsa -p "" >/dev/null 2>&1
SSH_Pass=123456
Key_Path=~/.ssh/id_rsa.pub
for ip in 5 6 7 9
do
    sshpass -p$SSH_Pass ssh-copy-id -i $Key_Path "-o StrictHostKeyChecking=no" 192.168.9.$ip
done
说明:此脚本已经实现了以批量免交互方式进行分发公钥,如果有新增主机需要对脚本文件进行修改。

4)编写Ansible被管理主机列表清单(本次未改动)。

[root@m01 ~]# cat /etc/ansible/hosts
[oldboy]
192.168.9.6 ansible_ssh_user=root ansible_ssh_pass=123456
192.168.9.5 ansible_ssh_user=root ansible_ssh_pass=123456
[oldgirl]
192.168.9.7
192.168.9.9

5)利用Ansible管理命令进行批量管理

[root@m01 ~]# ansible oldgirl -m command -a "cat /etc/redhat-release"    ---针对oldgirl组名进行操作
192.168.9.7 | SUCCESS | rc=0 >>
CentOS Linux release 7.6.1810 (Core) 
192.168.9.9 | SUCCESS | rc=0 >>
CentOS Linux release 7.6.1810 (Core) 

[root@m01 ~]# ansible oldboy -m command -a "cat /etc/redhat-release"    ---针对oldboy组名进行操作
192.168.9.5 | SUCCESS | rc=0 >>
CentOS Linux release 7.6.1810 (Core) 
192.168.9.6 | SUCCESS | rc=0 >>
CentOS Linux release 7.6.1810 (Core)

实际企业生产中,只需选择其中一种管理方式即可,不要同时选择两种方式,如果安全性要求严格,采用普通用户管理,然后再提权也是可以的。从主机之间安全性要求上考虑,密码认证的方式更安全一些,大多数中小企业更倾向于选择密钥的方式来管理,这样对管理机本身的安全性要求就很高了。管理机最好禁止SSH远程连接,通过拨号VPN后再登录管理机才能进行连接。总之,要加强管理机的安全,否则管理机一旦被黑客控制,将是一个灾难。

你可能感兴趣的:(2020-03-16 Ansible批量管理方式)