我需要修改一个yaml文件(schleuder configuration),我想从一个ansible playbook中执行此操作 - 是否有一个模块可以执行此操作?很难谷歌这一点,所有出现的是如何写剧本。
答案 0 :(得分:20)
我还需要配置管理yaml文件。我编写了一个ansible模块,在编辑yaml文件时尝试成为幂等的。
我称之为yedit(yaml-edit)。 https://github.com/kwoodson/ansible-role-yedit
如果您觉得它有用,请告诉我。当我们的团队遇到需求,请求或拉取请求时,我会添加功能。
这是一个简单的剧本示例:
roles:
- lib_yaml_editor
tasks:
- name: edit some yaml
yedit:
src: /path/to/yaml/file
key: foo
value: bar
- name: more complex data structure
yedit:
src: /path/to/yaml/file
key: a#b#c#d
value:
e:
f: This is a test
应该产生这样的东西:
foo: bar
a:
b:
c:
d:
e:
f: This is a test
编辑:5/27/2018
答案 1 :(得分:1)
没有这样的模块。您可以通过查看https://docs.ansible.com/ansible/list_of_all_modules.html
来查看此信息您最好的选择是使用lineinfile或template或copy模块。
答案 2 :(得分:1)
完成此操作的一种方法是将文件读入事实,根据需要更新事实,然后将事实写回到yaml文件中。
- name: Read the yaml
slurp:
path: myfile.yaml
register: r_myfile
- name: extract the data
set_fact:
mydata: "{{ r_myfile['content'] | b64decode | from_yaml }}"
然后根据需要更新事实。
- name: Write back to a file
copy:
content: '{{ mydata | to_nice_yaml }}'
dest: myfile.yaml
您当然需要意识到,这会使整个更新变得非原子性。
更新:我最初的建议是使用lookup('file'),但是当然可以访问本地文件。 slurp是读取远程文件的正确方法。
答案 3 :(得分:1)
根据 Kevin 和 Bogd 的回答,如果您想合并嵌套键而不是覆盖 YAML 文件的整个分支,则必须在组合函数中启用递归:
mydata: "{{ mydata | combine(newdata, recursive=True) }}"
<块引用>
递归 是一个布尔值,默认为 False。组合是否应该递归合并嵌套的哈希。注意:它不依赖于 ansible.cfg 中 hash_behaviour 设置的值。
所以完整的解决方案变成:
- name: Open yaml file
slurp:
path: myfile.yaml
register: r_myfile
- name: Read yaml to dictionary
set_fact:
mydata: "{{ r_myfile['content'] | b64decode | from_yaml }}"
- name: Patch yaml dictionary
set_fact:
mydata: "{{ mydata | combine(newdata, recursive=True) }}"
vars:
newdata:
existing_key:
existing_nested_key: new_value
new_nested_key: new_value
- name: Write yaml file
copy:
content: '{{ mydata | to_nice_yaml }}'
dest: myfile.yaml
注意:递归只允许添加嵌套键或替换嵌套值。删除特定的嵌套键需要更高级的解决方案。
答案 4 :(得分:0)
这里解释了几种方法:
https://ansible-tips-and-tricks.readthedocs.io/en/latest/modifying-files/modifying-files/
答案 5 :(得分:0)
这是基于Kevin Keane的答案-我刚刚添加了事实修改部分。而且由于似乎不可能编辑现有答案(编辑队列已满),所以我只是为其他来这里寻求详细信息的人(像我一样)添加了此答案。
从文件读取YAML数据,并创建存储该数据的事实:
- name: Read the yaml
slurp:
path: myfile.yaml
register: r_myfile
- name: extract the data
set_fact:
mydata: "{{ r_myfile['content'] | b64decode | from_yaml }}"
我无法在Ansible中找到任何修改现有字典的方法。因此,实际修改数据的解决方法是创建一个新的dict,其名称与现有事实(mydata
)相同,并使用combine
过滤器根据需要更改键:
- name: Create configuration for core - modify params
set_fact:
mydata: "{{ mydata | combine(newdata) }}"
vars:
newdata:
old_key: new_value
new_key: new_value
将修改后的数据写入文件:
- name: Write back to a file
copy:
content: '{{ mydata | to_nice_yaml }}'
dest: myfile.yaml
结果:
原始myfile.yaml:
---
another_key: another_value # This is a key that we will not touch
old_key: old_value # This is an old key, that we will change
执行剧本后的文件:
another_key: another_value
new_key: new_value
old_key: new_value
请注意,(正如您可能预期的那样)所有注释均已消失,因为您只是在读取YAML数据并将其写回。