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

Ansible – это широко используемый инструмент автоматизации, который может управлять сотнями узлов одновременно. У Ansible есть много отличных функций, и одной из них является его способность управлять одной строкой в файле на удаленных узлах с использованием модуля Ansible lineinfile Ansible lineinfile module.

Модуль Ansible lineinfile – это модуль, выполняющий различные действия с одной строкой в файле, такие как замена строки, обновление строки или добавление конкретной строки.

В этом учебнике вы узнаете, что такое модуль Ansible lineinfile, как он работает, и как его использовать для управления текстовыми файлами.

Предварительные требования

Этот пост будет пошаговым руководством по использованию модуля Ansible lineinfile. Если вы хотите следовать за учебником, убедитесь, что у вас есть следующее:

  • Хост-контроллер Ansible – В этом руководстве используется Ansible v2.9.24 на машине с Ubuntu 18.04.5 LTS.
  • A remote computer to run commands. You’ll need an inventory file set up and one or more hosts already configured to run Ansible command and playbooks on. The remote Linux computer will be called myserver, and the tutorial will use an inventory group called web.
  • Apache должен уже быть установлен на удаленном компьютере, если вы хотите точно следовать учебнику.

Модификация текстового файла с помощью модуля Ansible lineinfile.

Давайте начнем этот учебный курс, запустив модуль Ansible lineinfile с помощью команд ad hoc. Команды ad hoc – это быстрый способ протестировать или выполнить одну команду на удаленном хосте.

Войдите на контроллер Ansible и выполните следующую команду. Эта команда использует модуль lineinfile (-m) для подключения к веб-машины и передачи аргумента (-a), который является командой для выполнения.

В данном случае модуль lineinfile обновляет запись localhost, сопоставляя IP-адрес 127.0.0.1 с myapache в файле /etc/hosts. Сопоставление 127.0.0.1 с myapache позволяет вам локально переходить на тестовую страницу apache по адресу HTTP://myapache:80

  • path обозначает местоположение файла.
  • regexp находит регулярное выражение, если оно есть, в файле и обновляет его с указанным в параметре line значением 127.0.0.1 myapache.
  • Флаг --become позволяет запускать команду от имени привилегированного пользователя.
  • web – это группа инвентаря, которая является коллекцией всех серверов.
  • ansible.builtin.lineinfile или просто lineinfile – это имя модуля.
ansible web -m ansible.builtin.lineinfile -a "path=/etc/hosts regexp='^127\.0\.0\.1'  line='127.0.0.1 myapache' state=present" --become

После выполнения команды вы должны увидеть сообщение ИЗМЕНЕНО, подтверждающее успешное обновление строки на удаленном хосте.

Running the ad hoc command with ansible lineinfile module

Войдите в удаленный узел с использованием клиента SSH и проверьте, обновлен ли файл /etc/hosts новым значением с использованием команды cat.

Как видно ниже, запись localhost успешно обновлена на удаленной машине на 127.0.0.1 myapache.

Verifying the host file on remote machine

Изменение нескольких текстовых файлов в рамках сценария

Работа с одной командой ad hoc для управления строками на удаленной машине может быть подходящей, но будет сложно, если нужно управлять строками в нескольких файлах или несколькими строками в файле. Вместо использования ad-hoc команд, рассмотрите использование модуля Ansible lineinfile в рамках сценария с использованием команды ansible-playbook.

Теперь давайте узнаем, как использовать модуль Ansible lineinfile в рамках сценария и изменить несколько строк.

Предполагается, что вы уже вошли на контроллер Ansible:

1. Создайте каталог с именем ansible_lineinfile_module_demo в вашем домашнем каталоге. Этот каталог будет содержать сценарий, который вы будете использовать для вызова модуля lineinfile.

mkdir ~/ansible_lineinfile_module_demo
cd ~/ansible_lineinfile_module_demo

2. Создайте еще один файл с именем my_playbook.yml в каталоге ~/ansible_lineinfile_module_demo и вставьте следующее содержимое YAML-плейбука. В этом плейбуке несколько задач, использующих модуль Ansible lineinfile для управления строками различных конфигурационных файлов Apache на удаленной машине.

Плейбук ниже содержит следующие задачи:

1. Проверяет, присутствует ли ADMIN в файле /etc/sudoers; если нет, задача добавляет его.

2. Гарантирует, что Apache по умолчанию слушает порт 8080 в файле /etc/apache2/ports.conf; если обнаруживается любая другая строка порта, модуль lineinfile обновляет ее на порт 8080. Аналогично в файле /etc/apache2/apache2.conf обновляются значения MaxKeepAliveRequests на 1000 и KeepAliveTimeout на 100.

3. Добавляет строку с текстом “Hello This is my Apache Page” в конце файла index.html на удаленном сервере в каталоге /var/www/html.

Плейбуки Ansible написаны на YAML. Чтобы узнать больше о YAML, нажмите здесь

---
- name: Ansible lineinfile module example
# Определение удаленного сервера, на котором будет действовать модуль Ansible lineinfile
  hosts: web
  remote_user: ubuntu   # Использование удаленного хоста как ubuntu
  become: true
  tasks:

# (Задача-1) Проверка файла Sudoers, разрешено ли администраторам выполнять все операции 
    - name: Validate the sudoers file before saving
      ansible.builtin.lineinfile:
         path: /etc/sudoers
         state: present
         regexp: '^%ADMIN ALL='
         line: '%ADMIN ALL=(ALL) NOPASSWD: ALL'

# (Задача-2) Обновление порта Apache по умолчанию до 8080 
    - name: Ensure the default Apache port is 8080
      ansible.builtin.lineinfile:
         path: /etc/apache2/ports.conf
         regexp: '^Listen '
         insertafter: '^#Listen '
         line: Listen 8080

# (Задача-3) Добавление строки в конец html-страницы Привет, это моя страница Apache
    - name: Add a line to a file if the file does not exist
      ansible.builtin.lineinfile:
         path: /var/www/html/index.html
         line: Hello This is my Apache Page
         create: yes

# (Задача-4) Проверка файла Sudoers, разрешено ли администраторам выполнять все операции 
    - name: Ensure MaxKeepAliveRequests is set to greater than 100
      ansible.builtin.lineinfile:
         path: /etc/apache2/apache2.conf
         regexp: '^MaxKeepAliveRequests'
         line: MaxKeepAliveRequests=1000

# (Задача-5) Проверка файла Sudoers, разрешено ли администраторам выполнять все операции 
    - name: Ensure KeepAliveTimeout is set to greater than 50
      ansible.builtin.lineinfile:
         path: /etc/apache2/apache2.conf
         regexp: '^KeepAliveTimeout'
         line: KeepAliveTimeout=100

3. Теперь вызовите плейбук и выполните задачи, используя команду ansible-playbook, чтобы добавить или обновить все строки, определенные в плейбуке, на удаленном хосте.

ansible-playbook my_playbook.yml 
Invoking the ansible playbook

Ниже вы можете увидеть, что ЗАДАЧА имеет статус изменен, что означает, что удаленный хост находился в неправильном состоянии и был изменен для выполнения команды. Для той ЗАДАЧИ, которая имеет статус ОК, показывает, что изменения не требуются.

4. Затем подключитесь по SSH к удаленному хосту, используя ваш любимый SSH-клиент.

5. Наконец, проверьте, обновлены ли все строки, определенные в my_playbook.yml, на удаленном хосте, используя команду cat.

# Чтобы проверить, есть ли администратор с полными правами, и, если его нет, добавить его
cat /etc/sudoers
# Чтобы убедиться, что MaxKeepAliveRequests и KeepAliveTimeout были обновлены соответственно до 1000 и 100.
cat /etc/apache2/apache.config | grep Alive
# Чтобы убедиться, что Apache слушает порт 8080
cat /etc/apache2/ports.config

Ниже приведенный скриншот подтверждает, что admin уже добавлен в файл sudoers.

Verifying the sudoers file

Снова ниже приведенный скриншот подтверждает, что apache слушает Port 8080 по умолчанию.

Verifying the ports for in the config file

Наконец, проверьте, были ли обновлены MaxKeepAliveRequests и KeepAliveTimeout до 1000 и 100 соответственно.

Verifying the MaxKeepAliveRequests and KeepAliveTimeout in the config file

Вывод

Модуль Ansible lineinfile – отличный способ изменения текстовых файлов на удаленных хостах. Модуль предоставляет отличную возможность добавлять, удалять и изменять строки в текстовых файлах в ваших плейбуках.

Какие другие случаи использования модуля Ansible lineinfile вы видите?

Source:
https://adamtheautomator.com/ansible-lineinfile/