使用ansible自定义模块

时间:2018-01-24 19:01:31

标签: ansible ansible-facts

我正在编写一个ansible自定义模块,它与URI模块具有相同的功能。 特别是,我希望返回的数据既可以作为全局var,也可以作为特定于主机的var (主机是运行任务的库存主机)。 基于传递给模块的值。

然而,无论我做什么,似乎我只能创建一个全局变量。 假设我为N个主机运行playbook,我只执行一次自定义模块(run_once:yes)。

[...]
   - name: Run the custom module and generate output in custom_var
     run_once: yes
     custom_module:
       field1: ...
       field2: ...
       global_data: yes -> yes, to create a global fact called: custom_var

   - name: DEBUG - Print the content of custom_var
     debug: msg="{{ custom_var }}"

这很好用,所有N个主机都能看到custom_var。 有没有办法让我只能为执行任务的实际主机定义custom_var?

奇怪的是,我还尝试将第一项任务的结果注册如下:

[...]
   - name: Run the custom module and generate output in custom_var
     run_once: yes
     custom_module:
       field1: ...
       field2: ...
       global_data: no -> no, if I don't create any global fact
     register: register_task

   - name: DEBUG - Print the content of custom_var
     debug: msg="{{ register_task }}"

但看起来它也可用于清单中的所有主机(具有相同的内容)。这是预期的行为吗? 有关如何使custom_var仅适用于实际运行任务的主机的任何想法吗?

提前致谢!

1 个答案:

答案 0 :(得分:0)

是的,这是run_once: yes的预期行为,因为它会覆盖主机循环。

设置此选项后,任务仅执行一次(在批处理中的第一台主机上),但结果将复制到同一批次中的所有主机。因此,您最终会为每个主机定义custom_var / register_task

如果您想要相反,可以将run_once: yes更改为条件语句,如:

    when: play_hosts.index(inventory_hostname) == 0

这将仅在第一台主机上执行任务,但不会覆盖主机循环(由于条件,仍会跳过其他主机的任务);这种注册事实仅适用于第一台主机。