- 首先,我们需要使用 Ansible 内置的 jinja2 过滤器来提取 inventory 文件中的 IP。具体实现如下所示:
# 打开 inventory 文件并使用其构造 Ansible 的 inventory 对象
from ansible.parsing.dataloader import DataLoader
from ansible.inventory.manager import InventoryManager
from ansible.vars.manager import VariableManager
loader = DataLoader()
inventory_path = 'inventory_file_path'
inventory = InventoryManager(loader=loader, sources=[inventory_path])
variable_manager = VariableManager(loader=loader, inventory=inventory)
# 定义我们想要提取 IP 的主机组
group_name = 'web_servers'
# 使用 Ansible 过滤器获取该主机组的 IP 列表
hosts = inventory.get_hosts(group_name)
# 提取 IP 列表并将其打印出来
ips = [host.vars['ansible_host'] for host in hosts]
print(ips)
- 我们也可以将上面的代码封装成一个 Ansible 模块,以便在 Ansible playbook 中直接调用。具体实现如下所示:
- 在 Ansible roles 目录下创建一个名为
ip_extractor
的新角色
- 在
ip_extractor
目录下创建一个名为 library
的子目录。这个目录是用于存放我们自己编写的 Ansible 模块的地方。
- 在
library
下创建一个 ip_extractor.py
文件,并拷贝上述代码到该文件中
# 导入必要的 Ansible 模块
from ansible.module_utils.basic import AnsibleModule
from ansible.parsing.dataloader import DataLoader
from ansible.inventory.manager import InventoryManager
from ansible.vars.manager import VariableManager
def main():
# 构造 Ansible 输入参数
module_args = dict(
inventory_path=dict(required=True, type='str'),
group_name=dict(required=True, type='str')
)
# 创建 AnsibleModule 对象
module = AnsibleModule(argument_spec=module_args)
# 打开 inventory 文件并构造 Ansible 的 inventory 对象
loader = DataLoader()
inventory_path = module.params['inventory_path']
inventory = InventoryManager(loader=loader, sources=[inventory_path])
variable_manager = VariableManager(loader=loader, inventory=inventory)
# 获取要提取 IP 的主机组
group_name = module.params['group_name']
hosts = inventory.get_hosts(group_name)
# 提取 IP 列表
ips =