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

Ansible:根据指定的限制对子组或单个主机的输出名称进行条件检查,ansible,ansible-playbook,Ansible,Ansible Playbook,嗨,所有友好的汽车制造商 我使用ansible来管理一堆正在快速扩展的嵌入式linux节点上的任务。因为我们的项目使用hipchat,所以我认为有必要开始通知一个房间,这样我就不会在节点上工作时通过重新启动或其他方式来打扰研究人员 我已经根据交换机端口和VLAN将主机资源清册划分为子组。 因此,当我想对所有产品做一些事情时,我不使用限制选项。。 当我想对特定的节点链执行某些操作时,我将其限制为子组。。当我想单独做某件事时,我只限于主机名 因此,我在任务结束时使用notify来发布到hipchat

嗨,所有友好的汽车制造商

我使用ansible来管理一堆正在快速扩展的嵌入式linux节点上的任务。因为我们的项目使用hipchat,所以我认为有必要开始通知一个房间,这样我就不会在节点上工作时通过重新启动或其他方式来打扰研究人员

我已经根据交换机端口和VLAN将主机资源清册划分为子组。 因此,当我想对所有产品做一些事情时,我不使用限制选项。。 当我想对特定的节点链执行某些操作时,我将其限制为子组。。当我想单独做某件事时,我只限于主机名

因此,我在任务结束时使用notify来发布到hipchat,如下所示:

- name: "Notify hipchat" 
    hipchat_v2:
      msg='{{ inventory_hostname }} was updated from {{ version.stdout }} to {{ newversion.stdout }}'
问题是,当我在一批子组中执行系统范围更新之类的操作时,它会为每个节点向房间发送一条消息,这意味着几个小时内会有数百条消息,因此在这种情况下,我宁愿输出子组的名称

但是,我仍然希望能够将在单个主机上执行的相同操作通知room

这就是我的问题所在:

如果像我对{inventory hostname}所做的那样,操作被限制为单个主机名,那么有没有一种方法可以将playbook配置为使用条件测试来输出单个主机名,而如果操作被限制为子组,则只输出子组的名称

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

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

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

- 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
$ ansible-playbook reboot.yml --extra-vars="host=group_production"
本例假设任何组名都以前缀“group_u”开头,如果
host
变量包含“group_u”,则在主机Ansible运行时,第一个任务将调用hipchat任务。如果在主机变量中找不到“group_”,则第二个任务将调用该hipchat任务。所以你可以用这样的方式调用ansible:

- 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
$ ansible-playbook reboot.yml --extra-vars="host=group_production"