Loops 在Ansible中的词典之间复制数据
我在yml文件中有以下源数据结构: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"
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
该解决方案允许我为新字典和条目分配一个新名称,并能够更新将被拾取并应用到新字典的源数据结构
希望这是有意义的,如果有人有更好的方法,请让我知道