【问题标题】:Insert a line on each findings from given file using ansible playbook使用 ansible playbook 在给定文件的每个结果上插入一行
【发布时间】:2021-01-06 07:07:09
【问题描述】:

我想在每次发现 *{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}”。大多数搜索 find 都在谈论替换,但我的要求是在每个结果中插入多次。

【问题讨论】:

    标签: ansible insert ansible-2.x insert-update regexp-substr


    【解决方案1】:

    制作 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}'
    

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

    答:可以自行编辑文件。

    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}'
    

    【讨论】:

    • 很好的解释,由于 file.yaml 文件的对齐,我遇到了修改问题。看起来对齐应该与我发布的原始内容一样完整。但是我一直在更新,你能解释一下这个文件“file.yaml.j2”
    • 请参阅文档Jinja 中有关模板的详细信息。如果 file.yaml 是有效的 YAML,则应该没有任何问题。
    • 知道了,我试过了,现在效果很好,非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多