2016-10-17 42 views
-1

我的游戏中有3个主机。Ansible目标特定主机(不是delegate_to)

[机器]

  • MACHINEA
  • 到machineB
  • 机C

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和机C完成。

实现目标:仅在主机上运行命令,该主机具有“MasterHost”事实。 我试过delegate_to模块,但也delegate_to使用两个其他机器:

- name: some task 
    copy: src=/tmp/test.txt dest=/tmp/test.txt 
    delegate_to: "{{ MasterHost }}" 

我要定位的主人在我的剧本和运行只能通过命令--limit上的主,而不是在壳选项。

+0

'shell'和'set_fact'是模块,因此你的第一个任务包含语法错误。你的第二个任务目的完全不清楚。好像你只需要'when:master.stdout ==“true”',但除非你指定了你想要的,这是一个猜谜游戏。 – techraf

+0

这是一个基本的例子,抛开了语法错误。 我想在MasterHost上执行命令,并排除播放中的其他主机。 – Kevin

回答

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

+0

谢谢你的回答。 – Kevin

+0

...仍然习惯了stackoverflow和如何正确评论,甚至编辑。 无论如何,还有我的工作是使用'code'run_once:true – Kevin

+1

@Kevin'run_once'和'delegate_to'是错误的路要走。使用@ demienfrancois的建议。 –

0

最终,这是我的答案。对不起,第一篇文章,仍然在学习如何做一个好帖子。 Hihi

- 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" 

感谢您的帮助,并指引我走向正确的方向。