Ansible 主机清单(inventory)
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
}
]