Ansible Lineinfile — экранирование одинарной кавычки при использовании обратной ссылки

Я пытаюсь использовать следующую игру Ansible, чтобы изменить слабый пароль по умолчанию для ряда сценариев SQL:

- name: amend SQL User Passwords
  sudo: yes
  lineinfile: dest=/path/to/script/{{ item.file }} state=present backup=yes
              regexp="CREATE USER (.*) PASSWORD 'password';$" line='CREATE USER \1 PASSWORD ''strongpassword'';' backrefs=yes
  with_items:
    - { file: create_db1_users_tables.sql }
    - { file: create_db2_users_tables.sql }
    - ...
    - { file: create_dbNN_users_tables.sql }

Хотя спецификация YAML предполагает, что так и должно быть,

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

двойная одинарная кавычка не действует как escape-символ; вместо этого они полностью удаляются из строки вывода:

CREATE USER user1 PASSWORD stR0ngP@55w0rD

вместо

CREATE USER user1 PASSWORD 'stR0ngP@55w0rD'

До сих пор я пробовал:

  1. Использование двойных кавычек — позволяет заключать пароль в одинарные кавычки, однако обратная ссылка больше не анализируется и просто выводится как \1. Попытка избежать этого, поскольку \\1, похоже, не имеет никакого эффекта.
  2. Различные способы экранирования одинарной кавычки - обратная косая черта, галочки. Большинство из них выдают синтаксические ошибки или просто ничего не выводят.
  3. Окружение всех аргументов lineinfile в двойных кавычках (и соответствующее экранирование всего внутри)
  4. Я не могу использовать модули базы данных Ansible
  5. Я не могу использовать шаблоны, сценарии создают и заполняют ряд таблиц и могут меняться между версиями продукта — поддерживать шаблоны в актуальном состоянии было бы слишком дорого.

Я нашел аналогичный вопрос Ansible, Quotes in ansible lineinfile, но решения не помогли .

Есть ли у кого-нибудь дополнительные предложения?


person Dan    schedule 21.04.2015    source источник
comment
использование lineinfile (или замены) часто является антипаттерном; лучше шаблонизировать весь файл (например). В противном случае вы просто надеетесь, что остальная часть файла не изменится, что не очень хорошая практика CM. Некоторые сервисы даже поддерживают синтаксис conf.d, что даже лучше.   -  person tedder42    schedule 21.04.2015
comment
Очень хорошее замечание, с которым не поспоришь. Первоначально я избегал создания шаблонов сценариев SQL, поскольку ожидал, что между выпусками продукта будут изменения, и первоначально я пытался написать роль, которая будет работать в нескольких выпусках. Учитывая вашу точку зрения, это был неправильный подход, и теперь я правильно создал шаблоны файлов.   -  person Dan    schedule 27.04.2015


Ответы (1)


Не то чтобы мне нравилось отвечать на собственные сообщения, но, просмотрев больше информации в Интернете, я наткнулся на этот пост, где предлагалось использовать модуль replace вместо lineinfile**. Игра:

- name: amend SQL User Passwords
  sudo: yes
  replace: dest=/path/to/script/{{ item.file }}
           backup=yes
           regexp="^CREATE USER (.*) PASSWORD 'password';$"
           replace="CREATE USER \\1 PASSWORD 'strongpassword';"
  with_items:
    - { file: create_db1_users_tables.sql }
    - { file: create_db2_users_tables.sql }
    - ...
    - { file: create_dbNN_users_tables.sql }

Работает как положено, генерируя нужный SQL.

** Это также подтверждает тот факт, что мне следует уделять больше времени чтению руководств по Ansible.

person Dan    schedule 21.04.2015