Ansible的使用

如果管理的服务器很多,如几十台甚至几百台,那么就需要一个自动化管理工具了,
ansible就是这样的一种自动化管理工具 

ansible是通过ssh连接到被管理主机,然后执行相关操作的,如图28-1所示。 

ansible主机通过ssh连接到被管理主机时,需要提前设置密钥登录,使得从ansible主机
可以无密码登录到被管理主机。

 本实验的拓扑图如图28-2所示。  

这里server是 ansible主机,以root用户登录。server2和server3是被管理主机,在这两台主机上创建lduan 用户并配置好sudo,使得这两台主机上的lduan用户通过sudo-i可以无密码切换到root,下面开始配置。

1.安装ansible 

先使用root用户登录server,在其上配置epel源,命令如下。  

[root@RHEL813 ~]# yum -y install https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
正在更新 Subscription Management 软件仓库。
无法读取客户身份

本系统尚未在权利服务器中注册。可使用 subscription-manager 进行注册。

上次元数据过期检查:1 day, 16:50:15 前,执行于 2023年12月13日 星期三 04时02分57秒。
epel-release-latest-8.noarch.rpm                                                  158 kB/s |  25 kB     00:00    
依赖关系解决。
[root@RHEL813 ~]#sed -i's|^#baseurl=https://download.fedoraproject.org/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
[root@RHEL813 ~]# sed -i 's|^metalink|#metelink' /etc/yum.repos.d/epel*

在server上安装ansible,命令如下。  

步骤1、挂载镜像
操作:略
配置本地yum源
操作:略

安装开发工具

[root@RHEL813 ~]# yum -y groupinstall 开发工具
正在更新 Subscription Management 软件仓库。
无法读取客户身份

本系统尚未在权利服务器中注册。可使用 subscription-manager 进行注册。

Extra Packages for Enterprise Linux 8 - x86_64                                    497 kB/s |  16 MB     00:32    
上次元数据过期检查:0:00:20 前,执行于 2023年12月14日 星期四 21时00分57秒。
依赖关系解决。
==================================================================================================================
 软件包                     架构                      版本                       仓库                        大小
==================================================================================================================
安装组:
 Development Tools                                                                                               

事务概要

 # 下载Python3.9.5

[root@RHEL813 ~]# cd Python-3.10.6/
[root@RHEL813 Python-3.10.6]# ./configure --prefix=/usr/local/python3 --enable-optimizations
[root@RHEL813 Python-3.10.6]# make
[root@RHEL813 Python-3.10.6]# make install
删除原先的Python3和pip3
[root@RHEL813 ~]# rm -rf /usr/bin/python3
[root@RHEL813 ~]# ln -s /usr/local/python3/bin/python3 /usr/bin/python3
[root@RHEL813 ~]# rm -rf /usr/bin/pip3
[root@RHEL813 ~]# ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3

 查看Python3和Pip3是否正确的被安装:

[root@RHEL813 ~]# python3 --version
Python 3.10.6
[root@RHEL813 ~]# pip3 --version
pip 22.2.1 from /usr/local/python3/lib/python3.10/site-packages/pip (python 3.10)
[root@RHEL813 ~]# 

 第二步 安装ansible

警告:/var/tmp/rpm-tmp.uk5jjC: 头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 需要
[root@RHEL813 ~]# yum -y install python3-cryptography
[root@RHEL813 ~]# yum -y install python3-jinja2
需要解决依赖包问题
前面两个使用本地yum源就可以解决了

sshpass使用一个新的yum源,配置完新的yum源之后就可以进行安装了

[root@RHEL813 ~]# cat /etc/yum.repos.d/ansible.repo 
[ansible]
name=ansible
baseurl=http://47.108.86.156/rhel8/ansible29/ansible-2.9-for-rhel-8-x8
6_64-rpms/
gpgcheck=0
[root@RHEL813 ~]# 

 再次安装ansible

[root@RHEL813 ~]#rpm ‐ivh
http://47.108.86.156/rhel8/ansible29/ansible‐2.9‐for‐rhel‐8‐x86_64‐rpms/P
ackages/a/ansible‐2.9.11‐1.el8ae.noarch.rpm
使用命令检查ansible的安装结果
[root@RHEL813 ~]# 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@RHEL813 ~]# pip3 --version
pip 22.2.1 from /usr/local/python3/lib/python3.10/site-packages/pip (python 3.10)
这里安装的ansible的版本是2.9.11,同时也显示ansible的默认配置是 /etc/ansible/ansible.cfgo还要确保ansible主机能够解析所有的被管理机器,这里通过配置/etc/hosts 来实现,l/etchosts的内容如下
[root@RHEL813 ~]# cat /etc/hosts 
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.103.17		server.rhce.cc server
192.168.103.14          server2.rhce.cc server2
192.168.103.15          server3.rhce.cc server3	
[root@RHEL813 ~]# 
在server2和 server3两台机器上确认已经创建好了bdqn用户,如果没有请自行创建,然
后配置好sudo,命令如下。
[root@RHEL8 ~]# cat /etc/sudoers.d/bdqn 
bdqn ALL=(root) NOPASSWD:ALL
[root@RHEL8 ~]# 

[root@RHEL812 ~]# cat /etc/sudoers.d/bdqn 
bdqn ALL=(root) NOPASSWD:ALL
[root@RHEL812 ~]# 
这样在这两台机器上,bdqn 用户通过sudo -i可以无密码切换到root用户
使用blab 用户登录server,配置好ssh密钥登录(注:配置ssh密钥登录在之前的博客有专门描述),使得blab 用户可以无密码登录到
server2和 server3,命令如下
[bdqn@RHEL813 ~]$ ssh server2
Activate the web console with: systemctl enable --now cockpit.socket
[bdqn@RHEL8 ~]$ exit
[bdqn@RHEL813 ~]$ ssh server3
Activate the web console with: systemctl enable --now cockpit.socket
[bdqn@RHEL812 ~]$ 
[bdqn@RHEL812 ~]$ exit

 2.编写ansible.cfg和清单文件

执行ansible或ansible-playbook命令时,优先使用当前目录中ansible.cfg的配置。如果
当前目录中没有,则使用默认的/etc/ansible.cfg中的配置。

下面的操作都是server上的bdqn用户操作的,先在家目录下创建ansible.cfg,内容如下。 

[bdqn@RHEL813 ~]$ cat ansible.cfg 
[defaults]
inventory = ./hosts

[privilege_escalation]
become=True
become_method=sudo
become_user=root
[bdqn@RHEL813 ~]$ 
这里在[defaults]字段下只添加了一句inventory = ./hosts,表示把当前目录下名称为
hosts的文件当作清单文件
在 [privilege_escalation]字段下定义了如何提升权限,因为是使用bdqn用户登录到被管
理主机的,所以需要提升权限。这个字段下写了3条,分别如下

(1)become=True:登录到被管理主机时要切换到其他用户。
(2)become_method=sudo:以 sudo的方式切换。
(3)become_user-root :切换到root用户。

 

这三句的意思是,当用ssh登录到被管理主机时,以 sudo的方式切换到root,这也是为
什么一开始要在被管理主机上配置好sudo的原因

所有的被管理机器都要写入清单文件中。在实验环境中有两台被管理主机,那么分别写在hosts中,内容如下
[bdqn@RHEL813 ~]$ cat hosts
server2
server3
[bdqn@RHEL813 ~]$ 
这里一行一台主机,我们在使用ansible或ansible-playbook命令时,指定的主机名必须是这个名称才行。要确保能解析server2和server3,写成相应的IP也可以。

如果环境中被管理的主机很多,把主机一台台地写进去太冗繁,所以可以改成如下写法。 

[bdqn@RHEL813 ~]$ cat hosts
server2
server3
server[10:15]
[bdqn@RHEL813 ~]$ 
这里加了一行server[10:15],表示 server10到 server15,这样在清单文件中就写了8台主机(需要注意的是,在我们的练习环境中server10到server15不存在)。

如果在执行ansible命令时只是想在部分主机上执行,那么在清单文件中可以对主机进行
分组。定义主机组时,组名写在中括号“[]”中,在[下面写的主机名都属于这个组,直到定义下一个组的位置为止。修改清单文件的内容如下。

[bdqn@RHEL813 ~]$ cat hosts
server2
server3
server[10:15]

[db1]
server[2:5]

[db2]
server6
server7

[bdqn@RHEL813 ~]$ 
这里定义了两个主机组db1和db2,db1组中包括的主机有server2到server5,db2组中包括的主机有server6和 server7
如果想定义一个主机组,这个组中包括db1和db2两个主机组的主机,可以用 children关
键字,修改hosts的内容如下。
[bdqn@RHEL813 ~]$ cat hosts
server2
server3
server[10:15]

[db1]
server[2:5]

[db2]
server6
server7

[db3:children]
db1
db2
[bdqn@RHEL813 ~]$ 
这里定义了一个主机组db3,但是后面加了“:children",则这个主机组下面的db1和db2
就不再表示主机了,而是表示主机组。所以,db3这个主机组中所包括的主机是server2到serverS及server6和 server7这6台主机。

下面查看每个主机组中有多少主机。首先查看主机组db1中的主机,命令如下, 

[bdqn@RHEL813 ~]$ ansible db1 --list-hosts
  hosts (4):
    server2
    server3
    server4
    server5
[bdqn@RHEL813 ~]$ 
共4台主机。查看主机组db2中的主机,命令如下。
[bdqn@RHEL813 ~]$ ansible db2 --list-hosts
  hosts (2):
    server6
    server7
[bdqn@RHEL813 ~]$ 

 共2台主机。查看主机组 db3中的主机,命令如下。

[bdqn@RHEL813 ~]$ ansible db3 --list-hosts
  hosts (6):
    server2
    server3
    server4
    server5
    server6
    server7
[bdqn@RHEL813 ~]$ 

 共6台主机,与分析的是一样的。还有一个内置主机组叫作all,表示所有主机。

了解了清单文件的写法之后,最终把清单文件写成如下内容。  

[bdqn@RHEL813 ~]$ cat hosts
server2
server3

[db]
server2
server3
[bdqn@RHEL813 ~]$ 

 这里就包括了一个主机组 db,里面含有server2和server3。

2.ansible的基本用法 

ansible的基本用法如下 

ansible 机器名 ‐m 模块× ‐a "模块的参数"

 这里的机器名必须出现在清单文件中,整体的意思是在指定的机器上执行模块x。例如,在server2上执行hostname命令,命令如下。

[bdqn@RHEL813 ~]$ ansible server2 -m shell -a "hostname"
server2 | CHANGED | rc=0 >>
RHEL8
[bdqn@RHEL813 ~]$ 
shell模块用于执行操作系统命令,执行的命令就作为shell模块的参数,这里在-a中写要
执行的系统命令。所以,上面的命令就是在server2上执行hostname命令,显示的结果是 RHEL8
要完成不同的任务就需要调用不同的模块来实现,系统中存在的所有 ansible模块可以通过ansible-doc -l来查看。
不同的模块有不同的参数,模块的参数及使用方法可以通过“ansible-doc模块名”来查
  • 17
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值