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

Ansible:如何从嵌套字典中提取testnet1的对应值?

解决方案

有两种可行的方式提取testnet1对应的数组值,具体如下:

方式一:直接传递networks数据(更高效)

修改main.yaml中传递给abc.yml的machinesvar变量,只传入服务器的networks部分,避免无效遍历domain项:

- name: create 
  hosts: all

  vars:
    machines : "{{ lookup('file','123.json') | from_json }}"

  tasks:
  - name: Create Networks(s)
    include_tasks:
      file: abc.yaml        
    vars:
      nodename: "{{ inventory_hostname }}"
      # 仅传递networks的键值对列表
      machinesvar: "{{ machines[nodename].networks | dict2items }}"

然后修改abc.yml,直接遍历networks项,筛选出testnet1并提取对应值:

- name: Process testnet1
  debug:
    msg: |
         testnet1接口: {{ item.value[0] }}
         testnet1 IP: {{ item.value[1] }}
  loop: "{{ machinesvar }}"
  # 仅处理testnet1的条目
  when: item.key == 'testnet1'
  loop_control:
    loop_var: item
    label: "{{ item.key }}" # 优化loop输出标签,更简洁

方式二:在abc.yml中过滤后提取

如果需要保留原有main.yaml的传递逻辑,可在abc.yml中先筛选出networks项,再提取testnet1的值:

- name: 提取testnet1信息
  set_fact:
    testnet1_data: "{{ targetserver_networks.value.testnet1 }}"
  # 仅处理networks对应的条目
  when: targetserver_networks.key == 'networks'
  loop: "{{ machinesvar }}"
  loop_control:
    loop_var: targetserver_networks

- name: 用testnet1数据执行后续操作
  debug:
    msg: |
         接口名称: {{ testnet1_data[0] }}
         IP地址: {{ testnet1_data[1] }}
  # 确保变量已定义再执行
  when: testnet1_data is defined

关键说明

  • dict2items过滤器会把字典转为[{"key": "xxx", "value": "xxx"}]格式的列表,因此可通过item.key判断键名,item.value获取对应值。
  • 拿到testnet1的数组后,用索引[0]提取接口名称,[1]提取IP地址,即可用于后续配置操作。

内容的提问来源于stack exchange,提问作者Akash-BLR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 02:00:26