首页 > 解决方案 > 在 Ansible 中的字典之间复制数据

问题描述

我在 yml 文件中有以下源数据结构:

animals:
  dogs:
    - { breed: "Golden Retriever", colour: "Golden" }
    - { breed: "Rottweiler", colour: "Black" }
    - { breed: "Labrador", colour: "Brown", "Black", "Cream" } 

我要做的是打开文件,遍历数据结构并复制它,这样我就得到了数据的精确副本。像这样:

animals:
  dogs:
    - { breed: "Golden Retriever", colour: "Golden" }
    - { breed: "Rottweiler", colour: "Black" }
    - { breed: "Labrador", colour: "Brown", "Black", "Cream" } 

animals:
  dogs:
    - { breed: "Golden Retriever", colour: "Golden" }
    - { breed: "Rottweiler", colour: "Black" }
    - { breed: "Labrador", colour: "Brown", "Black", "Cream" } 

我还需要能够从源数据源添加和删除数据,并且当我重新运行剧本时,复制的数据也会更新。

我花了一些时间来研究这个并且已经达到了这个效果,因为它没有给我我想要的东西:

- name: test
  hosts: localhost
  connection: local

  tasks:

    - name: Read the yaml
      slurp:
        path: ./animals.yml
      register: r_myfile

    - debug:
        var: r_myfile

    - name: Extract the data
      set_fact:
        mydata: "{{ r_myfile['content'] | b64decode | from_yaml }}"

    - debug:
        var: mydata

    - name: Populating the list of dictionaries in new dictionary
      blockinfile:
        dest: ./animals.yml
        block: "{{ mydata }}"

这就是上面的剧本给我的:

animals:
  dogs:
    - { breed: "Golden Retriever", colour: "Golden" }
    - { breed: "Rottweiler", colour: "Black" }
    - { breed: "Labrador", colour: "Brown", "Black", "Cream" } 


# BEGIN ANSIBLE MANAGED BLOCK
{'animals': {'dogs': [{'colour': 'Golden', 'breed': 'Golden Retriever'}, {'colour': 'Black', 'breed': 'Rottweiler'}, {'colour': 'Brown', 'breed': 'Labrador', 'Black': None, 'Cream': None}]}}
# END ANSIBLE MANAGED BLOCK

任何帮助或指示将不胜感激

标签: loopsdictionary

解决方案


因此,我提出了以下解决方案,以使我们前进。它要求我们改变原来的数据结构,这不是什么大问题。

我的 yml 文件中的新数据结构格式:

animals:
  dogs:
    - breed: "Golden Retriever" 
      colour: "Golden" 
    - breed: "Rottweiler" 
      colour: "Black"
    - breed: "Labrador" 
      colour: 
      - "Brown" 
      - "Black" 
      - "Cream"

这是我的新剧本的样子:

- name: test
  hosts: localhost
  connection: local
  vars_files:
    - ./animals.yml
  vars:
    new_dict: "new_animals"
    new_item: "new_dogs"

  tasks:

    - debug:
        var: animals.dogs

    - name: Insert/Update data
      blockinfile:
        block: |
          {{ new_dict }}:
            {{ new_item }}:
              {{ animals.dogs | to_nice_yaml(width=80, indent=2) | indent(4) }}
        dest: ./animals.yml

该解决方案允许我为新字典和项目分配一个新名称,以及更新将被拾取并应用于新字典的源数据结构的能力。

希望这是有道理的,如果有人有更好的方法,请告诉我。


推荐阅读