Почему ansible игнорирует это регулярное выражение в линейном файле?

Я пытаюсь сообщить ansible добавить строку «ALL: ALL» в /etc/hosts.deny всякий раз, когда этой строки еще нет. Вот моя задача:

- name: Ensure hosts.deny has default ALL entry
  lineinfile: dest="/etc/hosts.deny" regexp="^\s*ALL\s*:" line="{{ deny_all }}" insertbefore=EOF

Это все в роли, называемой соответствием, поэтому в соответствии/vars/main.yml у меня есть:

deny_all: 'ALL : ALL'

Это должно было обойти проблему парсера с одиноким двоеточием.

Я также пробовал эти регулярные выражения, но без радости:

  • "^\s*ВСЕ"
  • "ВСЕ"
  • "ФОО"

Я заменил существующий /etc/host.deny совершенно пустым файлом, и все равно эта задача возвращает «ok» каждый раз, когда я ее запускаю. Что я здесь пропустил? Я уверен, что это что-то действительно до боли очевидное, но я просто не вижу этого.

Спасибо.

--- Отредактировано с новыми подробностями---

Я изменил исходную задачу, и теперь она выглядит так:

- name: Ensure hosts.deny has default ALL entry
  lineinfile: dest='/etc/hosts.deny' line='ALL' insertbefore=EOF create=True state=present

Затем я удалил файл /etc/hosts.deny из удаленной системы. Запуск этой задачи (через теги) дает «ok» вместо создания файла:

# ansible-playbook compliance -i inventory.yml --tags deny -l us202

PLAY [Compliance] *******************************************

TASK: [Ensure /etc/hosts.deny has default ALL entry *********
ok: [us202]

PLAY RECAP **************************************************
us202         : ok=1   changed=0   unreachable=0   failed=0

#

Как это возможно?


person Bret    schedule 18.03.2015    source источник


Ответы (2)


Проблема заключалась в том, что я неправильно прочитал документы и использовал вставку перед = EOF, а не вставку после = EOF. Когда я переключился на insertafter=EOF, все заработало без проблем.

person Bret    schedule 19.03.2015

Есть общая проблема с двоеточиями в модуле lineinfile. Я нашел эту тему в списке рассылки.

Если line содержит двоеточие, все это должно быть заключено в двойные кавычки или записано в многострочном синтаксисе YML.

Двойная цитата:

- name: Ensure hosts.deny has default ALL entry
  lineinfile: 'dest="/etc/hosts.deny" line="ALL {{":"}} ALL"'

Многострочный:

- name: Ensure hosts.deny has default ALL entry
  lineinfile: >
    dest="/etc/hosts.deny"
    line="ALL {{':'}} ALL"

> в многострочном синтаксисе имеет важное значение.


Предыдущий ответ:

Ваша линия кажется довольно статичной. Есть ли причина, по которой требуется регулярное выражение, не упомянутое в вопросе? Если нет, вы можете просто удалить его, тогда Ansible будет искать точную строку — для этого не требуется регулярное выражение.

Регулярное выражение требуется, если строка может меняться, и вам нужно идентифицировать ее по шаблону, например. параметр foo с неопределенным/неизвестным значением.

Кстати, есть хитрость, позволяющая избежать ошибки синтаксического анализа с двоеточиями: вы можете просто использовать {{':'}} в своем YML. За это отвечает пользователь github drawp.

person udondan    schedule 18.03.2015
comment
Потрясающий. Я предполагаю, что попал в шаблон использования regexp для всех моих строковых записей. Большинство из них более динамичны, чем это. Спасибо за урок и подсказку! К сожалению, это все еще не работает, даже после удаления регулярного выражения, а затем после замены строки на ВСЕ {{':'}} ВСЕ. - person Bret; 18.03.2015
comment
Да, это имеет смысл, так как я ожидал, что ваше регулярное выражение сработает в первую очередь. Я немного поискал и нашел проблему, см. обновленный ответ выше. - person udondan; 18.03.2015
comment
Это все равно не сработало, даже если использовать дословную многострочную версию. Или удалить двоеточие, просто чтобы попытаться заставить его что-то делать. Это не признание того, что файл больше не существует, и его необходимо создать. Как ни странно, у меня есть копия, которая просматривает тот же файл, обнаруживает отсутствующий файл и заменяет его. Но lineinfile, кажется, вообще не видит файл! - person Bret; 18.03.2015
comment
Я использую ansible 1.7.2 на Fedora 20, если это имеет какое-то значение. Должен ли я опубликовать это в списке ansible (теперь, когда я нашел его с вашей помощью)? - person Bret; 18.03.2015
comment
Думаю, это будет лучший вариант. По крайней мере, у меня нет других идей. Но я думаю, что первое, что они потребуют от вас, это обновиться до 1.8.4 или ветки devel и посмотреть, поможет ли это. - person udondan; 18.03.2015
comment
Тогда я попробую и опубликую, если я все еще борюсь. Спасибо за помощь, удондан. Благодаря вам у меня появилось несколько новых заметок в моей книге! - person Bret; 18.03.2015