Подтвердить что ты не робот

Необязательная строка строки дублирует строку

У меня есть простой файл в /etc/foo.txt. Файл содержит следующее:

#bar

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

- name: test lineinfile
  lineinfile: backup=yes state=present dest=/etc/foo.txt
              regexp='^#bar'
              line='bar'

Когда я впервые запускаю загрузочную книгу, строка становится неудовлетворенной, а файл /etc/foo.txt теперь содержит следующее:

bar

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

bar
bar

Если я запустил его еще раз, файл /etc/foo.txt будет выглядеть так:

bar
bar
bar

Как избежать дублирования строк? Я просто хочу раскомментировать "#bar" и сделать с ним.

4b9b3361

Ответ 1

Проблема заключается в том, что регулярное выражение задачи соответствует только пронумерованной строке, #bar. Чтобы быть идемпотентным, задача lineinfile должна соответствовать как прокомментированному, так и несогласованному состоянию строки. Таким образом, он раскомментирует #bar, но не примет bar без изменений.

Эта задача должна делать то, что вы хотите:

- name: test lineinfile
  lineinfile: 
    backup=yes
    state=present
    dest=/etc/foo.txt
    regexp='^#?bar'
    line='bar'

Обратите внимание, что единственное изменение заключалось в добавлении "?" к регулярному выражению.

Ответ 2

Вам нужно добавить backrefs = yes, если вы не хотите изменять свое регулярное выражение.

- name: test lineinfile
  lineinfile: backup=yes state=present dest=/etc/foo.txt
              regexp='^#bar' backrefs=yes
              line='bar'

Это изменяет поведение lineinfile:

 find
 if found
   replace line found
 else
   add line

в

 find
 if found
   replace line found

Другими словами, это делает операцию идемпотентной.

Ответ 3

См. https://github.com/ansible/ansible/issues/4531.

Решение состоит в том, чтобы не заменить пропущенную строку, а добавить дополнительную строку, сохранив там оригинал.