目录
一、理论讲解
-
如果管理的服务器很多,如几十台甚至几百台,那么就需要一个自动化管理工具了,ansible就是这样的一种自动化管理工具。
-
ansible是通过ssh连接到被管理主机,然后执行相关操作的,如下图。
-
ansible主机通过ssh连接到被管理主机时,需要提前设置密钥登录,使得从ansible主机可以无密码登录到被管理主机。
本实验的拓扑图
-
这里server是 ansible主机,以lduan用户登录。server2和server3是被管理主机,在这两台主机上创建lduan 用户并配置好sudo,使得这两台主机上的lduan用户通过sudo-i可以无密码切换到root,下面开始配置。
二、安装ansible
(1)先使用root用户登录server,在其上配置epel源,命令如下。
[root@rhel1 ~]# yum -y install https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
[root@rhel1 ~]# sed -i 's|^#baseurl=https://download.fedoraproject.org/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
[root@rhel1 ~]# sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*
(2)挂载镜像和配置本地yum源。
操作:略
(3)安装开发工具。
[root@rhel1 ~]# yum -y groupinstall 开发工具
-
RHEL8默认的Python版本为3.6,不符合项目的需求。现在升级到3.9
(4)下载Python3.9.5,有安装包可以用安装包就不用下载了。
[root@rhel1 ~]# wget https://www.python.org/ftp/python/3.9.5/Python‐3.9.5.tgz
(5)解压Python-3.11.7.tgz解压包。
[root@rhel1 ~]# tar zxvf Python-3.11.7.tgz
(6)安装Python。
[root@rhel1 ~]# cd Python-3.11.7/
[root@rhel1 Python-3.11.7]# ./configure ‐‐prefix=/usr/local/python3 ‐‐enable‐optimizations
[root@rhel1 Python-3.11.7]# make
[root@rhel1 Python-3.11.7]# make install
(7)删除原先的Python3和pip3。
[root@rhel1 ~]# rm -rf /usr/bin/python3
[root@rhel1 ~]# ln -s /usr/local/python3/bin/python3 /usr/bin/python3
[root@rhel1 ~]# rm -rf /usr/bin/pip3
[root@rhel1 ~]# ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
(8)安装ansible。
[root@rhel1 ~]# 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 需要
(9)需要解决依赖包问题。
[root@rhel1 ~]# yum -y install python3-cryptography 本地yum源安装
[root@rhel1 ~]# yum -y install python3-jinja2 本地yum源安装
[root@rhel1 ~]# rpm -ivh sshpass-1.06-3.el8ae.x86_64.rpm 软件包安装
(10)再次安装ansible。
[root@rhel1 ~]# rpm -ivh ansible-2.9.11-1.el8ae.noarch.rpm
(11)使用命令检查ansible的安装结果。
[root@rhel1 ~]# ansible --version
[root@rhel1 ~]# pip3 --version
(12)确保ansible主机能够解析所有的被管理机器,这里通过配置/etc/hosts 来实现。
[root@rhel1 ~]# vim /etc/hosts 在下面添加IP地址和主机名
192.168.112.70 rhel8 server1
192.168.112.71 rhel8 server2
192.168.112.72 rhel8 server3
(13)在server2和 server3两台机器创建bdqn用户,然后配置好sudo,命令如下。
[root@rhel8 ~]# useradd bdqn 创建bdqn用户
[root@rhel8 ~]# passwd bdqn 设置密码
[root@rhel8 ~]# vim /etc/sudoers.d/bdqn
bdqn ALL=(root) NOPASSWD: ALL
(14)配置免密登录,在server主机上生成密钥。
[bdqn@rhel1 ~]$ ssh-keygen -f ~/.ssh/id_rsa -N "" 生成密钥
[bdqn@rhel1 ~]$ ssh-copy-id bdqn@192.168.112.71 把密钥发给71主机
[bdqn@rhel1 ~]$ ssh-copy-id bdqn@192.168.112.72 把密钥发给71主机
[bdqn@rhel1 ~]$ ssh server2 登录测试
三、编写ansible.cfg和清单文件
-
执行ansible或ansible-playbook命令时,优先使用当前目录中ansible.cfg的配置。如果当前目录中没有,则使用默认的/etc/ansible.cfg中的配置。
(1)下面的操作都是server上的blab用户操作的,先在家目录下创建ansible.cfg。
[bdqn@rhel1 ~]$ vim ansible.cfg 添加一下内容
[defaults]
inventory = ./hosts
[privilege_escalation]
become=True
become_method=sudo
become_user=root
-
这里在[defaults]字段下只添加了一句inventory = ./hosts,表示把当前目录下名称为hosts的文件当作清单文件
-
become=True:登录到被管理主机时要切换到其他用户。
-
become_method=sudo:以 sudo的方式切换。
-
become_user=root:切换到root用户。
(2)所有的被管理机器都要写入清单文件中。了解清单的写法。
[bdqn@rhel1 ~]$ vim hosts
server2
server3
server[10:15]
[db1]
server2
server3
[db2]
server6
server7
[db3:children]
db1
db2
- server[10:15]:表示server10到server15。
-
这里定义了两个主机组db1和db2,db1组中包括的主机有server2到server3,db2组中包括的主机有server6和 server7。
-
这里定义了一个主机组db3,但是后面加了“:children",则这个主机组下面的db1和db2就不再表示主机了,而是表示主机组。
(3)下面查看每个主机组中有多少主机。
[bdqn@rhel1 ~]$ ansible db1 --list-hosts 查看组db1
hosts (2):
server2
server3
[bdqn@rhel1 ~]$ ansible db2 --list-hosts 查看组db2
hosts (2):
server6
server7
[bdqn@rhel1 ~]$ ansible db3 --list-hosts 查看组db3
hosts (4):
server2
server3
server6
server7
(4)了解了清单文件的写法之后,最终把清单文件写成如下内容。
[bdqn@rhel1 ~]$ vim hosts
server2
server3
[db]
server1
server2
四、ansible的基本用法
(1)ansible的基本格式如下。
ansible 主机名 -m 模块x -a "模块的参数"
(2)在server2上执行hostname命令。
[bdqn@rhel1 ~]$ ansible server2 -m shell -a "hostname"
server2 | CHANGED | rc=0 >>
rhel8
-
shell模块用于执行操作系统命令,执行的命令就作为shell模块的参数,这里在-a中写要执行的系统命令。所以,上面的命令就是在server2上执行hostname命令,显示的结果是server2.rhce.cc。
(3)查看所有的模块。
[root@rhel1 ~]# ansible-doc -l