Ansible 主机清单(inventory)

noteId: C54D86D9661A42BAA8DAAD855CDB9BC7 · 原始路径:/ALL/Ansible 自动化管理/Ansible 主机清单(inventory).note

Ansible inventoryAnsible工作时被控端设备信息必须先存储在Inventory中才能操作。一般以

INI格式存储在

/etc/ansible/hosts文件中。也可以执行

ansible时使用

-i参数临时设置inventory所在文件。

定义主机和主机组

inventory清单root@HOST:/etc/ansible# cat hosts10.22.0.51 ansible_ssh_pass="Incheon-2022" ansible_ssh_port=2210.22.0.52 ansible_ssh_pass="Incheon-2022" ansible_ssh_port=2210.22.0.53 ansible_ssh_pass="Incheon-2022" ansible_ssh_port=22[LIN]10.22.0.5[2:4][LIN:vars]ansible_ssh_user = "appadmin"ansible_ssh_pass="Incheon-2022"ansible_ssh_port=22# 测试连通性root@HOST:/etc/ansible# ansible all -i host-inventory -m ping# 查询主机列表root@HOST:/etc/ansible# ansible all -i host-inventory --list-hosts

Inventory内置参数

ansible_host: //指定主机的 IP 地址或主机名,用于连接到主机。ansible_port: //指定 SSH 连接的端口号,默认为 22。ansible_user: //指定连接主机时使用的用户名,默认为当前用户。ansible_ssh_pass: //指定连接主机时使用的密码。ansible_ssh_private_key_file: //指定连接主机时使用的 SSH 私钥文件路径。ansible_connection: //指定连接方式,例如 ssh、local、docker 等。默认为 ssh。ansible_python_interpreter: //指定在远程主机上使用的 Python 解释器路径。ansible_shell_type: //指定在远程主机上使用的 shell 类型,例如 /bin/sh、/bin/bash 等。ansible_shell_executable: //指定在远程主机上执行命令时使用的 shell 可执行文件路径。ansible_become: //用于指示是否切换到超级用户(root)执行任务。通常与 ansible_become_method 一起使用。ansible_become_method: //指定切换用户的方法,例如 su、sudo 等。ansible_become_user: //指定要切换到的用户。ansible_become_pass: //指定切换用户时的密码。

多个inventory组合

新建一个/etc/ansible/inventory目录专门用于存放多个inventory文件,同时在ansible.cfg文件中将inventory变量指向/etc/ansible/inventory/

root@HOST:/etc/ansible# tree inventory/inventory/├── hosts-lin└── hosts-win0 directories, 2 filesroot@HOST:/etc/ansible# cat inventory/hosts-lin 192.168.10.80

192.168.10.99

192.168.10.100

192.168.10.101

root@HOST:/etc/ansible# cat inventory/hosts-win 172.168.1.1

172.168.1.2

root@HOST:/etc/ansible# ansible all --list-hosts //列出主机清单 hosts (8):

192.168.10.80

192.168.10.99

192.168.10.100

192.168.10.101

172.168.1.1

172.168.1.2

123.1.1.1

123.1.1.2

动态inventory

动态inventory是指将主机信息从静态的配置文件中移动到脚本或外部源中,根据需要在运行时动态生成主机清单。

实践:参考上节 endpoint /servers/ 接口,通过Python实现动态inventory

思路:编写python脚本以输出静态主机组:

/data/inventory.py

#!/usr/bin/python3"""实现ansible动态inventory"""import jsondef get_dynamic_inventory():    # 通过字典定义主机和组    data_source = {        "LIN": {            "hosts": ["192.168.10.80", "192.168.10.99", "192.168.10.100",'192.168.10.101'],            "vars": {                "ansible_user": "root"            }        },        "WIN": {            "hosts": ["172.168.1.1", "172.168.1.2"],            "vars": {                "ansible_user": "administrator"            }        }    }    return data_sourceif __name__ == "__main__":    inventory_data = get_dynamic_inventory()    print(json.dumps(inventory_data))

授权

chmod +x /data/inventory.py

编写一个剧本用于测试:

root@HOST:/etc/ansible/playbooks# cat command.yml - hosts: 192.168.10.80 tasks: - name: test command command: head /etc/passwd - name: test command2 command: id

执行剧本

/data/IaC-code/ansible/hosts_from_dict.py,测试是否能作为ansible的主机清单文件:

ansible-playboo                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           k -i /data/inventory.py /etc/ansible/playbooks/command.yml

编写python脚本以输出动态主机组(从/etc/ansible/server.json文件读取主机清单):

/data/servers.py

#!/usr/bin/python3"""实现ansible动态inventory"""import jsondef get_dynamic_inventory():    # 从/etc/ansible/servers.json文件读取主机列表    with open('/etc/ansible/servers.json') as f:        data = json.load(f)    inventory = {        '_meta': {            'hostvars': {}        }    }    """inventory初始值    {        '_meta': {            'hostvars': {}        }    }    """    """第一次遍历后inventory的值    {        '_meta': {            'hostvars': {}        },        web_server: {            'hosts': ["10.22.0.50"],            'vars': {}        }    }    """    for server in data:        # 遍历一次就输出一次        # print(server)        """server变量的值        {        "server_name": "HOST",        "server_type": "web server",        "address": "10.22.0.50",        "cpu_cores": 4,        "mem_size": 4096        }        """        server_name = server['server_name']        server_type = server['server_type']        address = server['address']        # 组名根据server_type来设定,可以根据需要进行修改        # "web server" => "web_server"        # "Web SerVer" => "web_server"        group_name = server_type.replace(' ', '_').lower()        """        web_server: {            'hosts': ["10.22.0.50"],            'vars': {}        }        """        # inventory["web_server"] = ""        if group_name not in inventory:            inventory[group_name] = {                'hosts': [],                'vars': {}            }        inventory[group_name]['hosts'].append(server_name)        inventory['_meta']['hostvars'][server_name] = {            'ansible_host': address,            # 可以添加更多的变量,以供Playbook使用        }    return inventoryif __name__ == "__main__":    inventory_data = get_dynamic_inventory()    print(json.dumps(inventory_data))

server.json文件:

[

{

"server_name": "LIN1",

"server_type": "HOST server",

"address": "192.168.10.80",

"cpu_cores": 4,

"mem_size": 4096

},

{

"server_name": "LIN2",

"server_type": "server",

"address": "192.168.10.99",

"cpu_cores": 4,

"mem_size": 4096

},

{

"server_name": "LIN3",

"server_type": "HOST server",

"address": "192.168.10.100",

"cpu_cores": 4,

"mem_size": 4096

},

{

"server_name": "LIN4",

"server_type": "LIN server",

"address": "192.168.10.101",

"cpu_cores": 4,

"mem_size": 4096

}

]