loops - 在 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
任何帮助或指示将不胜感激
解决方案
因此,我提出了以下解决方案,以使我们前进。它要求我们改变原来的数据结构,这不是什么大问题。
我的 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
该解决方案允许我为新字典和项目分配一个新名称,以及更新将被拾取并应用于新字典的源数据结构的能力。
希望这是有道理的,如果有人有更好的方法,请告诉我。
推荐阅读
- java - 如何修复“使用类路径资源中定义的名称创建 bean 时出错”?
- python - 如何在两个列表中找到紧密匹配的唯一元素?(这里使用距离函数)
- c++ - 在 VS2017 的库中查找符号
- python - 用于匹配子字符串的正则表达式
- reactjs - createBottomTabNavigator 保持安装堆栈
- javascript - 如何防止按键重复被触发 - JavaScript/jQuery
- java - 创建的通知android未显示在手机中
- excel - 运行时错误“1004”方法范围类的自动筛选失败
- javascript - 如何在 Leaflet 中单击时返回有关 geojson 多边形的详细信息?
- python - spark-submit 作业在集群模式下不起作用