如果管理的服务器很多,如几十台甚至几百台,那么就需要一个自动化管理工具了,ansible就是这样的一种自动化管理工具。
ansible是通过ssh连接到被管理主机,然后执行相关操作的,如图28-1所示。
ansible主机通过ssh连接到被管理主机时,需要提前设置密钥登录,使得从ansible主机可以无密码登录到被管理主机。
(1)挂载镜像。
[root@RedHat ~]# mount /dev/cdrom /mnt
mount: /mnt: WARNING: device write-protected, mounted read-only.
[root@RedHat ~]#
(2)配置本地yum源。
root@RedHat ~]# cat /etc/yum.repos.d/aa.repo
[aa]
name=aa
baseurl=file:///mnt/AppStream
enabled=1
gpgcheck=0
[bb]
name=bb
baseurl=file:///mnt/BaseOS
enabled=1
gpgcheck=0
[root@RedHat ~]#
(3)使用root用户登录RedHat,在其上配置epel源,命令如下。
[root@RedHat ~]# yum -y install https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
[root@RedHat ~]# sed -i 's|^#baseurl=https://download.fedoraproject.org/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
[root@RedHat ~]# sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*
[root@RedHat ~]#
(4)安装开发工具。
[root@RedHat ~]# yum -y groupinstall 开发工具
RHEL8默认的Python版本为3.6,不符合项目的需求。现在升级到3.12.1。
(5)下载Python3.12.1。
[root@RedHat ~]# wget https://www.python.org/ftp/python/3.12.1/Python-3.12.1.tgz
[root@RedHat ~]# tar -zxvf Python-3.12.1.tgz
(6)安装必须的包。
[root@RedHat yum.repos.d]# dnf -y install gcc zlib* libffi-devel
(7)安装Python。
[root@RedHat ~]# cd Python-3.12.1/
[root@RedHat Python-3.12.1]# ./configure --prefix=/usr/local/python3 --enable-optimizations
[root@RedHat Python-3.12.1]# make
[root@RedHat Python-3.12.1]# make install
(8)删除原先的Python3和pip3。
root@RedHat ~]# rm -rf /usr/bin/python3
[root@RedHat ~]# ln -s /usr/local/python3/bin/python3 /usr/bin/python3
[root@RedHat ~]# rm -rf /usr/bin/pip3
[root@RedHat ~]# ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
[root@RedHat ~]#
(9)查看Python3和Pip3是否正确的被安装。
[root@RedHat ~]# python3 --version
Python 3.12.1
[root@RedHat ~]# pip3 --version
pip 23.2.1 from /usr/local/python3/lib/python3.12/site-packages/pip (python 3.12)
[root@RedHat ~]#
[root@RedHat ~]# rpm -ivh ansible-2.9.11-1.el8ae.noarch.rpm
错误:依赖检测失败:
python3-cryptography 被 ansible-2.9.11-1.el8ae.noarch 需要
python3-jinja2 被 ansible-2.9.11-1.el8ae.noarch 需要
sshpass 被 ansible-2.9.11-1.el8ae.noarch 需要
[root@RedHat ~]#
需要解决依赖包问题,前面两个使用本地yum源就可以解决了。
#安装依赖
[root@RedHat ~]# yum -y install python3-cryptography
[root@RedHat ~]# yum -y install python3-jinja2
[root@RedHat ~]# rpm -ivh sshpass-1.06-3.el8ae.x86_64.rpm
#再次安装ansible。
[root@RedHat ~]# rpm -ivh sshpass-1.06-3.el8ae.x86_64.rpm
#使用命令检查ansible的安装结果。
[root@RedHat ~]# ansible --version
[root@RedHat ~]# pip3 --version
这里安装的ansible的版本是2.9.11,同时也显示ansible的默认配置是etc/ansible/ansible.cfgo还要确保ansible主机能够解析所有的被管理机器,这里通过配置/etc/hosts来实现,etc/hosts的内容如下。
[root@RedHat ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.56.11 RedHat
192.168.56.12 RedHat2
192.168.56.13 RedHat3
[root@RedHat ~]#
在RedHat2和RedHat3两台机器上确认已经创建好了tom用户,如果没有请自行创建,然后配置好sudo,命令如下。
RedHat2:
[root@RedHat2 ~]# cat /etc/sudoers.d/tom
tom ALL=(root) NOPASSWD: ALL
[root@RedHat2 ~]#
RedHat3:
[root@RedHat3 ~]# cat /etc/sudoers.d/tom
tom ALL=(root) NOPASSWD: ALL
[root@RedHat3 ~]#
这样在两台机器上,tom用户通过sudo -i可以无密码切换到root用户。
使用tom用户登录RedHat,配置好ssh密钥登录,使得tom用户可以无密码登录到RedHat2和RedHat3,命令如下。
[tom@RedHat ~]$ ssh-keygen -f ~/.ssh/id_rsa -N "" #生成密钥
[tom@RedHat ~]$ ssh-copy-id [email protected] #把密钥发送给56.12主机
[tom@RedHat ~]$ ssh-copy-id [email protected] #把密钥发送给56.13主机
[tom@RedHat ~]$ ssh RedHat2 #登录
执行ansible或ansible-playbook命令时,优先使用当前目录中ansible.cfg的配置。如果当前目录中没有,则使用默认的/etc/ansible.cfg中的配置。
下面的操作都是RedHat上的tom用户操作的,先在家目录下创建ansible.cfg,内容如下。
[tom@RedHat ~]$ cat ansible.cfg
[defaults]
inventory = ./hosts
[privilege_escalation]
become=True
become_method=sudo
become_user=root
[tom@RedHat ~]$
这里在[defaults]字段下只添加了一句inventory = ./hosts,表示把当前目录下名称为hosts的文件当作清单文件。
在[privilege_escalation]字段下定义了如何提升权限,因为是使用lduan用户登录到被管理主机的,所以需要提升权限。这个字段下写了3条,分别如下。
这三句的意思是,当用ssh登录到被管理主机时,以sudo的方式切换到root,这也是为什么一开始要在被管理主机上配置好sudo的原因。
所有的被管理机器都要写入清单文件中。在实验环境中有两台被管理主机,那么分别写在
hosts中,内容如下。
[tom@RedHat ~]$ cat hosts
RedHat2
RedHat3
[tom@RedHat ~]$
这里一行一台主机,我们在使用ansible或ansible-playbook命令时,指定的主机名必须是这个名称才行。要确保能解析RedHat2和RedHat3,写成相应的IP也可以。
如果环境中被管理的主机很多,把主机一台台地写进去太冗繁,所以可以改成如下写法。
[tom@RedHat ~]$ cat hosts
RedHat2
RedHat3
RedHat[10:15]
[tom@RedHat ~]$
这里加了一行RedHat[10:15],表示RedHat10到RedHat15,这样在清单文件中就写了8台主机(需要注意的是,在我们的练习环境中RedHat10到RedHat15不存在)。
如果在执行ansible命令时只是想在部分主机上执行,那么在清单文件中可以对主机进行分组。定义主机组时,组名写在中括号“[]”中,在[下面写的主机名都属于这个组,直到定义下一个组的位置为止,修改清单文件的内容如下。
[tom@RedHat ~]$ cat hosts
RedHat2
RedHat3
RedHat[10:15]
[db1]
RedHat[2:5]
[db2]
RedHat6
RedHat7
[tom@RedHat ~]$
这里定义了两个主机组db1和db2,db1组中包括的主机有RedHat2到RedHat5,db2组中包
括的主机有RedHat6和RedHat7。
如果想定义一个主机组,这个组中包括db1和db2两个主机组的主机,可以用children关键字,修改hosts的内容如下。
[tom@RedHat ~]$ cat hosts
RedHat2
RedHat3
RedHat[10:15]
[db1]
RedHat[2:5]
[db2]
RedHat6
RedHat7
[db3:children]
db1
db2
[tom@RedHat ~]$
这里定义了一个主机组db3,但是后面加了“:children”,则这个主机组下面的db1和db2就不再表示主机了,而是表示主机组。所以,db3这个主机组中所包括的主机是RedHat2到RedHat5以及RedHat6和RedHat7这6台主机。
下面查看每个主机组中有多少主机。首先查看主机组db1中的主机,命令如下。
[tom@RedHat ~]$ ansible db1 --list-hosts
hosts (4):
RedHat2
RedHat3
RedHat4
RedHat5
[tom@RedHat ~]$
可以看到共4台主机,然后查看主机组db2中的主机,命令如下。
[tom@RedHat ~]$ ansible db2 --list-hosts
hosts (2):
RedHat6
RedHat7
[tom@RedHat ~]$
可以看到共2台主机,然后查看主机组 db3中的主机,命令如下。
[tom@RedHat ~]$ ansible db3 --list-hosts
hosts (6):
RedHat2
RedHat3
RedHat4
RedHat5
RedHat6
RedHat7
[tom@RedHat ~]$
共6台主机,与分析的是一样的。还有一个内置主机组叫作all,表示所有主机。了解了清单文件的写法之后,最终把清单文件写成如下内容。
[tom@RedHat ~]$ cat hosts
RedHat2
RedHat3
[db]
RedHat2
RedHat3
[tom@RedHat ~]$
这里就包括了一个主机组db,里面含有RedHat2和RedHat3。