Ansible 任务中有多个with_项的问题
我有一个任务,它有多个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:
- 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文件和任务。为了完成这项任务,我必须改变整个结构。是否无法使用委托函数仅在活动服务器上运行此任务?