Ansible技术问询:获取playbook的hosts键值及执行主机组名
Ansible 常见问题解答
1. 如何从Ansible Play/Playbook中获取"hosts"键的值?
你可以直接用Ansible内置的上下文变量 ansible_play.hosts,它会返回当前Play里hosts字段定义的原始内容。比如你的Play写的是hosts: my-host-group,这个变量就会返回字符串my-host-group。
另外还有个变量ansible_play_pattern,作用和它类似,也能拿到Play中指定的主机匹配模式。
给你个实际使用的任务示例:
- name: 打印当前Play的hosts配置 debug: msg: "当前Play指定的主机/组是: {{ ansible_play.hosts }}"
2. 在Ansible 2.3.2.0中,如何通过ansible_play_hosts获取对应的实际组名?
已知ansible_play_hosts是当前Play执行的所有主机列表,要找出包含这些主机的组名,可以借助Ansible的groups变量(它存储了所有主机组与对应主机的映射关系)来实现。
因为Ansible 2.3还没有dict2items这类过滤器,我们可以用with_dict循环所有组,对比组内主机列表和ansible_play_hosts(统一排序避免顺序影响匹配),找到完全匹配的组:
- name: 找出包含所有执行主机的目标组 set_fact: target_group: "{{ item.key }}" when: "item.value | sort == ansible_play_hosts | sort" with_dict: "{{ groups }}" - name: 打印目标组名 debug: msg: "包含所有执行主机的组是: {{ target_group }}"
如果你的Play里hosts字段直接指定了单个组(就像你示例里的my-host-group),其实也可以直接用第一个问题里的ansible_play.hosts变量,一步就能拿到组名,更省事:
- name: 直接获取Play指定的组名 debug: msg: "Play指定的组名是: {{ ansible_play.hosts }}"
不过上面的遍历方法更通用,哪怕Play的hosts是多个组的组合或者复杂匹配模式,也能找出包含所有执行主机的组。
内容的提问来源于stack exchange,提问作者Sami Badra
相关产品推荐
相关产品推荐

