是否有任何方法通过字典注册变量与Jinja2组合的Ansible列表进行循环?



在我的库存中,我有3个服务器在一个组中。我希望将来能够增加这个大小,这样我就可以在网络中添加更多节点,并使用Jinja2生成模板。

- name: Gathering API results
shell: 
cmd: "curl {{ groups['nodes'][node_index] }}/whatever/api/result "
loop: "{{ groups['nodes'] }}"
loop_control:
index_var: node_index
register: api_value

如果我运行一些调试任务,硬编码我想使用的列表,一切都很好

- debug: "msg={{ api_value.results.0.stdout }}"
- debug: "msg={{ api_value.results.1.stdout }}"
- debug: "msg={{ api_value.results.2.stdout }}"

输出:

ok: [server-1] => {
"msg": "random-value-a"
ok: [server-2] => {
"msg": "random-value-b"    
ok: [server-3] => {
"msg": "random-value-c"

问题是当我试图增加列表数量在Jinja模板。我尝试了几个for循环组合,嵌套for循环和许多其他东西,但似乎没有工作。

例如,我想让我的Jinja模板看起来像这样:

{% for vm in groups['nodes'] %}
NODE_{{ loop.index }}={{ api_value.results.{loop.index}.stdout }}
{% endfor %}

这样我就可以得到这样的输出:

NODE_0=random-value-a
NODE_1=random-value-b
NODE_2=random-value-c

有其他的方法来解决这个问题吗?或者我可以在"收集API结果"中做得更好。任务?

给定库存

shell> cat hosts
[nodes]
server-1
server-2
server-3
  1. 在单个主机上循环运行,例如
- hosts: localhost
gather_facts: false
vars:
whatever_api_result:
server-1: random-value-a
server-2: random-value-b
server-3: random-value-c
tasks:
- command: "echo {{ whatever_api_result[item] }}"
register: api_value
loop: "{{ groups.nodes }}"
- debug:
msg: "{{ api_value.results|json_query('[].[item, stdout]') }}"

msg:
- - server-1
- random-value-a
- - server-2
- random-value-b
- - server-3
- random-value-c
然后,在Jinja模板中,修复索引变量
- debug:
msg: |-
{% for vm in groups.nodes %}
NODE_{{ loop.index0 }}={{ api_value.results[loop.index0].stdout }}
{% endfor %}

给你想要的

msg: |-
NODE_0=random-value-a
NODE_1=random-value-b
NODE_2=random-value-c

可选地迭代api_value.results。这将得到相同的结果

- debug:
msg: |-
{% for v in api_value.results %}
NODE_{{ loop.index0 }}={{ v.stdout }}
{% endfor %}

  1. 或者在组内运行,例如
- hosts: nodes
gather_facts: false
vars:
whatever_api_result:
server-1: random-value-a
server-2: random-value-b
server-3: random-value-c
tasks:
- command: "echo {{ whatever_api_result[inventory_hostname] }}"
register: api_value
delegate_to: localhost
- debug:
msg: "{{ api_value.stdout }}"

(委托给localhost进行测试)

ok: [server-1] => 
msg: random-value-a
ok: [server-2] => 
msg: random-value-b
ok: [server-3] => 
msg: random-value-c

然后,在Jinja模板中使用hostvars

- debug:
msg: |-
{% for vm in groups.nodes %}
NODE_{{ loop.index0 }}={{ hostvars[vm].api_value.stdout }}
{% endfor %}
run_once: true

给出你想要的

msg: |-
NODE_0=random-value-a
NODE_1=random-value-b
NODE_2=random-value-c

可选地迭代hostvars。这将得到相同的结果

- debug:
msg: |-
{% for k,v in hostvars.items() %}
NODE_{{ loop.index0 }}={{ v.api_value.stdout }}
{% endfor %}
run_once: true

相关内容

  • 没有找到相关文章

最新更新