You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 09:07:19