Ansible:根据指定的限制有条件地检查子组或单个主机的输出名称
Ansible: Conditional check to either output name of child group or individual host based on specified limit
各位友好的汽车魔术师大家好,
我正在使用 ansible 来管理一堆正在快速扩展的嵌入式 linux 节点上的任务。由于我们的项目使用的是 hipchat,我认为有必要开始通知一个房间,这样我就不会在节点上工作时通过重新启动或其他方式来烦扰研究人员。
我已根据主机的交换机端口和 vlan 将主机清单分成子组。
所以当我想对所有生产做某事时,我不使用限制选项..
当我想对特定的节点链执行某些操作时,我会限制为子组。当我想单独执行某些操作时,我会限制为主机名。
所以我在任务结束时使用通知 post 像这样聊天:
- 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
这是您可以做到的一种方法 - 我用我的一些剧本做了类似的事情。诀窍是具有明确定义的组名,并将主机、组等作为变量传递到您的脚本中。所以你的剧本可能看起来有点像这样:
- 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
变量,第一个任务将在主机 Ansible 上调用一次 hipchat 任务 运行包含 "group_"。如果在主机变量中找不到 "group_",第二个任务将调用该 hipchat 任务。所以你会用这样的东西调用ansible:
$ ansible-playbook reboot.yml --extra-vars="host=group_production"
各位友好的汽车魔术师大家好,
我正在使用 ansible 来管理一堆正在快速扩展的嵌入式 linux 节点上的任务。由于我们的项目使用的是 hipchat,我认为有必要开始通知一个房间,这样我就不会在节点上工作时通过重新启动或其他方式来烦扰研究人员。
我已根据主机的交换机端口和 vlan 将主机清单分成子组。 所以当我想对所有生产做某事时,我不使用限制选项.. 当我想对特定的节点链执行某些操作时,我会限制为子组。当我想单独执行某些操作时,我会限制为主机名。
所以我在任务结束时使用通知 post 像这样聊天:
- 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
这是您可以做到的一种方法 - 我用我的一些剧本做了类似的事情。诀窍是具有明确定义的组名,并将主机、组等作为变量传递到您的脚本中。所以你的剧本可能看起来有点像这样:
- 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
变量,第一个任务将在主机 Ansible 上调用一次 hipchat 任务 运行包含 "group_"。如果在主机变量中找不到 "group_",第二个任务将调用该 hipchat 任务。所以你会用这样的东西调用ansible:
$ ansible-playbook reboot.yml --extra-vars="host=group_production"