【发布时间】:2020-03-13 13:42:14
【问题描述】:
注意:原始问题在此处扩展:Is there a way in Ansible to replace a dictionary value based on k:v lookup to another dictionary?
我有 3 个字典,前 2 个是 k:v 和 string:integer 类型值;我的第三个字典是字符串:字符串的 k:v,我想先用 dict #1 循环,然后用 k:v 替换 k,然后用 dict #2 替换,但用 k:v 替换 v。
"dict_1": {
"office-core01": 85,
"office-core02": 86,
"office-fw01": 87,
"office-fw02": 88,
"office-server-sw01": 91,
"office-vpn01": 92,
"office-vpn02": 93
}
"dict_2": {
"con1": 129,
"con2": 130,
"con3": 131,
"con4": 132,
"con5": 133,
"con6": 134,
"con7": 135,
"con8": 136,
"con9": 137
}
"dict_3": {
"office-core01": "con1",
"office-core02": "con2",
"office-fw01": "con3",
"office-fw02": "con4",
"office-server-sw01": "con7",
"office-vpn01": "con5",
"office-vpn02": "con6"
}
最后我需要一个包含 k:v 对整数的字典;例如,在第一次迭代中,我需要将 dict_3 中的主机名/密钥 (office-core01) 替换为 dict_1 (85) 中的值,然后第二次运行以替换端口/values (con1) 替换为 dict_2 (129) 中的键,但是使用 Vladimir 在原始问题中提供的代码抱怨 object of type 'int' has no len()。
包含任务(console-portid.yml):
---
- name: Replace Console Hostname ID
set_fact:
port_mapping: "{{ port_mapping | difference([item]) +
[dict(my_value | zip(my_keys))] }}"
vars:
my_key: "{{ item.keys() | list }}"
my_value: "{{ item.values() | list }}"
my_keys: "{{ my_key | map('regex_replace', port_id.key, port_id.value) | list }}"
loop: "{{ dict_3 | dict2items }}"
调用:
- name: Replace Device Console Ports ID
include_tasks: console-portid.yml
loop: "{{ dict_1 | dict2items }}"
loop_control:
loop_var: port_id
【问题讨论】:
标签: regex dictionary ansible jinja2