使用ansible剧本在给定文件的每个发现中插入一行

问题描述

我想在每次发现时在* {My-Dept $ 1}之后在file.yaml中添加行“ * {My-Dept $ 2}”,我能够找到以* {My-Dept开头的行$ 1},并且只插入了一次,结果就麻烦了。

我在文件的多行中包含此内容,并希望在“ * {My-Dept $ 1}”之后插入。

参考如下:

        Infrastructure:
                - *{My-Dept$0}
                - *{My-Dept$1}
        Applications:
                - *{My-Dept$1}
                - *{My-Dept$3}
                - *{My-Dept$4}
        Database:
                - *{My-Dept$0}
                - *{My-Dept$1}
                - *{My-Dept$3}

使用下面的代码,我只能在最后一个“ Database arry”条目之后添加“-* {My-Dept $ 2}”行。

  - name: Add missing Dept
    lineinfile:
       dest: ./file.yaml
       insertafter: '[*{]My-Dept[$]1[}]' #
       line: '                    - *{My-Dept$2}'

输出

    Infrastructure:
            - *{My-Dept$0}
            - *{My-Dept$1}
                Applications:
                    - *{My-Dept$1}
                    - *{My-Dept$3}
                    - *{My-Dept$4}
                    Database:
                            - *{My-Dept$0}
                            - *{My-Dept$1}
                            - *{My-Dept$2}
                            - *{My-Dept$3}

我希望在* {My-Dept $ 1}项的每个发现的下一行上都显示“ * {My-Dept $ 2}”。大多数搜索查找都在谈论替换,但是我的要求是在每次查找中插入多次。

解决方法

制作 file.yaml valid YAML。例如

shell> cat file.yaml
---
Infrastructure:
 - '*{My-Dept$0}'
 - '*{My-Dept$1}'
Applications:
 - '*{My-Dept$1}'
 - '*{My-Dept$3}'
 - '*{My-Dept$4}'
Database:
 - '*{My-Dept$0}'
 - '*{My-Dept$1}'
 - '*{My-Dept$3}'

Q:“将* {My-Dept $ 2}放入* {My-Dept $ 1}条目的每个结果的下一行。”

A:可以自行编辑文件。

  1. 将文件中的变量读取到字典中。例如
    - include_vars:
        file: file.yaml
        name: my_dict
    - debug:
        var: my_dict

给予

  my_dict:
    Applications:
    - '*{My-Dept$1}'
    - '*{My-Dept$3}'
    - '*{My-Dept$4}'
    Database:
    - '*{My-Dept$0}'
    - '*{My-Dept$1}'
    - '*{My-Dept$3}'
    Infrastructure:
    - '*{My-Dept$0}'
    - '*{My-Dept$1}'
  1. 修改数据。例如
    - set_fact:
        my_dict1: "{{ my_dict1|default({})|
                      combine({item: (my_dict[item] + add_items)|unique|sort}) }}"
      loop: "{{ my_dict.keys()|list }}"
      vars:
        add_items:
          - '*{My-Dept$2}'
    - debug:
        var: my_dict1

给予

  my_dict1:
    Applications:
    - '*{My-Dept$1}'
    - '*{My-Dept$2}'
    - '*{My-Dept$3}'
    - '*{My-Dept$4}'
    Database:
    - '*{My-Dept$0}'
    - '*{My-Dept$1}'
    - '*{My-Dept$2}'
    - '*{My-Dept$3}'
    Infrastructure:
    - '*{My-Dept$0}'
    - '*{My-Dept$1}'
    - '*{My-Dept$2}'
  1. 创建模板
shelll> cat file.yaml.j2
---
{% for k,v in my_dict1.items() %}
{{ k }}:
{% for item in v %}
  - '{{ item }}'
{% endfor %}
{% endfor %}
  1. 将修改后的数据写入文件
    - template:
        src: file.yaml.j2
        dest: file.yaml

给予

shell> cat file.yaml
---
Infrastructure:
  - '*{My-Dept$0}'
  - '*{My-Dept$1}'
  - '*{My-Dept$2}'
Applications:
  - '*{My-Dept$1}'
  - '*{My-Dept$2}'
  - '*{My-Dept$3}'
  - '*{My-Dept$4}'
Database:
  - '*{My-Dept$0}'
  - '*{My-Dept$1}'
  - '*{My-Dept$2}'
  - '*{My-Dept$3}'