Необязательная строка строки дублирует строку
У меня есть простой файл в /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" и сделать с ним.
Ответы
Ответ 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.
Решение состоит в том, чтобы не заменить пропущенную строку, а добавить дополнительную строку, сохранив там оригинал.