Вопрос или проблема
В 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'
Пояснение:
-
regexp:
^(.*pgsql:\n\s+password:\s*")("")(")
- Это регулярное выражение ищет строку, которая начинается с
pgsql:
, затем находит строкуpassword:
с учётом пробелов, и захватывает два возможных сценария: перед пустым значением пароля (""
) и после его (закрывающая кавычка). - Используемая конструкция
^
помогает ограничить поиск именно началом строки, а.*
передpgsql:
позволяет игнорировать любые строки перед ним, что делает нашу замену более безопасной.
-
replace:
\1"2024xxx"\3
: Здесь мы сохраняем всё, что было доpassword:
, затем вставляем нужное значение пароля, и, наконец, закрывающую кавычку. Это позволит изменить только нужную строку, не затрагивая другие переменные с таким же именем.
Таким образом, этот подход позволяет точно заменить только нужный пароль для pgsql
, не повредив другие аналогичные значения в файле config.yaml
.
Теперь вы можете запускать свой playbook Ansible, и указанное значение пароля будет заменено на новое. Обязательно сделайте резервную копию файла, прежде чем вносить изменения, чтобы избежать потери данных.