如何在Ansible中动态获取列表内未知变量的名称
在Ansible中提取字典列表内的字典键名(动态主机名)
你需要处理的是由单键字典组成的列表,每个字典的键就是目标主机名(如host1_name),值是该主机对应的变量集合。可以通过Ansible内置过滤器直接提取这些键名,以下是具体实现方案:
场景重现
你的变量结构如下:
host_inputs: - host1_name: var1: value1 var2: value2 - host2_name: var1: value1 var2: value2 - host3_name: var1: value1 var2: value2 - host4_name: var1: value1 var2: value2
解决方案
由于列表中每个元素都是仅含一个键值对的字典,有两种简洁方式提取键名:
方法1:使用dict2items转换结构
dict2items会将单个字典转换为包含key和value字段的列表,再通过first过滤器取第一个元素即可拿到目标键名:
- name: 提取主机名并处理变量 hosts: localhost vars: host_inputs: - host1_name: var1: value1 var2: value2 - host2_name: var1: value1 var2: value2 tasks: - name: 遍历主机列表 debug: msg: "主机名: {{ item_hostname }}, 主机变量: {{ item_vars }}" loop: "{{ host_inputs }}" vars: converted_item: "{{ item | dict2items | first }}" item_hostname: "{{ converted_item.key }}" item_vars: "{{ converted_item.value }}"
方法2:直接提取字典的第一个键
利用keys()方法获取字典的所有键,再通过first过滤器取唯一的键:
- name: 提取主机名并处理变量 hosts: localhost vars: host_inputs: - host1_name: var1: value1 var2: value2 - host2_name: var1: value1 var2: value2 tasks: - name: 遍历主机列表 debug: msg: "主机名: {{ item_hostname }}, 主机变量: {{ item[item_hostname] }}" loop: "{{ host_inputs }}" vars: item_hostname: "{{ item.keys() | first }}"
实际应用(构建AWX清单)
如果要将这些主机添加到AWX清单,可在循环中使用add_host模块,用提取到的item_hostname作为主机名,item_vars作为主机变量:
- name: 动态添加主机到AWX清单组 hosts: localhost vars: host_inputs: - host1_name: var1: value1 var2: value2 - host2_name: var1: value1 var2: value2 tasks: - name: 添加主机到目标组 add_host: name: "{{ item_hostname }}" groups: "target_hosts" vars: "{{ item_vars }}" loop: "{{ host_inputs }}" vars: item_hostname: "{{ item.keys() | first }}" item_vars: "{{ item[item_hostname] }}"
内容的提问来源于stack exchange,提问作者Ezekiel Cosentino
相关产品推荐
相关产品推荐

