@wizkey
sysadmin

Как в Ansible выполнить замену или вставку текст в файл?

Например, есть какой-то конфиг, в нем есть строка с параметрами. Строка может содержать разные параметры, всю строка заменять нельзя.
Как средствами Ansible найти нужный текст, заменить если не совпадает и вставить если отсутствует в определённое место после определенной строки?
файл:

ServerConfig=" ip=10.0.0.0 dns=10.0.0.1 name=webserver"


Нужно заменить name=webserver на name=dbserver, если строки нет, то добавить.

Мои попытки:

---
- hosts: webserver
  vars:
    config:
      - { param: name=, value: dbserver }
  tasks:
    - name: change param
      become: yes
      lineinfile:
        backup: yes
        backrefs: yes
        path: /etc/file/config
        regexp: '^ServerConfig=/"(?!.*\b{{ item.param }}{{ item.value }}\b).*)$'
        line: '\1{{ item.param }}{{ item.value }}\2'
        state: present
   loop: "{{ config }}"
  • Вопрос задан
  • 1832 просмотра
Решения вопроса 1
@MaxKozlov
Вот такая забавная регулярка подходит
ServerConfig="(.*)\b(name=[^\s]+)\b(.*)"|"(.*)\b(name=[^\s]+)?"

и замена, соответственно,
\1name=xxx\3\4

Правда в этом случае name=xxx будет вставляться в начало, а не конец строки, если его там раньше не было
https://regex101.com/r/MILkYr/1/

p.s. а хотя можно и в конец вот при такой замене
\1\4name=xxx\3
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
karabanov
@karabanov
Системный администратор
Я бы сделал шаблон конфига и из него уже контролируемо формировал конечный конфиг.
Ответ написан
Sanes
@Sanes
Проблема-то в чём? Не можете регулярное выражение составить?
Варианты:
  1. Регулярное выражение с поиском и заменой
  2. Модуль blockinfile
  3. Шаблон
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы