1.1 Ansible的安装及部署
Ansible是一(机)对多(机)的操作,为了避免在操作过程中因不同机器间的授权问题导致Ansible一键部署失败,故实验开始前首先介绍不同服务器间的免密登录技术。
1.1.1 部署Ansible
Ansible是一对多的操作,这里使用一台Ansible服务器来控制3台从机的例子进行讲解。现在来部署实验环境,准备4台服务器,服务器角色及配置如表1.1所示。
表1.1 Ansible实验准备
服务器角色 | 应用配置 | IP地址 |
---|---|---|
Ansible服务器 | Ansible | 192.168.226.11 |
host1 | IP | 192.168.226.12 |
host2 | IP | 192.168.226.13 |
host3 | IP | 192.168.226.14 |
注意:本实验中所有服务器都需要提前关闭防火墙及SElinux。实验所需的环境准备完成后在Ansible服务器中做域名解析,具体代码如下所示。
[root@qfedu ~]# vim /etc/hosts
[root@qfedu ~]# tail -4 /etc/hosts
192.168.226.11 ansible
192.168.226.12 host1
192.168.226.13 host2
192.168.226.14 host3
在Ansible客户机上只需要设置好IP和YUM源即可,无需安装任何Ansible程序。为了方便读者观察实验效果,此处将各服务器的主机名修改为其对应角色,具体代码如下所示。
#192.168.226.11
[root@qfedu ~]# hostnamectl set-hostname ansible
#192.168.226.12
[root@qfedu ~]# hostnamectl set-hostname host1
#192.168.226.13
[root@qfedu ~]# hostnamectl set-hostname host2
#192.168.226.14
[root@qfedu ~]# hostnamectl set-hostname host3
2.安装Ansible
实验所需的环境准备完成后,接下来在Ansible控制机中安装Ansible。Ansible的安装依赖于EPEL仓库,因此在安装Ansible前需要安装EPEL源,具体代码如下所示。
[root@ansible ~]# yum -y install epel-release
已安装:
epel-release.noarch 0:7-11
完毕!
EPEL源安装完成之后,即可开始安装Ansible,具体代码如下所示。
[root@ansible ~]# yum -y install ansible
当出现如下提示时,即说明Ansible安装完成。
已安装:
ansible.noarch 0:2.9.10-1.el7
作为依赖被安装:
PyYAML.x86_64 0:3.10-11.el7
libyaml.x86_64 0:0.1.4-11.el7_0
······省略部分代码······
python-setuptools.noarch
0:0.9.8-7.el7 python-six.noarch 0:1.9.0-2.el7
python2-cryptography.x86_64
0:1.7.2-2.el7 python2-httplib2.noarch 0:0.18.1-3.el7
python2-jmespath.noarch
0:0.9.4-2.el7 python2-pyasn1.noarch 0:0.1.9-7.el7
sshpass.x86_64 0:1.06-2.el7
完毕!
3.初步使用Ansible
Ansible安装完成之后,可以通过命令查看及了解有关它的基本信息,此处给出几个示例以供参考。
l 列出Ansible的所有文件
[root@ansible ~]# rpm -ql ansible
/usr/share/man/man1/ansible-galaxy.1.gz
/usr/share/man/man1/ansible-inventory.1.gz
/usr/share/man/man1/ansible-playbook.1.gz
/usr/share/man/man1/ansible-pull.1.gz
/usr/share/man/man1/ansible-vault.1.gz
/usr/share/man/man1/ansible.1.gz
l 查看Ansible的配置文件
[root@ansible ~]# rpm -qc ansible
/etc/ansible/ansible.cfg
/etc/ansible/hosts
l 查看Ansible的所有模块
[root@ansible ~]# ansible-doc -l
fortios_router_community_list Configure community lists in Fortinet's For...
azure_rm_devtestlab_info Get Azure DevTest Lab facts
ecs_taskdefinition register a task definition in ecs
avi_alertscriptconfig Module for setup of AlertScriptConfig Avi R...
tower_receive Receive assets from Ansible Tower
netapp_e_iscsi_target NetApp E-Series manage iSCSI target configu...
azure_rm_acs Manage an Azure Container Service(ACS) inst...
fortios_log_syslogd2_filter Filters for remote system server in Fortine...
junos_rpc Runs an arbitrary RPC over NetConf on an Ju...
na_elementsw_vlan NetApp Element Software Manage VLAN
pn_ospf CLI command to add/remove ospf protocol to ...
pn_snmp_vacm CLI command to create/modify/delete snmp-va...
cp_mgmt_service_sctp Manages service-sctp objects on Check Point...
onyx_ospf Manage OSPF protocol on Mellanox ONYX netwo...
icx_command Run arbitrary commands on remote Ruckus ICX...
cs_snapshot_policy Manages volume snapshot policies on Apache ...
nxos_install_os Set boot options like boot, kickstart image...
cnos_static_route Manage static IP routes on Lenovo CNOS netw...
win_eventlog Manage Windows event logs
vmware_category Manage VMware categories
vmware_host_feature_info Gathers info about an ESXi host's feature c...
avi_cluster Module for setup of Cluster Avi RESTful Obj...
l 查看Ansible的版本号
通过命令查看当前Ansible的版本,具体代码及结果如下所示。
[root@ansible ~]# ansible --version
ansible 2.9.18
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
从代码的反馈结果可以看到,当前Ansible的版本是2.9.18。
1.1.2 免密登录
为了在用户使用SSH远程登陆时减少繁琐身份的验证操作,此处在各服务器中添加SSH密钥(私钥与公钥)进行免密登录配置。SSH通过加密算法生成一对密钥,默认采用RSA 2048位的加密方式。此处在Ansible主机生成密钥,并将公钥发送到各客户机来实现远程免密登录。
1.生成密钥
首先在Ansible主机通过命令生成密钥,具体代码如下所示。
[root@ansible ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:8ukjOhvlALDj/syAChOXvqV3VB12OJWJyVNbJUYeqPM root@qfedu
The key's randomart image is:
---[RSA 2048]----
|. . *o=*..|
| o X == o |
|o . o *. . |
|.. o . |
|..o . o.S o |
|o .o . E |
| o. o.. o |
|o.= o.o.. |
|. o=o= ... |
----[SHA256]-----
在生成密钥对过程中,系统会询问保存密钥的文件路径,这里直接按回车密钥会默认保存到/root/.ssh/目录下。接着输入两次密码,也可以是空密码,但必须两次输入密码一样。然后密钥会保存到指定文件路径中,并且显示最终生成的密钥。
2.发送密钥
密钥生成后,接着在Ansible服务器中将生成的密钥发送到另外的客户机,注意在命令结尾添加被控主机的IP地址,具体代码如下所示。
[root@ansible ~]# ssh-copy-id root@192.168.226.12
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.226.12 (192.168.226.12)' can't be established.
ECDSA key fingerprint is SHA256:NOq3/BJFu5pnnoFB0HH0a31KfFfU2uoZZ5xd8/U9ut0.
ECDSA key fingerprint is MD5:f1:9e:11:69:d3:39:d9:0e:4c:a9:21:e3:a9:79:b1:fc.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.226.12's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@192.168.226.12'"
and check to make sure that only the key(s) you wanted were added.
#再分别发送至另外两台主机,此处省略结果。
[root@ansible ~]# ssh-copy-id root@192.168.226.13
[root@ansible ~]# ssh-copy-id root@192.168.226.14
在首次发送的时候,系统会显示命令的文件路径与密钥的文件路径,并且在备份之前会对用户提示用户主机的真实性无法确定,询问是否继续连接目标主机。确定目标主机无误后,输入“yes”之后开始使用密码去连接该主机进行一系列的操作。
3.登录测试
发送完成后,通过Ansible登录已经建立免密登录的客户机,首先在host1主机上创建一个用于检测的文件或文件夹,代码如下所示。
[root@host1 ~]# mkdir host111
接下来使用Ansible登录host1进行测试,具体代码如下所示。
#登录客户机host1
[root@ansible ~]# ssh host1
Last login: Mon Dec 9 10:35:01 2019
[root@host1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:1a:2c:bf brd ff:ff:ff:ff:ff:ff
inet 192.168.226.12/24 brd 192.168.226.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::c083:b4f5:860e:1ce2/64 scope link noprefixroute
valid_lft forever preferred_lft forever
通过代码的反馈结果可以看到,Ansible主机直接自动登入了客户机。查看IP也为host1的IP,说明免密登录配置成功。操作完成后,输入exit便可以登出。
#退出客户机
[root@host1 ~]# exit
登出
Connection to host1 closed.
[root@ansible ~]#