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

注意:

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

正文:

步骤目录:

步骤一:规划拓扑
1.1 服务器列表
1.2 服务器列表简介

步骤二:实现管理服务器登陆被管理的服务器
2.1 在管理服务器上添加被管理服务器 IP 地址和服务器名的对应关系
2.2 实现管理服务器登陆被管理的服务器
2.2.1 让管理服务器无密钥登陆要被管理的服务器
2.2.1.1 在管理服务器上生成 ssh 公钥和私钥
2.2.1.2 将管理服务器生成的 ssh 公钥复制到要被管理的服务器里
2.3 让管理服务器通过密钥登陆要被管理的服务器
2.3.1 指定管理服务器的 Ansible 远程用户
2.3.2 在管理服务器上 Ansible 的服务器列表里给指定的服务器添加登陆密码

步骤三:在管理服务器的 Ansible 上添加服务器列表,并将其分组(从列表优先级的角度来思考)
3.1 Ansible 服务器列表分组的不同优先级(从列表优先级的角度来思考)
3.2 通过设置 Ansible 服务器配置文件的全局变量的方法来添加服务器列表
3.2.1 在管理服务器上修改系统环境变量文件
3.2.2 在管理服务器上让系统环境变量生效
3.2.3 在管理服务器上在环境变量指定的位置创建 Ansible 的配置文件
3.2.4 在管理服务器上指定 Ansible 的服务器列表文件
3.3 在管理服务器上添加 Ansible 的服务器列表,并将其分组
3.4 通过在当前目录下创建 Ansible 配置文件和服务器列表文件的方法来添加服务器列表
3.4.1 在管理服务器上进入到一个任意此用户有权限的目录
3.4.2 在管理服务器上的当前位置创建 Ansible 的配置文件
3.4.3 在管理服务器上指定 Ansible 的服务器列表文件
3.4.4 在管理服务器上添加 Ansible 的服务器列表,并将其分组
3.5 通过在家目录下创建 Ansible 配置文件和服务器列表文件的方法来添加服务器列表
3.5.1 在管理服务器上进入到家目录
3.5.2 在管理服务器上的家目录位置创建 Ansible 的配置文件
3.5.3 在管理服务器上指定 Ansible 的服务器列表文件
3.5.4 在管理服务器上添加 Ansible 的服务器列表,并将其分组
3.6 通过修改 Ansible 默认配置文件和默认服务器列表文件的方法来添加服务器列表
3.6.1 在管理服务器上指定 Ansible 服务器列表文件
3.6.2 在管理服务器上添加 Ansible 的服务器列表,并将其分组

步骤四:在管理服务器的 Ansible 上添加服务器列表,并将其分组(从列表种类的角度来思考)
4.1 让管理服务器的 Ansible 使用文本格式的服务器列表文件
4.1.1 分组的方式
4.1.1.1 单个服务器
4.1.1.2 一组服务器
4.1.1.3 一复合组服务器
4.1.2 列表的描述方式介绍
4.1.2.1 连续的数字
4.1.2.2 连续的字母
4.2 让管理服务器的 Ansible 使用 json 格式的服务器列表文件
4.2.1 在管理服务器上进入任意一个此用户有权限的目录
4.2.2 在管理服务器上的家目录位置创建 Ansible 的配置文件
4.2.3 在管理服务器上指定 Ansible 的服务器列表文件
4.2.4 在管理服务器上使用 Python3 编程语言生成 json 格式的服务器列表
4.2.4.1 在管理服务器上编写生成 json 格式的 Python 程序
4.2.4.2 给刚刚编写的 Python 程序相应的全权

步骤五:在管理服务器的 Ansible 上添加服务器列表,并将其分组(多个同优先级相同的列表,从管理的角度来思考)
5.2.1 在管理服务器上进入任意一个此用户有权限的目录
5.2.2 在管理服务器上的家目录位置创建 Ansible 的配置文件
5.2.3 在管理服务器上指定 Ansible 的服务器列表文件目录
5.2.4 创建 Ansible 的服务器列表文件目录
5.2.4.1 创建第一个 Ansible 的服务器列表文件目录
5.2.4.2 创建第一个 Ansible 的服务器列表文件目录
5.2.4.3 创建第三个 Ansible 的服务器列表文件目录

步骤六:测试管理服务器 Ansible 的服务器列表
6.1 显示默认服务器列表里的服务器列表
6.2 显示 web 组的服务器
6.3 显示 db 组的服务器
6.4 显示不属于任何组的服务器
6.5 显示所有服务器

具体的操作步骤:

步骤一:规划拓扑
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 服务器列表分组的不同优先级(从列表优先级的角度来思考)

(最高优先级)设置 Ansible 服务器配置文件的全局变量,并在此变量指定的位置创建 Ansible 配置文件和服务器列表文件
(第二高优先级)在当前目录下创建 Ansible 配置文件和服务器列表文件
(第三高优先级)在当前下创建 Ansible 配置文件和服务器列表文件
(第四高优先级)修改 Ansible 在 /etc 目录下的默认配置文件和服务器列表文件

(注意: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 在管理服务器上进入到一个任意此用户有权限的目录

# 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.2.1 在管理服务器上进入任意一个此用户有权限的目录

# cd ~

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

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

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

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

将以下内容:

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

修改为:

......
inventory      = ~/hosts/
......

5.2.4 创建 Ansible 的服务器列表文件目录
5.2.4.1 创建第一个 Ansible 的服务器列表文件目录

# vim ~/hosts/hostsa

创建以下内容:

[web]
web1
web2
web3

5.2.4.2 创建第一个 Ansible 的服务器列表文件目录

# vim ~/hosts/hostsb

创建以下内容:

[db]
db1
db2
db3

5.2.4.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