注:原问题在此扩展:在Ansible中是否有一种方法可以替换基于k:v查找另一个字典的字典值?
我有3部字典,前2部是k:v和字符串:整型值;我的第三部字典是字符串的k:v,我想先用dict #1循环,然后用k:v替换k:v,然后用t #2替换v,然后用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中的主机名/键dict_3替换为来自dict_1的值(85),然后第二次运行替换端口/值(con1),替换为来自dict_2的密钥(129),但是使用弗拉基米尔在原始问题中提供的代码来抱怨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发布于 2020-03-13 14:30:49
问:“我想把office-core01: con1变成85: 129”
A:下面的任务就是完成这项工作。
- set_fact:
dict_3a: "{{ dict_3a|default({})|
combine({dict_1[item.key]: dict_2[item.value]}) }}"
loop: "{{ dict_3|dict2items }}"
- debug:
var: dict_3a给
"dict_3a": {
"85": 129,
"86": 130,
"87": 131,
"88": 132,
"91": 135,
"92": 133,
"93": 134
}问:“键仍然是字符串和值仍然是整数吗?”
答:保留变量的内部类型。除非由本土化配置,否则变量将计算为字符串。引用“此选项在模板操作期间保留变量类型。这需要Jinja2 >= 2.10。”
问:“键是字符串而值仍然是整数吗?键总是必须是字符串吗?”
对钥匙没有任何限制。引用3.2.1.1.节点
YAML节点表示单个本机数据结构。这些节点具有三种内容之一:标量、序列或映射。此外,每个节点都有一个标记,用于限制内容可能具有的值集。 “映射:映射节点的内容是一组无序的键:值节点对,但每个键都是唯一的。YAML不对节点设置进一步的限制。尤其是,键可能是任意的n个odes,同一个节点可以用作几个键:值对的值,映射甚至可以将自己包含为键或值(直接或间接)。”
发布于 2020-03-13 14:52:29
---
- hosts: localhost
gather_facts: no
tasks:
- name: Loop over dict_3
debug:
msg: "{{ item.key }}: {{ item.value }}"
with_items: "{{ lookup('dict', dict_3) }}"
- name: Loop over dict_3 with replacements
debug:
msg: "{{ dict_1[item.key] }}: {{ dict_2[item.value] }}"
with_items: "{{ lookup('dict', dict_3) }}"
- name: Create new dictionary
set_fact:
dict_4: "{{ dict_4|default({}) | combine( {dict_1[item.key]: dict_2[item.value]} ) }}"
with_items: "{{ lookup('dict', dict_3) }}"
- name: Show dict_4
debug:
var: dict_4https://stackoverflow.com/questions/60671583
复制相似问题