Хотите вставить текст в файл beforealine, используя lineinfile в ansible playbook - PullRequest
1 голос
/ 18 апреля 2020

Мне нужно добавить текст до конца параметра в файле. Мне нужно вставить свой текст как раз перед </abc>. Я использую lineinfile, и он вводит текст раньше <abc>, а не </abc>.

Мой текущий текстовый файл:

<domain-log-broadcast-filter>MultiDataSourceLogFilter</domain-log-broadcast-filter>
      <abc>Info is already here. i just need to append the text at end of this parameter. new values to be inserted here</abc>

Моя книга воспроизведения:

  - lineinfile:
         path: /tmp/tochange.xml
         insertbefore:  '\<\/abc\>'
         line: "Tisisthelinetobeinsertedbyme"
         state: present

Мой вывод для этого:

<domain-log-broadcast-filter>MultiDataSourceLogFilter</domain-log-broadcast-filter>
Thisisthelinetobeinsertedbyme
      <abc>Info is already here. i just need to append the text at end of this parameter. new values to be inserted here</abc>

Теперь у меня есть 2 требования:

  1. Я хочу вставить свой текст просто до </abc>
  2. В моем файле 4 </abc> параметров. Я хочу проигнорировать первый </abc>, и строка должна быть вставлена ​​перед другими 3 </abc> параметрами.

Пожалуйста, предложите мне лучший способ сделать это, все, что мне нужно, это эта работа, чтобы быть сделано, с любыми модулями любой скрипт в playbook. Заранее спасибо.

1 Ответ

1 голос
/ 18 апреля 2020

Q: "... с любыми модулями любой скрипт в playbook."

A: Ansible файловые модули не умеют это делать. Вам понадобится модуль команда или shell для запуска таких инструментов редактирования файлов, как sed или awk .

Модуль lineinfile не может не соответствовать требованиям. Этот модуль изменяет отдельные строки в файле. Невозможно изменить 3 из 4 строк, которые соответствуют regexp . Боюсь, вам не помогут ни модули , ни , ни blockinfile . Модуль template изменяет целые файлы. Следующим вариантом может быть модуль patch .

Цитирование из lineinfile :

"... Для других случаев см. Модуль копирования или шаблон."

...