Ansible 任务中有多个with_项的问题

Ansible 任务中有多个with_项的问题,ansible,Ansible,我有一个任务,它有多个with_项,因此在委托中选择最新定义的项,这不是预期的结果 - 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:

我有一个任务,它有多个with_项,因此在委托中选择最新定义的项,这不是预期的结果

- 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'] }}"

事实上,我认为这是一个简单的工作

- 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

有关详细信息,请参见。

您不能有两个带有项目的
子句。假设您希望迭代列表
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活动
组的第一个主机(假设只有一个主机作为澄清状态),并为
mongodb仲裁器
组的所有主机迭代任务


希望有帮助

感谢您的回复,活动组只有主机1服务器,因此我需要使用带有委托的活动组,以便在主机2和主机3(添加到组仲裁器)上的rs.add的shell执行命令仅在主机1(活动)上运行。希望你能满足我的要求。对不起,我不确定我是否能满足要求。你想在orbiter group的每台主机上运行主机1次shell模块吗?是的,这是要求。请参阅我答案的更新部分,希望我现在就实现了你的目标:)谢谢你的回答,但剧本的编写方式是,对于所有主机,角色都是映射的,在角色文件夹中,我们有单独的yaml文件和任务。为了完成这项任务,我必须改变整个结构。是否无法使用委托函数仅在活动服务器上运行此任务?