我正在编写一个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仅适用于实际运行任务的主机的任何想法吗?
提前致谢!
答案 0 :(得分:0)
是的,这是run_once: yes
的预期行为,因为它会覆盖主机循环。
设置此选项后,任务仅执行一次(在批处理中的第一台主机上),但结果将复制到同一批次中的所有主机。因此,您最终会为每个主机定义custom_var
/ register_task
。
如果您想要相反,可以将run_once: yes
更改为条件语句,如:
when: play_hosts.index(inventory_hostname) == 0
这将仅在第一台主机上执行任务,但不会覆盖主机循环(由于条件,仍会跳过其他主机的任务);这种注册事实仅适用于第一台主机。