1

我有主机名的 k:v 字典:IP 我想在另一个字典的查找中使用它来替换第一个字典中匹配键的条目并将其替换为第二个字典中的相应值;

第一个:

"nb_console_ip": {
    "office-con01": "10.20.30.100",

第二:

"nb_console_port": [
        {
            "console": "office-con01", 
            "hostname": "office-core01", 
            "port": "con1"
        }, 
        {
            "console": "office-con01", 
            "hostname": "office-core02", 
            "port": "con2"
        }, 
        {
            "console": "office-con01", 
            "hostname": "office-fw01", 
            "port": "con5"
        }, 
        {
            "console": "office-con01", 
            "hostname": "office-fw02", 
            "port": "con6"
        }, 
        {
            "console": "office-con01", 
            "hostname": "office-vpn01", 
            "port": "con3"
        }, 
        {
            "console": "office-con01", 
            "hostname": "office-vpn02", 
            "port": "con4"
        }
    ]

本质上,我试图用查找和替换的方式为第二个字典设置_fact,office-con0110.20.30.100对于 30 多个主机的列表。原因是我有一个 jinja 模板,它将使用 console_ip、主机名和端口的 3 个值。我在想也许有更适合查找、查找、替换等的过滤器。这两组数据都是从 API 调用返回的 json_query 的结果。

4

1 回答 1

1

可以在每次迭代中循环include_tasks和替换。k:v例如,使用替换outer_item.key: outer_item.value从外部循环提交的任务创建一个文件

shell> cat test-task.yml
- set_fact:
    nb_console_port: "{{ nb_console_port|difference([item]) +
                         [dict(my_keys|zip(my_values2))] }}"
  vars:
    my_keys: "{{ item.keys()|list }}"
    my_values: "{{ item.values()|list }}"
    my_values2: "{{ my_values|
                   map('regex_replace', outer_item.key, outer_item.value)|
                   list }}"
  loop: "{{ nb_console_port }}"

然后下面的剧本就可以完成这项工作。变量nb_console_port存储在文件中test-data.yml

shell> cat test.yml
- hosts: localhost

  vars:

    nb_console_ip:
      office-con01: "10.20.30.100"
      office-con02: "10.20.30.101"
      office-con03: "10.20.30.102"

  tasks:

    - include_vars: test-data.yml

    - include_tasks: test-task.yml
      loop: "{{ nb_console_ip|dict2items }}"
      loop_control:
        loop_var: outer_item

    - debug:
        var: nb_console_port
于 2020-03-06T22:35:44.130 回答