Ansible如何生成委托至localhost的全量主机IP列表?
解决Ansible中生成general组所有主机IP列表的问题
你的问题核心是每次执行set_fact时直接覆盖了ip_list变量,导致最后只保留了最后一台主机的IP。下面提供两种可行的解决方法:
方法一:直接通过Inventory生成列表(推荐)
不需要遍历每个主机执行任务,直接在localhost的Play中利用Ansible内置的inventory变量生成IP列表,效率更高:
- hosts: general gather_facts: false # 无需额外任务,Inventory已加载所有主机信息 - hosts: localhost gather_facts: false tasks: - name: 生成general组所有主机IP列表 set_fact: ip_list: "{{ groups['general'] | map('extract', hostvars, 'ansible_host') | list }}" - name: 显示收集到的IP debug: var: ip_list
逻辑说明:
groups['general']:获取general组下的所有主机名map('extract', hostvars, 'ansible_host'):从hostvars字典中提取每个主机对应的ansible_host(即IP地址)| list:将提取结果转换为列表格式
方法二:修改原任务为追加模式
如果需要保留原有的任务结构,可以通过default([])初始化空列表,每次执行时将当前主机IP追加到列表中,避免覆盖:
- hosts: general gather_facts: false tasks: - name: 收集所有IP并追加到列表 set_fact: ip_list: "{{ ip_list | default([]) + [hostvars[inventory_hostname].ansible_host] }}" delegate_to: localhost delegate_facts: true - hosts: localhost gather_facts: false tasks: - name: 显示收集到的IP debug: var: ip_list
逻辑说明:
ip_list | default([]):第一次执行时,ip_list不存在,默认使用空列表+ [hostvars[inventory_hostname].ansible_host]:将当前主机的IP以列表元素的形式追加到ip_list中,避免直接覆盖原有值
内容的提问来源于stack exchange,提问作者AbreQueVoy
相关产品推荐
相关产品推荐

