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
相关产品推荐
相关产品推荐

