Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 在Ansible中的词典之间复制数据_Loops_Dictionary - Fatal编程技术网

Loops 在Ansible中的词典之间复制数据

Loops 在Ansible中的词典之间复制数据,loops,dictionary,Loops,Dictionary,我在yml文件中有以下源数据结构: animals: dogs: - { breed: "Golden Retriever", colour: "Golden" } - { breed: "Rottweiler", colour: "Black" } - { breed: "Labrador", colour: "Brown", "Black", "Cream" } animals: dogs: - breed: "Golden Retriever"

我在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" } 

animals:
  dogs:
    - { breed: "Golden Retriever", colour: "Golden" }
    - { breed: "Rottweiler", colour: "Black" }
    - { breed: "Labrador", colour: "Brown", "Black", "Cream" } 
我还需要能够从源数据源添加和删除数据,当我重新运行playbook时,复制的数据也会更新

我花了一点时间研究这一点,但这并不是很好,因为它没有给我想要的:

- 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

任何帮助或指点都将不胜感激

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

my 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"
我的新剧本是这样的:

- 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
该解决方案允许我为新字典和条目分配一个新名称,并能够更新将被拾取并应用到新字典的源数据结构

希望这是有意义的,如果有人有更好的方法,请让我知道