如果管理的服务器很多,如几十台甚至几百台,那么就需要一个自动化管理工具了,ansible就是这样的一种自动化管理工具。
ansible是通过ssh连接到被管理主机,然后执行相关操作的,如下图所示。
ansible主机通过ssh连接到被管理主机时,需要提前设置密钥登录,使得从ansible主机可以无密码登录到被管理主机。
先使用root用户登录server,在其上配置epel源
[root@RHEL ~]# yum -y install https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
[root@RHEL ~]# sed -i 's|^#baseurl=https://download.fedoraproject.org/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
[root@RHEL ~]# sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*
挂载镜像
[root@RHEL ~]# mount /dev/cdrom /mnt/
配置本地yum源
[root@RHEL ~]# cat /etc/yum.repos.d/jiayi.repo
[jiayi]
name=jiayi
baseurl=file:///mnt/AppStream
enabled=1
gpgcheck=0
[jia]
name=jia
baseurl=file:///mnt/BaseOS
enabled=1
gpgcheck=0
安装开发工具
yum ‐y groupinstall 开发工具
下载Python3.9.5
[root@RHEL ~]# ls
公共 视频 文档 音乐 anaconda-ks.cfg
模板 图片 下载 桌面 Python-3.11.7.tgz
安装必须的包
[root@RHEL ~]# dnf -y install gcc zlib* libffi-devel
安装Python
[root@RHEL Python-3.11.7]# ./configure --prefix=/usr/local/python3 --enable-optimizations
[root@RHEL Python-3.11.7]# make
[root@RHEL Python-3.11.7]# make install
删除原先的Python3和pip3
[root@RHEL Python-3.11.7]# rm -rf /usr/bin/python3
[root@RHEL Python-3.11.7]# ln -s /usr/local/python3/bin/python3 /usr/bin/python3
[root@RHEL Python-3.11.7]# rm -rf /usr/bin/pip3
[root@RHEL Python-3.11.7]# ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
查看Python3和Pip3是否正确的被安装
[root@RHEL ~]# python3 --version
Python 3.11.7
[root@RHEL ~]# pip3 --version
pip 23.2.1 from /usr/local/python3/lib/python3.11/site-packages/pip (python 3.11)
安装ansible
[root@RHEL ~]# rpm -ivh ansible-2.9.11-1.el8ae.noarch.rpm
警告:ansible-2.9.11-1.el8ae.noarch.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID fd431d51: NOKEY
错误:依赖检测失败:
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 需要
需要解决依赖包问题
前面两个使用本地yum源就可以解决了
安装以上依赖
[root@RHEL ~]# yum -y install python3-cryptography
[root@RHEL ~]# yum -y install python3-jinja2
[root@RHEL ~]# rpm -ivh sshpass-1.06-3.el8ae.x86_64.rpm
再次安装ansible
[root@RHEL ~]# ansible --version
ansible 2.9.11
config file = /etc/ansible/ansible.cfg
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3.6/site-packages/ansible
executable location = /usr/bin/ansible
python version = 3.6.8 (default, Sep 9 2021, 07:49:02) [GCC 8.5.0 20210514 (Red Hat 8.5.0-3)]
使用命令检查ansible的安装结果
[root@RHEL ~]# ansible --version
ansible 2.9.11
config file = /etc/ansible/ansible.cfg
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3.6/site-packages/ansible
executable location = /usr/bin/ansible
python version = 3.6.8 (default, Sep 9 2021, 07:49:02) [GCC 8.5.0 20210514 (Red Hat 8.5.0-3)]
[root@RHEL ~]# pip3 --version
pip 23.2.1 from /usr/local/python3/lib/python3.11/site-packages/pip (python 3.11)
这里安装的ansible的版本是2.9.11,同时也显示ansible的默认配置是letc/ansible/ansible.cfgo还要确保ansible主机能够解析所有的被管理机器,这里通过配置/etc/hosts 来实现,/etchosts的内容如下。
[root@RHEL ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.10.10 RHEL
192.168.10.20 RHEL2
192.168.10.30 RHEL3
在RHEL2和RHEL3两台机器上确认已经创建好jiayi用户,如果没有请自行创建,然后配置好sudo
[root@RHEL2 ~]# cat /etc/sudoers.d/jiayi
jiayi ALL=(root) NOPASSWD: ALL
[root@RHEL3 ~]# cat /etc/sudoers.d/jiayi
jiayi ALL=(root) NOPASSWD: ALL
这样在这两台机器上,jiayi用户通过sudo-i可以无密码切换到root用户。
ssh2、3号(自己配置密钥无密码连接RHEL2、3)
[root@RHEL ~]# ssh RHEL2
Last login: Tue Dec 19 22:04:28 2023 from 192.168.10.10
[root@RHEL2 ~]# exit
注销
Connection to rhel2 closed.
[root@RHEL ~]# ssh RHEL3
Activate the web console with: systemctl enable --now cockpit.socket
This system is not registered to Red Hat Insights. See https://cloud.redhat.com/
To register this system, run: insights-client --register
Last login: Wed Dec 20 11:04:28 2023 from 192.168.10.10
[root@RHEL3 ~]# exit
注销
Connection to rhel3 closed.
执行ansible或ansible-playbook命令时,优先使用当前目录中ansible.cfg的配置。如果当前目录中没有,则使用默认的/etc/ansible.cfg中的配置。
先在家目录下创建ansible.cfg,内容如下
[root@RHEL ~]# cat ansible.cfg
[defaults]
inventory = ./hosts
[privilege_escalation]
become=True
become_method=sudo
become_user=root
这里在[defaults]字段下只添加了一句inventory = ./hosts,表示把当前目录下名称为hosts的文件当作清单文件。
在 [privilege_escalation]字段下定义了如何提升权限,因为是使用lduan用户登录到被管理主机的,所以需要提升权限。这个字段下写了3条
(1)become=True:登录到被管理主机时要切换到其他用户。
(2)become_method=sudo:以 sudo的方式切换。
(3)become_user-root :切换到root用户。
这三句的意思是,当用ssh登录到被管理主机时,以 sudo的方式切换到root,这也是为什么一开始要在被管理主机上配置好sudo的原因。
所有的被管理机器都要写入清单文件中。在实验环境中有两台被管理主机,那么分别写在hosts中
[root@RHEL ~]# cat hosts
RHEL2
RHEL3
如果环境中被管理的主机很多,把主机一台台地写进去太冗繁,所以可以改成如下写法
[root@RHEL ~]# cat hosts
RHEL2
RHEL3
RHEL[10:15]
[db1]
RHEL[2:5]
[db2]
RHEL6
RHEL7
[db3:children]
db1
db2
这里加了一行RHEL[10:15],表示 RHEL10到RHEL15,这样在清单文件中就写了8台主机
定义了两个主机组db1和db2,db1组中包括的主机有RHEL2到RHEL5,db2组中包括的主机有RHEL6和RHEL7
定义了一个主机组db3,但是后面加了“:children",则这个主机组下面的db1和db2就不再表示主机了,而是表示主机组。所以,db3这个主机组中所包括的主机是RHEL2到RHEL5及RHEL6和RHEL7这6台主机
下面查看每个主机组中有多少主机。首先查看主机组db1中的主机
[root@RHEL ~]# ansible db1 --list-hosts
hosts (4):
RHEL2
RHEL3
RHEL4
RHEL5
共4台主机。
查看主机组db2中的主机
[root@RHEL ~]# ansible db2 --list-hosts
hosts (2):
RHEL6
RHEL7
共2台主机。
查看主机组 db3中的主机
[root@RHEL ~]# ansible db3 --list-hosts
hosts (6):
RHEL2
RHEL3
RHEL4
RHEL5
RHEL6
RHEL7
共6台主机,与分析的是一样的。
还有一个内置主机组叫作all,表示所有主机。
了解了清单文件的写法之后,最终把清单文件写成如下内容。
[root@RHEL ~]# cat hosts
RHEL2
RHEL3
[db]
RHEL2
RHEL4