Ansible замена: regex/замена нескольких строк?

Вопрос или проблема

В ansible я хотел бы заменить это:

pgsql:
  useCluster: false
  addr: 127.0.0.1:5432
  password: ""
email:
  to: [email protected]
  port: 465
  password: ""

заменить на это:

pgsql:
  useCluster: false
  addr: 127.0.0.1:5432
  password: "2024xxx"
email:
  to: [email protected]
  port: 465
  password: ""

Поскольку есть две идентичные переменные, которые нельзя заменить, я использую этот метод. Но его невозможно достичь. Как всем с этим справляться?

replace:
      path: "config.yaml"
      regexp: '(redis:[^<]*)password: ""'
      replace: '\1password: "2024xxx"'

Ответ или решение

Для решения вашей задачи по замене значений в файле config.yaml с использованием Ansible можно использовать модуль replace. Однако, учитывая, что вы хотите заменить конкретное значение в одном из разделов (в данном случае для ключа password под pgsql), необходимо использовать более точный регулярный выражение, чтобы избежать ненужного изменения других идентичных переменных.

Вот пример правильной конфигурации с использованием модуля replace:

- name: Замена пароля в config.yaml
  hosts: localhost
  tasks:
    - name: Заменить пароль для pgsql
      replace:
        path: "config.yaml"
        regexp: '^(.*pgsql:\n\s+password:\s*")("")(")'
        replace: '\1"2024xxx"\3'

Пояснение:

  1. regexp:

    • ^(.*pgsql:\n\s+password:\s*")("")(")
    • Это регулярное выражение ищет строку, которая начинается с pgsql:, затем находит строку password: с учётом пробелов, и захватывает два возможных сценария: перед пустым значением пароля ("") и после его (закрывающая кавычка).
    • Используемая конструкция ^ помогает ограничить поиск именно началом строки, а .* перед pgsql: позволяет игнорировать любые строки перед ним, что делает нашу замену более безопасной.
  2. replace:

    • \1"2024xxx"\3: Здесь мы сохраняем всё, что было до password:, затем вставляем нужное значение пароля, и, наконец, закрывающую кавычку. Это позволит изменить только нужную строку, не затрагивая другие переменные с таким же именем.

Таким образом, этот подход позволяет точно заменить только нужный пароль для pgsql, не повредив другие аналогичные значения в файле config.yaml.

Теперь вы можете запускать свой playbook Ansible, и указанное значение пароля будет заменено на новое. Обязательно сделайте резервную копию файла, прежде чем вносить изменения, чтобы избежать потери данных.

Оцените материал
Добавить комментарий

Капча загружается...