2

问题:Ansible 2.9 将重复替换模块的“替换:”字段中的条目。

要更改的文件(/etc/netplan/50-cloud-init.yaml):

network:
ethernets:
    ens160:
        addresses:
        - 10.10.8.112/24
        gateway4: 10.10.8.1
        nameservers:
            addresses:
            - 10.10.8.15
version: 2

代码:

- name: Check yaml has correct DNS values
  hosts: guest
  gather_facts: yes
  become: yes

  tasks:
          - name: Adjust yaml file
            replace:
              path: /etc/netplan/50-cloud-init.yaml
              after: '                addresses:'
              before: '    version: 2'
              regexp: '^(.+)$'
              replace: '                - 10.10.8.110\n                - 10.10.8.111\n                search:\n                - server.com\n            optional: true'

结果:

  • 如果原始文件只有一个条目说“- 10.10.8.110”,则将替换“之后”和“之前”之间的部分。但是,如果再次运行,expansible 将复制条目。

再次运行脚本后文件内容将如下所示:

network:
ethernets:
    ens160:
        addresses:
        - 10.10.8.112/24
        gateway4: 10.10.8.1
        nameservers:
            addresses:
            - 10.10.8.110
            - 10.10.8.111
            search:
            - server.com
        optional: true
            - 10.10.8.110
            - 10.10.8.111
            search:
            - server.com
        optional: true
version: 2

相信这与幂等性有关,并且可以用正则表达式修复。但是我不确定如何做到这一点。我想做的就是始终替换之前和之后的所有值。

我怎样才能做到这一点?

4

1 回答 1

1

我不会指望beforeafter而是构建一个与我正在寻找的内容完全匹配的正则表达式,并用反向引用替换。类似于以下内容(不性感但实用)


- name: Adjust yaml file
  replace:
    path: /etc/netplan/50-cloud-init.yaml
    regexp: >-
      (^\s*nameservers:\n\s*addresses:\n)[\S\s]*(version: 2)$
    replace: |-
      \g<1>           - 10.10.8.110
                  - 10.10.8.111
                  search:
                  - server.com
              optional: true\g<2>

同时,请注意,由于您的文件是 yaml,因此还有其他combine可能更简单的修改数据(对象等)的方法。

于 2020-07-13T22:24:33.030 回答