Python 添加 Ansible主机配置

Python 添加 Ansible主机配置

坏境架构

主机名IP
ansible-server192.168.100.101
app-hd-nginx-01192.168.100.102
app-hd-nginx-02192.168.100.103
app-hd-redis-01192.168.100.104
app-hd-nacos-01192.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
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值