首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Ansible/Jinja中,是否有一种使用k:v对字典来使用整数的regex_replace字符串?

在Ansible/Jinja中,是否有一种使用k:v对字典来使用整数的regex_replace字符串?
EN

Stack Overflow用户
提问于 2020-03-13 13:42:14
回答 2查看 1.7K关注 0票数 1

注:原问题在此扩展:在Ansible中是否有一种方法可以替换基于k:v查找另一个字典的字典值?

我有3部字典,前2部是k:v和字符串:整型值;我的第三部字典是字符串的k:v,我想先用dict #1循环,然后用k:v替换k:v,然后用t #2替换v,然后用k:v替换v。

代码语言:javascript
复制
"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):

代码语言:javascript
复制
---
  - 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 }}"

调用:

代码语言:javascript
复制
- name: Replace Device Console Ports ID
  include_tasks: console-portid.yml
  loop: "{{ dict_1 | dict2items }}"
  loop_control:
    loop_var: port_id
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-13 14:30:49

问:“我想把office-core01: con1变成85: 129”

A:下面的任务就是完成这项工作。

代码语言:javascript
复制
    - set_fact:
        dict_3a: "{{ dict_3a|default({})|
                     combine({dict_1[item.key]: dict_2[item.value]}) }}"
      loop: "{{ dict_3|dict2items }}"
    - debug:
        var: dict_3a

代码语言:javascript
复制
    "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,同一个节点可以用作几个键:值对的值,映射甚至可以将自己包含为键或值(直接或间接)。”

票数 1
EN

Stack Overflow用户

发布于 2020-03-13 14:52:29

代码语言:javascript
复制
---
- 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_4
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60671583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档