Ansible заменить дубликаты модуля заменить значения - PullRequest
2 голосов
/ 14 июля 2020

ПРОБЛЕМА: Ansible 2.9 будет дублировать записи в поле «replace:» модуля замены.

ФАЙЛ ДЛЯ ИЗМЕНЕНИЯ (/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», разделы будут заменены между «после» и «до». Однако при повторном запуске exp ansible дублирует записи.

После повторного запуска скрипта содержимое файла будет выглядеть следующим образом:

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

Поверьте, это связано с идемпотентность и, возможно, может быть исправлена ​​с помощью регулярного выражения. Однако я не знаю, как это сделать. Все, что я хочу сделать, это ВСЕГДА заменять все значения между «после» и «до».

Как я могу выполнить sh это?

1 Ответ

1 голос
/ 14 июля 2020

Я бы не стал рассчитывать на before и after, но построил бы регулярное выражение, которое точно соответствует тому, что я ищу, и замените его обратными ссылками. Что-то вроде следующего (не сексуально, но функционально)


- 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 объекты, et c ... ), что могло бы быть проще.

...