Ansible: можно ли искать замену одного слова

В модуле lineinfile он заменяет полную строку.

Если строка длинная, я должен повторить всю строку снова.

Предположим, я хочу заменить одно слово в файле:

#abc.conf
This is my horse

это игровая книга:

 - lineinfile: dest=abc.conf
               state=present
               regexp='horse'
               line='This is my dog'
               backup=yes

есть ли способ добиться чего-то вроде sed 's/horse/dog/g'?


person user1994660    schedule 14.03.2014    source источник


Ответы (3)


Вы можете использовать обратные ссылки для получения других частей (которые не следует изменять ) строки:

 - lineinfile: dest=abc.conf
               state=present
               regexp='^(.*)horse(.*)$'
               line='\1dog\2'
               backup=yes
               backrefs=yes
person ghloogh    schedule 14.03.2014
comment
Что, если слово для замены не «собака», а какой-нибудь IP-адрес, например 127.0.1.1? Все, что я получаю, это какой-то странный персонаж.... - person Nikhil Vandanapu; 03.11.2016
comment
для IP-адреса измените регулярное выражение regexp="127\.0\.0\.1.*" - person Sandjaie Ravi; 13.01.2017

Новый модуль replace доступен с 1.6 версии:

- replace:
    dest=abc.conf
    regexp='horse'
    replace='dog'
    backup=yes
person Community    schedule 11.09.2014
comment
Это так не работает; ОШИБКА: Произошла ошибка при разборе задачи .... backup=yes. Убедитесь, что кавычки совпадают или экранированы правильно - person code_ada; 21.07.2015

Если вам нужно выполнить больше операций замены в одном блоке и у вас есть файл локально, вы можете рассмотреть возможность использования шаблона, который заменяет переменные в файле шаблона и копирует файл на удаленный компьютер:

- template: src=/mytemplates/foo.j2 dest=/etc/file.conf

В локальном файле вы можете написать переменную с доступным синтаксисом, например

{{variable}}

и он будет заменен, если он находится в рамках скрипта. Здесь документы.

person Gismo Ranas    schedule 26.08.2015