Python 添加 Ansible主机配置
坏境架构
主机名 | IP |
---|---|
ansible-server | 192.168.100.101 |
app-hd-nginx-01 | 192.168.100.102 |
app-hd-nginx-02 | 192.168.100.103 |
app-hd-redis-01 | 192.168.100.104 |
app-hd-nacos-01 | 192.168.100.105 |
在 ansible-server 主机:编辑 /etc/hosts
文件,添加主机信息:
[12:26:56] root@ansible-server:~ $
27 ==> cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.102 app-hd-nginx-01
192.168.100.103 app-hd-nginx-02
192.168.100.104 app-hd-redis-01
192.168.100.105 app-hd-nacos-01
以上hosts文件虽然很多,但是我们只匹配以 app-hd-nginx-01
xxxxx-xxxx-xxxx-xxxx 格式的主机名称
在 ansible-server 主机安装 ansible:
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
[11:21:45] root@ansible-server:~ $
1 ==> yum -y install ansible
以上我们要完成的是,写一个py文件,这个py文件会去读取 /etc/hosts 文件,根据主机名的前缀,来进行分组到 ansible 资源清单当中,比如
app-hd-nginx
开头的主机名称,会将主机划分到ansible中的[app-hd-nginx]
组当中app-hd-redis
开头的主机名称,会将主机划分到ansible中的[app-hd-redis]
组当中app-hd-nacos
开头的主机名称,会将主机划分到ansible中的[app-hd-nacos]
组当中
以上py脚本会根据 /etc/hosts
中的主机名称前缀,来为 Ansible 进行分组
一、编写 Py 脚本
1、编写 Python 脚本
编写 python 文件,文件名称为 inter-ansible
[15:13:26] root@ansible-server:~ $
15 ==> vim inter-ansible
#!/usr/bin/python3
import re
import argparse
def read_hosts_file(file_path):
hosts_list = []
hostname_pattern = r"^(.+)-(.+)-(.+)-(.+)$"
ip_pattern = r'^\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b$'
with open(file_path, 'r', encoding='utf-8') as file:
for i in file:
all_ip = i.strip().split(" ")[0]
all_hostname = i.strip().split(" ")[1]
ip_name = re.match(ip_pattern, all_ip)
host_name = re.match(hostname_pattern, all_hostname)
if host_name and ip_name:
hosts_list.append({host_name.group():ip_name.group()})
else:
print(f"不符合主机规则(跳过): {i}",end="")
return hosts_list
def dict_extend(hosts_list):
set_name = set()
for i in hosts_list:
for i in i.keys():
project_name = i.strip().split("-")[0]
location = i.strip().split("-")[1]
application = i.strip().split("-")[2]
set_name.add(f"{project_name}-{location}-{application}")
ips = []
for server_list in hosts_list:
str = ""
for i in server_list.keys():
for x in set_name:
if i.startswith(f"{x}"):
str = server_list[i]
ips.append({f"{x}":str})
return ips
def write_conf(ips,dest_file_path):
# 创建一个空字典,用于存储累积的值
merged_inventory = {}
# 遍历字典列表
for item in ips:
# 遍历字典中的键值对
for key, value in item.items():
# 如果键已经在累积字典中,追加值到列表中
if key in merged_inventory:
merged_inventory[key].append(value)
else:
# 否则,创建一个新的列表并添加值
merged_inventory[key] = [value]
with open(dest_file_path, 'w', encoding='utf-8') as file:
for key,value in merged_inventory.items():
file.write(f"[{key}]\n")
for i in value:
file.write(f"{i}\n")
file.write("\n")
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('-source', type=str, default="None",help="指定文件解析指定文件内容")
parser.add_argument('-target', type=str, default="None",help="指定文件导出解析文件内容")
args = parser.parse_args()
if args.source != "None" and args.target != "None":
filter_list = read_hosts_file(args.source)
dict_e = dict_extend(filter_list)
write_conf(dict_e,args.target)
else:
print("add_ansible_host -h:查看帮助命令")
二、运行测试
1、赋予权限py脚本
[15:14:57] root@ansible-server:~ $
17 ==> ls
inter-ansible
[15:15:23] root@ansible-server:~ $
18 ==> chmod +x inter-ansible
[15:16:37] root@ansible-server:~ $
22 ==> mv inter-ansible /usr/bin/
2、运行py脚本
脚本参数:
-source
:指定需要解析分组的源文件-target
:指定解析完毕后输出到的文件
[15:23:15] root@ansible-server:~ $
36 ==> inter-ansible -source /etc/hosts -target /etc/ansible/app-project-hosts
不符合主机规则(跳过): 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
不符合主机规则(跳过): ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
查看 /etc/ansible/app-project-hosts
文件(以下可以看到资源清单配置好了):
[15:23:36] root@ansible-server:~ $
37 ==> cat /etc/ansible/app-project-hosts
[app-hd-nginx]
192.168.100.102
192.168.100.103
[app-hd-redis]
192.168.100.104
[app-hd-nacos]
192.168.100.105
三、ansible 指定资源清单文件测试
1、修改 ansible 指定资源清单文件测试
[15:30:48] root@ansible-server:~ $
47 ==> ansible -i /etc/ansible/app-project-hosts app-hd-nginx -m ping
[15:30:54] root@ansible-server:~ $
48 ==> ansible -i /etc/ansible/app-project-hosts app-hd-redis -m ping
[15:30:59] root@ansible-server:~ $
49 ==> ansible -i /etc/ansible/app-project-hosts app-hd-nacos -m ping
[15:31:05] root@ansible-server:~ $
50 ==> ansible -i /etc/ansible/app-project-hosts all -m ping