是否有ansible的yaml编辑模块?

时间:2015-10-07 13:49:10

标签: ansible

我需要修改一个yaml文件(schleuder configuration),我想从一个ansible playbook中执行此操作 - 是否有一个模块可以执行此操作?很难谷歌这一点,所有出现的是如何写剧本。

6 个答案:

答案 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

来查看此信息

您最好的选择是使用lineinfiletemplatecopy模块。

答案 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) }}"

来自Ansible documentation

<块引用>

递归 是一个布尔值,默认为 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)

答案 5 :(得分:0)

这是基于Kevin Keane的答案-我刚刚添加了事实修改部分。而且由于似乎不可能编辑现有答案(编辑队列已满),所以我只是为其他来这里寻求详细信息的人(像我一样)添加了此答案。

  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 }}"
    
  2. 我无法在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
    
  3. 将修改后的数据写入文件:

    - 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数据并将其写回。