[步骤] Ansible 所管理的服务器的添加和分组

注意:

在添加被 Ansible 管理的服务器前要先安装 Ansible

正文:

步骤一:规划拓扑

1.1 服务器列表

管理服务器 IP 地址:192.168.100.100
被管理的服务器 1 IP 地址:192.168.100.101
被管理的服务器 2 IP 地址:192.168.100.102
被管理的服务器 3 IP 地址:192.168.100.103
被管理的服务器 4 IP 地址:192.168.100.104
被管理的服务器 3 IP 地址:192.168.100.105
被管理的服务器 4 IP 地址:192.168.100.106
被管理的服务器 4 IP 地址:192.168.100.107

1.2 服务器列表简介

1) 管理人员只用 ssh 到管理服务器就可以通过 Ansible 管理其他所有的被管理服务器
2) 将 192.168.100.101 至 192.168.100.110 视作 web1 至 web10 ,它们属于 web 组
3) 将 192.168.100.111 至 192.168.100.115 视作 db1 至 db5 ,它们属于 db 组
4) 将 192.168.100.107 视作新添加的要被管理的服务器 ,它不属于任何组

步骤二:实现管理服务器登录被管理的服务器

2.1 在管理服务器上添加被管理服务器 IP 地址和服务器名的对应关系

# vim /etc/hosts

添加以下内容:

......
192.168.100.100 ansible
192.168.100.101 web1
192.168.100.102 web2
192.168.100.103 web3
192.168.100.104 db1
192.168.100.105 db2
192.168.100.106 db3

2.2 实现管理服务器登录被管理的服务器

2.2.1 让管理服务器无密钥登录要被管理的服务器
2.2.1.1 在管理服务器上生成 SSH 公钥和私钥
# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
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:GGqyQU4+u+eNTaWN4SILhm3QN08ZR3jPWC+quRlsP6c root@test1
The key's randomart image is:
+---[RSA 2048]----+
|       ..        |
|      ... .      |
|  o   o..= .     |
| *   . *. + .    |
|. B = = S. .     |
|.o O * *.        |
|o.* . Xo.        |
|.o +.Bo+. .      |
|  ooo =.E+       |
+----[SHA256]-----+
2.2.1.2 将管理服务器生成的 SSH 公钥复制到要被管理的服务器里
# for i in {100..107} ; do ssh-copy-id 192.168.100.$i ; done

2.3 让管理服务器通过密钥登录要被管理的服务器

2.3.1 指定管理服务器的 Ansible 远程用户
# vim /etc/ansible/ansible.cfg

将以下内容:

......
# remote_user = root
......

修改为:

......
remote_user = root
......
2.3.2 在管理服务器上 Ansible 的服务器列表里给指定的服务器添加登录密码
# vim /etc/ansible/hosts

创建以下内容:

[all:vars]
ansible_password=redhat

步骤三:在管理服务器的 Ansible 上添加服务器列表,并将其分组(从列表优先级的角度来思考)

3.1 Ansible 服务器列表分组的不同优先级(从列表优先级的角度来思考)

1) 最高优先级,设置 Ansible 服务器配置文件的全局变量,并在此变量指定的位置的 Ansible 配置文件和服务器列表文件
3) 第二高优先级,在执行 ansible 命令时,当前目录下的 Ansible 配置文件和服务器列表文件
4) 第三高优先级,在使用 ansible 命令用户家目录下的 Ansible 配置文件和服务器列表文件
5) 第四高优先级,在 /etc/ansible 下的 Ansible 配置文件和服务器列表文件

(注意:Ansible 会严格按照优先级,当有更高优先级的服务器列表时,绝对不会执行低等级的服务器列表)

3.2 通过设置 Ansible 服务器配置文件的全局变量的方法来添加服务器列表

3.2.1 在管理服务器上修改系统环境变量文件
# vim /etc/profile

添加以下内容:

......
export ANSIBLE_CONFIG=/opt/ansible.cfg

(补充:这里以 /opt 目录为例)

3.2.2 在管理服务器上让系统环境变量生效
# source /etc/profile
3.2.3 在管理服务器上在环境变量指定的位置创建 Ansible 的配置文件
# cp /etc/ansible/ansible.cfg /opt/
3.2.4 在管理服务器上指定 Ansible 的服务器列表文件
# vim /opt/ansible.cfg

将以下内容:

......
#inventory      = /etc/ansible/hosts
......

修改为:

......
inventory      = hosts
......

3.3 在管理服务器上添加 Ansible 的服务器列表,并将其分组

# vim /opt/hosts

创建以下内容:

192.168.100.107

[web]
web[1:3]

[db]
db1
db2
db3

(补充:这里以文本列表为例)

3.4 通过在当前目录下创建 Ansible 配置文件和服务器列表文件的方法来添加服务器列表

3.4.1 在管理服务器上进入到 1 个任意此用户有权限的目录
# cd /opt

(补充:这里以 /opt 目录为例)

3.4.2 在管理服务器上的当前位置创建 Ansible 的配置文件
# cp /etc/ansible/ansible.cfg /opt/
3.4.3 在管理服务器上指定 Ansible 的服务器列表文件
# vim /opt/ansible.cfg

将以下内容:

......
#inventory      = /etc/ansible/hosts
......

修改为:

......
inventory      = hosts
......
3.4.4 在管理服务器上添加 Ansible 的服务器列表,并将其分组
# vim /opt/hosts

创建以下内容:

192.168.100.107

[web]
web[1:3]

[db]
db1
db2
db3

(补充:这里以文本列表为例)

3.5 通过在家目录下创建 Ansible 配置文件和服务器列表文件的方法来添加服务器列表

3.5.1 在管理服务器上进入到家目录
# cd
3.5.2 在管理服务器上的家目录位置创建 Ansible 的配置文件
# cp /etc/ansible/ansible.cfg ~/
3.5.3 在管理服务器上指定 Ansible 的服务器列表文件
# vim ~/ansible.cfg

将以下内容:

......
#inventory      = /etc/ansible/hosts
......

修改为:

......
[defaults]
inventory      = hosts
......
3.5.4 在管理服务器上添加 Ansible 的服务器列表,并将其分组
# vim ~/hosts

创建以下内容:

192.168.100.107

[web]
web[1:3]

[db]
db1
db2
db3

(补充:这里以文本列表为例)

3.6 通过修改 Ansible 默认配置文件和默认服务器列表文件的方法来添加服务器列表

3.6.1 在管理服务器上指定 Ansible 服务器列表文件
# vim /etc/ansible/ansible.cfg

将以下内容:

......
#inventory      = /etc/ansible/hosts
......

修改为:

......
inventory      = /etc/ansible/hosts
......
3.6.2 在管理服务器上添加 Ansible 的服务器列表,并将其分组
# vim /etc/ansible/hosts

创建以下内容:

192.168.100.107

[web]
web[1:3]

[db]
db1
db2
db3

(补充:这里以文本列表为例)

步骤四:在管理服务器的 Ansible 上添加服务器列表,并将其分组(从列表种类的角度来思考)

4.1 让管理服务器的 Ansible 使用文本格式的服务器列表文件

4.1.1 分组的方式
4.1.1.1 单个服务器
# vim /etc/ansible/hosts

创建以下内容:

192.168.100.107
4.1.1.2 服务器组
# vim /etc/ansible/hosts

创建以下内容:

192.168.100.107

[web]
web1
web2
web3
4.1.1.3 服务器复合组
# vim /etc/ansible/hosts

创建以下内容:

192.168.100.107

[web]
web1
web2
web3

[db]
db1
db2
db3

[webdb:children]
web
db

(补充:在这里的 webdb 组会同时包含 web 和 db 里的服务器)

4.1.2 列表的描述方式介绍
4.1.2.1 连续的数字
192.168.[0:10].[0:255]

(补充:这里以从 192.168.0.0 到 192.168.10.255 为例)

4.1.2.2 连续的字母
web[a:c]

(补充:这里以从 weba 到 webc 为例)

4.2 让管理服务器的 Ansible 使用 json 格式的服务器列表文件

4.2.1 在管理服务器上进入任意一个此用户有权限的目录
# cd ~

(补充:这里以进入家目录为例)

4.2.2 在管理服务器上的家目录位置创建 Ansible 的配置文件
# cp /etc/ansible/ansible.cfg ~/
4.2.3 在管理服务器上指定 Ansible 的服务器列表文件
# vim ansible.cfg

将以下内容:

......
#inventory      = /etc/ansible/hosts
......

修改为:

......
inventory      = ./hosts.py
......
4.2.4 在管理服务器上使用 Python3 编程语言生成 json 格式的服务器列表
4.2.4.1 在管理服务器上编写生成 json 格式的 Python 程序
# vim hosts.py

创建以下内容:

#!/usr/libexec/platform-python
import json
hostlist = {}
hostlist["web"] = ["192.168.100.101", "192.168.100.103"]

hostlist["db"] = {
        "hosts" :["192.168.100.104", "192.168.100.106"],
        "vars" :{"ansible_ssh_user":"root", "ansible_ssh_pass":"1"}
        }

hostlist["192.168.100.7"] = {
        "ansible_ssh_user":"root", "ansible_ssh_pass":"pwd"
        }

print(json.dumps(hostlist))
4.2.4.2 给刚刚编写的 Python 程序相应的全权
# chmod 755 hosts.py


补充:
使用 Python3 出现报错的处理方法:
1) 显示 yum 的配置文件位置

# whereis yum
yum: /usr/bin/yum /etc/yum /etc/yum.conf /usr/share/man/man8/yum.8.gz

2) 确认 yum 所使用的 Python

# head -1 /usr/bin/yum 
#!/usr/libexec/platform-python

3) 将 hosts.py 第一行的 Python 位置修改成和 yum 所使用的一样

# vim hosts.py

将第一行修改为:

#!/usr/libexec/platform-python
......

步骤五:在管理服务器的 Ansible 上添加服务器列表,并将其分组(多个同优先级相同的列表,从管理的角度来思考)

5.1 在管理服务器上进入任意 1 个此用户有权限的目录

# cd ~

(补充:这里以进入家目录为例)

5.2 在管理服务器上的家目录位置创建 Ansible 的配置文件

# cp /etc/ansible/ansible.cfg ~/

5.3 在管理服务器上指定 Ansible 的服务器列表文件目录

将以下内容:

......
#inventory      = /etc/ansible/hosts
......

修改为:

......
inventory      = ~/hosts/
......
5.2.4 创建 Ansible 的服务器列表文件目录
5.2.4.1 创建第 1 个 Ansible 的服务器列表文件目录
# vim ~/hosts/hostsa

创建以下内容:

[web]
web1
web2
web3
5.2.4.2 创建第 1 个 Ansible 的服务器列表文件目录
# vim ~/hosts/hostsb

创建以下内容:

[db]
db1
db2
db3
5.2.4.3 创建第 3 个 Ansible 的服务器列表文件目录
# vim ~/hosts/others

创建以下内容:

192.168.100.7

步骤六:测试管理服务器 Ansible 的服务器列表

6.1 显示默认服务器列表里的服务器列表

# ansible all -i /etc/ansible/hosts --list-host
  hosts (20):
    web1
    web2
    web3
    db1
    db2
    db3
    192.168.100.107

6.2 显示 web 组的服务器

# ansible web --list-host
  hosts (10):
    web1
    web2
    web3

6.3 显示 db 组的服务器

# ansible db --list-host
  hosts (5):
    db1
    db2
    db3

6.4 显示不属于任何组的服务器

# ansible ungrouped --list-host
  hosts (1):
  192.168.100.7

6.5 显示所有服务器

# ansible all --list-host
  hosts (20):
    web1
    web2
    web3
    db1
    db2
    db3
    192.168.100.107

或者:

# ansible-inventory --graph