我的游戏中有3个主机。
[机器]
MongoDB在这些服务器上运行。其中一个服务器可以是Mongo的MasterDB。
因此,这些机器中的每一台都可以成为“主人”。这是通过设置机器是否为主机的事实来确定的,在此示例中仅针对MachineA:
- name: check if master
shell: 'shell command to check if master'
set_fact: MasterHost="machineA"
when: 'shell command to check if master'.stdout == "true"
这也适用于MachineB和MachineC。
实现的任务:仅在主机上运行命令,主机具有" MasterHost"。 我尝试了delegate_to模块,但delegate_to也使用了另外两台机器:
- name: some task
copy: src=/tmp/test.txt dest=/tmp/test.txt
delegate_to: "{{ MasterHost }}"
我想在我的playbook中定位主控器,并且只在主控器上运行命令,而不是在shell中通过--limit选项运行。
答案 0 :(得分:0)
假设运行命令以检查主机是否是主机并不昂贵,您可以不设置特定事实:
- name: check if master
shell: 'shell command to check if master'
register: master_check
- name: some task
copy: src=/tmp/test.txt dest=/tmp/test.txt
when: master_check.stdout == "true"
在所有主机上运行播放,只有主控播放器才会运行some task
。
答案 1 :(得分:0)
最终,这是我的答案。对不起第一篇文章,仍然在学习如何发表一篇好文章。日冰
- name: Check which host is master
shell: mongo --quiet --eval 'db.isMaster().ismaster'
register: mongoMaster
- name: Set fact for mongoMasterr
set_fact: MongoMasterHost="{{ item }}"
with_items: "{{ groups['HOSTS'] }}"
when: mongoMaster.stdout == "true"
- name: Copy local backup.tgz to master /var/lib/mongodb/backup
copy: src=/tmp/backup.tgz dest=/var/lib/backup/backup.tgz
when: mongoMaster.stdout == "true"
感谢您帮助我并指出了正确的方向。