如何在Ansible的localhost中获取workers组任意主机的变量?
解决Ansible跨Play获取run_once定义变量的问题
针对你遇到的场景,有两种简洁可行的解决方法:
方法一:直接将变量同步到localhost(推荐)
在第一个play的set_fact任务中,通过delegate_to和delegate_facts将变量直接定义在localhost上,后续localhost的play可以直接引用,无需查找具体执行主机。
修改后的第一个play任务:
- name: Some action on the workers hosts: workers gather_facts: false run_once: true tasks: - name: Set var for server information (sync to localhost) set_fact: server_info: "name": "winserver" "os": "Microsoft Windows Server 2019 Datacenter" delegate_to: localhost delegate_facts: true
此时第二个play无需修改,直接使用{{ server_info }}即可正常获取变量。
方法二:通过筛选hostvars动态查找
如果不想修改第一个play的逻辑,可以在localhost的play中,利用Ansible过滤器从workers组的主机变量中筛选出存在server_info的主机,再提取变量:
修改后的第二个play任务:
- name: Some action on the localhost hosts: localhost gather_facts: false run_once: true tasks: - name: Show script stdout debug: msg: "{{ groups['workers'] | map('extract', hostvars) | selectattr('server_info', 'defined') | first | json_query('server_info') }}"
过滤器逻辑说明:
groups['workers']:获取workers组的所有主机列表map('extract', hostvars):将主机列表映射为对应的hostvars对象selectattr('server_info', 'defined'):筛选出已定义server_info变量的主机first:取第一个符合条件的主机(因为run_once只会在一台主机上定义变量)json_query('server_info'):提取该主机的server_info变量
内容的提问来源于stack exchange,提问作者Tjerk
相关产品推荐
相关产品推荐

