在我的库存中,我有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
- 在单个主机上循环运行,例如
- 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 %}
- 或者在组内运行,例如
- 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