一个任务中有多个with_items的问题

时间:2019-08-07 17:35:44

标签: ansible

我有一个包含多个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'] }}"

2 个答案:

答案 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组的所有主机迭代任务

希望有帮助