我有一个包含多个with_items的任务,因此在委托中选择了最新定义的项目,而不是预期的结果
- name: Add secondaries
run_once: true
delegate_to: "{{ item }}"
with_items:
- "{{ groups['mongodb-active'] }}"
shell: /usr/bin/mongo --eval 'printjson(rs.add("{{ item }}:27017"))'
with_items:
- "{{ groups['mongodb-arbiter'] }}"
答案 0 :(得分:1)
实际上,我认为这是一项简单的工作。
- hosts: mongodb-active
tasks:
- shell: /usr/bin/mongo --eval 'printjson(rs.add("{{ item }}:27017"))'
loop: "{{ groups['mongodb-arbiter'] }}"
否则,可以包含任务
$ cat mongo-eval.yml
- shell: /usr/bin/mongo --eval 'printjson(rs.add("{{ item }}:27017"))'
loop: "{{ groups['mongodb-active'] }}"
delegate_to: "{{ delegate_host }}"
然后从那里委托
- name: Add secondaries
run_once: true
include_tasks: mongo-eval.yml
loop: "{{ groups['mongodb-arbiter'] }}"
loop_control:
loop_var: delegate_host
有关详细信息,请参见Execute an entire yaml task file one host after the other in ansible。
答案 1 :(得分:1)
您不能有两个with_items
子句。假设您要遍历列表groups['mongodb-active']
并为groups['mongodb-arbiter']
列表中的每个项目执行shell模块,您可以这样做:
---
- hosts: localhost
gather_facts: false
vars:
mongodb_active_list:
- host1
- host2
- host3
mongodb_arbiter_list:
- json_a
- json_b
- json_c
tasks:
- name: print debug
debug:
msg: "running on host: {{ item.0 }}, shell module with argument: {{ item.1 }}"
loop: "{{ query('nested', mongodb_active_list, mongodb_arbiter_list) }}"
更新:
在更好地理解需求之后,我建议的任务是:
- name: Add secondaries
delegate_to: "{{ groups['mongodb-active'][0] }}"
shell: /usr/bin/mongo --eval 'printjson(rs.add("{{ item }}:27017"))'
with_items:
- "{{ groups['mongodb-arbiter'] }}"
它将任务委派给mongodb-active
组的第一台主机(假定只有1个主机作为澄清状态),并为mongodb-arbiter
组的所有主机迭代任务
希望有帮助