Вариант «Ansible lineinfile добавляет дублирующуюся строку»

#ansible

#ansible

Вопрос:

Я пытаюсь заставить ansible настроить автоматические обновления в ubuntu. К сожалению, я получаю дублирующиеся строки при многократном запуске роли.

Вот мой код:

 - name: apt | Configure unattended-upgrades
  lineinfile:
    dest: /etc/apt/apt.conf.d/50unattended-upgrades
    regexp: "{{ item }}"
    line: "{{ harden_linux_unattended_upgrades_settings[item] }}"
    state: present
  with_items:
      - "{{ harden_linux_unattended_upgrades_settings | list }}"
  

и

 harden_linux_unattended_upgrades_settings:
    "^Unattended-Upgrade::Mail": 'Unattended-Upgrade::Mail "{{ ubuntu_common_email }}";'
    "^Unattended-Upgrade::MailReport": 'Unattended-Upgrade::MailReport "on-change";' # later if working set to "only-on-error"
    "^Unattended-Upgrade::Remove-Unused-Kernel-Packages": 'Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";'
    "^Unattended-Upgrade::Remove-Unused-Dependencies": 'Unattended-Upgrade::Remove-Unused-Dependencies "true";'
    "^Unattended-Upgrade::Automatic-Reboot": 'Unattended-Upgrade::Automatic-Reboot "true";'
    "^Unattended-Upgrade::Automatic-Reboot-Time": 'Unattended-Upgrade::Automatic-Reboot-Time "2:50";'
  

Результатом при его запуске является то, что он отлично работает с первого раза. Каждый раз после этого я получаю этот результат и (как ни странно, только некоторые) повторяющиеся строки:

 changed: [cloud-host] => (item=^Unattended-Upgrade::Mail)
changed: [cloud-host] => (item=^Unattended-Upgrade::MailReport)
ok: [cloud-host] => (item=^Unattended-Upgrade::Remove-Unused-Kernel-Packages)
ok: [cloud-host] => (item=^Unattended-Upgrade::Remove-Unused-Dependencies)
changed: [cloud-host] => (item=^Unattended-Upgrade::Automatic-Reboot)
changed: [cloud-host] => (item=^Unattended-Upgrade::Automatic-Reboot-Time)
  

с этим в конце файла:

 Unattended-Upgrade::Mail "john@doe.com";
Unattended-Upgrade::Mail "john@doe.com";
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Mail "john@doe.com";
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Mail "john@doe.com";
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Mail "john@doe.com";
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::MailReport "on-change";
Unattended-Upgrade::Automatic-Reboot-Time "2:50";
  

Я видел много потоков с проблемами с дублирующимися строками, но я не могу определить свою проблему там. В частности, я не понимаю, почему это работает с

 Unattended-Upgrade::Remove-Unused-Kernel-Packages
  

и

 Unattended-Upgrade::Remove-Unused-Dependencies
  

Я просто не вижу никакой разницы с другими строками..


Редактировать: Спасибо за очень полезный ответ! Это то, с чем я закончил (я также изменил другие части):

 - name: apt | Configure unattended-upgrades
  lineinfile:
    dest: /etc/apt/apt.conf.d/50unattended-upgrades
    regexp: "^{{ item }}\s"
    line: '{{ item }} "{{ harden_linux_unattended_upgrades_settings[item] }}";'
    state: present
  with_items:
      - "{{ harden_linux_unattended_upgrades_settings | list }}"
  

и

 harden_linux_unattended_upgrades_settings:
    "Unattended-Upgrade::Mail": "{{ ubuntu_common_email }}"
    "Unattended-Upgrade::MailReport": "on-change" # later if working set to "only-on-error"
    "Unattended-Upgrade::Remove-Unused-Kernel-Packages": "true"
    "Unattended-Upgrade::Remove-Unused-Dependencies": "true"
    "Unattended-Upgrade::Automatic-Reboot": "true"
    "Unattended-Upgrade::Automatic-Reboot-Time": "2:50"
  

Ответ №1:

у вас есть :

     "^Unattended-Upgrade::Automatic-Reboot": 'Unattended-Upgrade::Automatic-Reboot "true";'
    "^Unattended-Upgrade::Automatic-Reboot-Time": 'Unattended-Upgrade::Automatic-Reboot-Time "2:50";'
  

первое регулярное выражение ^Unattended-Upgrade::Automatic-Reboot соответствует обоим: Unattended-Upgrade::Automatic-Reboot и Unattended-Upgrade::Automatic-Reboot-Time .

итак, во второй раз он выполняет следующее:

  • сопоставьте Unattended-Upgrade::Automatic-Reboot и ничего не делайте
  • сопоставьте Unattended-Upgrade::Automatic-Reboot-Time и замените его на Unattended-Upgrade::Automatic-Reboot
  • поскольку Unattended-Upgrade::Automatic-Reboot-Time больше нет, он добавляет ее обратно

итак, теперь у вас есть 2 Automatic-Reboot и 1 Automatic-Reboot-Time

та же логика для Unattended-Upgrade::Mail и Unattended-Upgrade::Mail-Report

вы можете улучшить регулярное выражение, сопоставив следующее "