如何在自定义模块中访问 Ansible 事实(例如 ansible_all_ipv4_addresses)?

问题描述 投票:0回答:1

我正在开发一个自定义 Ansible 模块,需要直接在模块代码中访问某些事实,例如

ansible_all_ipv4_addresses
。但是,我不确定如何在不从剧本中明确传递这些事实的情况下检索这些事实。

例如,在 SaltStack 中,您可以通过 grains 访问系统信息,但我在 Ansible 自定义模块中找不到等效的方法。这就是我想要实现的目标:

我想在我的自定义模块中获取事实

ansible_all_ipv4_addresses
,而不需要手动将其作为剧本中的参数传递。

这是我正在尝试做的一个例子:

from ansible.module_utils.basic import AnsibleModule

def run_module():
    module = AnsibleModule(
        argument_spec={},
        supports_check_mode=True
    )

    # How can I access ansible_all_ipv4_addresses here?
    ipv4_addresses = ???

    module.exit_json(changed=False, ipv4=ipv4_addresses)

if __name__ == '__main__':
    run_module()

有没有办法直接访问自定义模块中的

ansible_all_ipv4_addresses
等事实,类似于SaltStack处理grains的方式?如果没有,在自定义模块中访问这些事实的推荐方法是什么?

提前致谢!

ansible ansible-facts
1个回答
0
投票

以下方法解决了我的问题

#!/usr/bin/python

from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.facts.compat import ansible_facts


def run_module():
    module_args = dict(filter=dict(type="str", required=False, default="all_ipv4_addresses"))
    module = AnsibleModule(argument_spec=module_args, supports_check_mode=True)
    ipv4_addresses = ansible_facts(module)

    module.exit_json(changed=False, ipv4=ipv4_addresses)


if __name__ == "__main__":
    run_module()
© www.soinside.com 2019 - 2024. All rights reserved.