Ansible:根据指定的限制条件检查子组或单个主机的输出名称

时间:2015-03-09 04:44:10

标签: ansible ansible-playbook

嗨,欢迎所有友好的自动人士,

我使用ansible来管理快速扩展的嵌入式Linux节点堆上的任务。由于我们的项目使用了hipchat,我认为开始通知房间是必要的,因此我不会通过重新启动或在节点上工作时保持讨厌的研究人员。

我已根据交换机端口和vlan将主机清单划分为子组。 因此,当我想对所有制作做一些事情时,我不会使用限制选项。 当我想对特定的节点链做某事时,我限制为一个子组..当我想单独做某事时,我限制为主机名。

所以我在任务结束时使用通知发布到hipchat,如下所示:

- name: "Notify hipchat" 
    hipchat_v2:
      msg='{{ inventory_hostname }} was updated from {{ version.stdout }} to {{ newversion.stdout }}'

问题在于,当我在批量子组中进行系统范围更新等操作时,它会导致每个节点到房间的消息,这将意味着数百个小时,所以在在这种情况下,我宁愿输出子组的名称。

但是我仍然希望能够通知会议室对单个主机执行的相同操作。

我的问题出现在哪里:

我是否有办法将剧本配置为使用条件测试以输出单个主机名,如果操作仅限于单个主机名,例如我使用{{inventory hostname}},但是,如果操作仅限于子组,则仅输出子组的名称?

所以在逻辑流程中(是的,我知道这不是真正的代码 - 只是代码逻辑),类似于:

If --limit option = group
then print group
elif --limit option = group:research-nodes
then print research-nodes
elif --limit option = individual host
then print hostname
fi

1 个答案:

答案 0 :(得分:2)

这是你可以做到的一种方式 - 我用我的一些剧本做类似的事情。诀窍是拥有定义良好的组名,并将主机,组等作为变量传递到脚本中。所以你的剧本可能看起来像这样:

- hosts: "{{ host }}"
- tasks: 
    - name: reboot node
      command: shutdown -r now

    - name: Group notify
      local_action: hipchat_v2 msg="Group {{ host }} was rebooted"
      run_once: true
      when: host.find("group_") != -1

    - name: Individual notify
      local_action: hipchat_v2 msg="Host {{ inventory_hostname }} was rebooted"
      when: host.find("group_") == -1

这个例子假设任何组名都以前缀" group _"开头。如果host变量包含" group _",则第一个任务将在主机Ansible运行时调用hipchat任务一次。如果" group _"那么第二个任务将调用hipchat任务。在主变量中找不到。所以你会用这样的东西来调用ansible:

$ ansible-playbook reboot.yml --extra-vars="host=group_production"