Замена строк/слов в файле через ansible в Unix/Linux

Замена строк/слов в файле через ansible в Unix/Linux

Сейчас, стало распространено использование автоматизации, и ansible хорошо справляется с некоторыми задачами, например — замена строк/слов в файлах. Для начала, установим данную службу:

Установка и настройка Ansible в Unix/Linux

Замена строк/слов в файле через ansible в Unix/Linux

При работе с ansible и файлами (конфигурационные файлы — как пример), очень просто найти и заменить нужную строку или слово чем скопировать файл на компьютер и редактировать его.  В ансибле, имеется модуль lineinfile, который предоставляет функциональные возможности наподобие «sed». Конечно, можно использовать и утилиту «для джедаев» — sed, но если нужно заменить на разных серверах одну и туже строку во многих файлах — то для этой задачи хорошо подойдет ansible.

Ну а сейчас, я покажу как можно это сделать с помощью playbook-а:

  - name:  uncomment a line
    lineinfile: dest=/etc/lighttpd/lighttpd.conf
                regexp='^   include "mod_fastc gi.conf"'
                insertafter='^#   include "mod_fastc gi.conf"'
                line='   include "mod_fastc gi.conf"'
                state=present

Ниже представляет собой простой набор различных вариантов использования модуля lineinfile. Мне потребовалось некоторое время, чтобы выяснить, как работает данный модуль (InsertAfter и InsertBefore с BOF/EOF).

Создадим тестовый файл через ансибль для тестирования работы lineinfile модуля:

- name: create a complete empty file
  command: /usr/bin/touch /home/vagrant/tmp.txt

Чтобы создать новую, пустую строку — используем:

- name: create a new file with lineinfile
  lineinfile: dest=/home/vagrant/tmp.txt
              regexp='^' line=''
              state=present
              create=True

Данный плейбук, создаст пустую строку. Сейчас, я покажу как можно ее заменить на что-то другое:

- name: add a string to the new file
  lineinfile: dest=/home/vagrant/tmp.txt
              regexp='^'
              line='This works'
              state=present

Добавим 5 строк в файл:

- name: add a multiline string to the file and delete the string from before
  lineinfile: dest=/home/vagrant/tmp.txt
              regexp='^'
              line='#This is a 1st comment\n#The 2d comment\n#The 3d comment\n#The 4th a comment\n#The last comment'
              state=present

Получаем:

$ cat tmp.txt 

#This is a 1st comment
#The 2d comment
#The 3d comment
#The 4th a comment
#The last comment

Сейчас, я покажу как можно вставить строку, после заданной ( например после 1-й):

- name: add a single line, in this case the same as the comment but uncommented
  lineinfile: dest=/home/vagrant/tmp.txt
              regexp='^This'
              insertafter='^#This'
              line='This is a 1st comment'
              state=present

Получаем:

$ cat tmp.txt 

#This is a 1st comment
This is a 1st comment
#The 2d comment
#The 3d comment
#The 4th a comment
#The last comment

Удаляем определенную строку:

- name: remove the line '#This is a 1st comment'
  lineinfile: dest=/home/vagrant/tmp.txt
              regexp='^#This is a 1st comment'
              state=absent

Вывод:

$ cat tmp.txt 

This is a 1st comment
#The 2d comment
#The 3d comment
#The 4th a comment
#The last comment

Заменить строку ( в моем случае — это первая):

- name: change a str
  lineinfile: dest=/home/vagrant/tmp.txt
              regexp='^This'
              insertbefore=BOF
              line='This is no longer a comment'

Вот что вышло:

$ cat tmp.txt 

This is no longer a comment
#The 2d comment
#The 3d comment
#The 4th a comment
#The last comment

Вставить строку перед указанной:

- name: add a new string before the match
  lineinfile: dest=/home/vagrant/tmp.txt
              regexp='^The 3d comment'
              insertbefore='^#The 3d comment'
              line='Another The 3d comment'

Смотрим что получилось:

$ cat tmp.txt 

This is no longer a comment
#The 2d comment
Another The 3d comment
#The 3d comment
#The 4th a comment
#The last comment

И напоследок, вставляем строку в самый конец файла:

- name: add a new string at the end of the file
  lineinfile: dest=/home/vagrant/tmp.txt
              regexp=''
              insertafter=EOF
              line='The latest entry'

Получаем:

$ cat tmp.txt 

This is no longer a comment
#The 2d comment
Another The 3d comment
#The 3d comment
#The 4th a comment
The latest entry

Как-то так. У меня на этом все, статья «Замена строк/слов в файле через ansible в Unix/Linux» завершена. Появятся идеи для примеров, добавлю еще 🙂

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

Ваш адрес email не будет опубликован.

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.