【问题标题】:Ansible - Replace values in a dictionary by looping through another dictionaryAnsible - 通过循环遍历另一个字典来替换字典中的值
【发布时间】:2023-02-10 22:55:08
【问题描述】:

我有两个字典如下

"fictional_characters": {
   "male": [
      "Donkey",
      "Humpty",
      "Piranha"
   ],
   "female": [
      "Fiona",
      "Kitty_Softpaws",
      "Diane_Foxington"
   ]
}

"movie_names": {
   "Donkey": "Shrek",
   "Humpty": "Puss_in_Boots",
   "Piranha": "The_Bad_Guys",
   "Fiona": "Shrek",
   "Kitty_Softpaws": "Puss_in_Boots",
   "Diane_Foxingtin": "The_Bad_Guys"
}

我想将“fictional_characters”中的字典值更改为“movie_names”中的值,例如

"fictional_characters": {
   "male": [
      "Shrek",
      "Puss_in_Boots",
      "The_Bad_Guys"
   ],
   "female": [
      "Shrek",
      "Puss_in_Boots",
      "The_Bad_Guys"
   ]
}

我首先将“fictional_characters”字典转换为列表

- name: Convert fictional_characters to a list
  set_fact:
    fictional_characters_list: "{{fictional_characters | dict2items }}"

那给了我

"fictional_characters_list": [
  {
    "key": "male",
    "value": [
      "Donkey",
      "Humpty",
      "Piranha"
    ],
  },
    "key": "female",
    "value": [
      "Fiona",
      "Kitty_Softpaws",
      "Diane_Foxington"
    ]
  }
]

接下来,一些金贾

- name: Using Jinja to swap dict values
  set_fact:
    fict_char_movies: |
      {% for e in fictional_characters_list %}
      {{ e.key }}:
      {% for char in e.value %}
      {% if char in movie_names %}
        - {{ movie_names[char]|split(',') %}
      {% endif %}
      {% endfor %}
      {% endfor %}

- name: Print the result
  debug:
    msg: "{{ fict_char_movies | from_yaml }}"

以上返回以下结果

"male": [
  [
    "Shrek"
  ],
  [
    "Puss_in_Boots"
  ],
  [
    "The_Bad_Guys"
  ],
"female": [
  [
    "Shrek"
  ],
  [
    "Puss_in_Boots"
  ],
  [
    "The_Bad_Guys"
  ]
]

如何摆脱这个嵌套列表,以便获得以下结构?

"fictional_characters": {
   "male": [
      "Shrek",
      "Puss_in_Boots",
      "The_Bad_Guys"
   ],
   "female": [
      "Shrek",
      "Puss_in_Boots",
      "The_Bad_Guys"
   ]
}

【问题讨论】:

    标签: dictionary replace ansible key-value


    【解决方案1】:

    下面的声明

      fict_char_movies_str: |
        {% for k,v in fictional_characters.items() %}
        {{ k }}:
        {% for char in v %}
        {% if char in movie_names %}
          - {{ movie_names[char] }}
        {% endif %}
        {% endfor %}
        {% endfor %}
      fict_char_movies: "{{ fict_char_movies_str|from_yaml }}"
    

    给你想要的

      fict_char_movies:
        female:
        - Shrek
        - Puss_in_Boots
        - The_Bad_Guys
        male:
        - Shrek
        - Puss_in_Boots
        - The_Bad_Guys
    

    用于测试的完整剧本示例

    - hosts: localhost
    
      vars:
    
        fictional_characters:
          female:
          - Fiona
          - Kitty_Softpaws
          - Diane_Foxington
          male:
          - Donkey
          - Humpty
          - Piranha
    
        movie_names:
          Diane_Foxington: The_Bad_Guys
          Donkey: Shrek
          Fiona: Shrek
          Humpty: Puss_in_Boots
          Kitty_Softpaws: Puss_in_Boots
          Piranha: The_Bad_Guys
    
        fict_char_movies_str: |
          {% for k,v in fictional_characters.items() %}
          {{ k }}:
          {% for char in v %}
          {% if char in movie_names %}
            - {{ movie_names[char] }}
          {% endif %}
          {% endfor %}
          {% endfor %}
        fict_char_movies: "{{ fict_char_movies_str|from_yaml }}"
    
      tasks:
    
        - debug:
            var: fict_char_movies
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-04
      • 2021-06-11
      • 2022-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多