Ansible playbook find/replace ведет себя странно при втором запуске

У меня есть эта задача, которая находит 2 строки в sshd_config и изменяет их. Это отлично работает при первом запуске, он заменяет строки src строками dest. Но если я запускаю его во второй раз, после того, как 2 строки в файле уже верны, он добавляет 2 новые строки в конец файла.

Я попытался добавить состояние: присутствует, но это не изменило поведение.

  - name: Configuring sshd_config
    lineinfile:
      path: /etc/ssh/sshd_config
      regexp: "{{ item.src }}"
      state: present
      line: "{{ item.dest }}"
    with_items:
      - { src: "#PrintLastLog yes", dest: "PrintLastLog no" }
      - { src: "#Banner none", dest: "Banner /etc/issue.net" }

Я ожидал, что он не будет соответствовать строкам src и не будет вносить никаких изменений.

Введение в Ansible Roles
Введение в Ansible Roles
Ansible - это отличный инструмент управления конфигурацией, который можно использовать для автоматизации настройки или развертывания на большом...
0
0
143
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

То, что вы получаете, является точным ожидаемым поведением. Цитирование документация о параметре regexp при использовании state: present

When modifying a line the regexp should typically match both the initial state of the line as well as its state after replacement by line to ensure idempotence.

Изменение вашей задачи следующим образом должно выполнить эту работу.

  - name: Configuring sshd_config
    lineinfile:
      path: /etc/ssh/sshd_config
      regexp: "{{ item.src }}"
      state: present
      line: "{{ item.dest }}"
    with_items:
      - { src: "^(# *)?PrintLastLog", dest: "PrintLastLog no" }
      - { src: "^(# *)?Banner", dest: "Banner /etc/issue.net" }

Это будет соответствовать закомментированной строке (с необязательными пробелами после хеша) или новой измененной строке.

Другие вопросы по теме