Добавить строку в файл
Обновлено: 21.11.2024
Ansible – это широко используемый инструмент автоматизации, который может управлять сотнями узлов за один раз. У Ansible много замечательных функций, и одна из них — возможность управлять одной строкой в файле на удаленных узлах с помощью модуля Ansible lineinfile.
Модуль Ansible lineinfile — это модуль, который выполняет различные действия с одной строкой в файле, например замену строки, обновление строки или добавление определенной строки.
В этом руководстве вы узнаете, что такое модуль Ansible lineinfile, как он работает и как использовать его для управления текстовыми файлами.
Оглавление
Предпосылки
Этот пост будет пошаговым руководством по модулю Ansible lineinfile. Если вы хотите продолжить, убедитесь, что у вас есть следующее:
- Хост-контроллер Ansible. В этом руководстве будет использоваться Ansible версии 2.9.24 на компьютере с Ubuntu 18.04.5 LTS.
- Удаленный компьютер для запуска команд. Вам понадобится настроенный файл инвентаризации и один или несколько хостов, уже настроенных для запуска команды Ansible и плейбуков. Удаленный компьютер с Linux будет называться myserver, а в руководстве будет использоваться группа инвентаризации с именем web.
- Apache уже должен быть установлен на удаленном компьютере, если вы хотите в точности следовать указаниям руководства.
Изменение текстового файла с помощью модуля Ansible lineinfile.
Давайте начнем это руководство с запуска модуля Ansible lineinfile с помощью специальных команд. Специальные команды — это быстрый способ протестировать или запустить одну команду на удаленном хосте.
Войдите в свой контроллер Ansible и выполните следующую команду. Эта команда использует модуль lineinfile ( -m ) для подключения к веб-машине и передачи аргумента ( -a ), который является командой для выполнения.
- путь обозначает расположение файла.
- regexp находит в файле регулярное выражение, если оно есть, и обновляет его с помощью 127.0.0.1 myapache, указанного в параметре строки. позволяет запускать команду от имени привилегированного пользователя.
- Интернет — это группа инвентаря, представляющая собой совокупность всех серверов.
- ansible.builtin.lineinfile или просто lineinfile — это имя модуля.
После выполнения команды вы должны увидеть сообщение CHANGED, подтверждающее успешное обновление строки на удаленном хосте.
Выполнение специальной команды с модулем ansible lineinfile
Войдите на удаленный узел с помощью клиента SSH и проверьте, обновлен ли файл /etc/hosts новым значением с помощью команды cat.
Как вы можете видеть ниже, запись localhost была успешно обновлена с помощью 127.0.0.1 myapache на удаленном компьютере.
Проверка хост-файла на удаленном компьютере
Изменение нескольких текстовых файлов в Playbook
Работа с одной специальной командой для управления строками на удаленном компьютере может быть приемлемой, но это будет сложно, если у вас есть строки в нескольких файлах или несколько строк в файле для управления. Вместо использования специальных команд рассмотрите возможность использования модуля Ansible lineinfile в playbook с помощью команды ansible-playbook.
Теперь давайте узнаем, как использовать модуль Ansible lineinfile в плейбуке и изменить несколько строк.
Предположим, что вы уже вошли в хост контроллера Ansible:
<р>1. Создайте каталог с именем ansible_lineinfile_module_demo в своем домашнем каталоге. В этом каталоге будет плейбук, который вы будете использовать для вызова модуля lineinfile. <р>2. Создайте еще один файл с именем my_playbook.yml в каталоге ~/ansible_lineinfile_module_demo и вставьте в него следующее содержимое playbook YAML. В этом плейбуке есть несколько задач, которые используют модуль Ansible lineinefile для управления строками различных файлов конфигурации для Apache на удаленном компьютере.Приведенная ниже инструкция содержит следующие задачи:
<р>1. Проверяет наличие ADMIN в файле /etc/sudoers; если нет, задача добавляет его. <р>2. Гарантирует, что Apache по умолчанию прослушивает 8080 в файле /etc/apache2/ports.conf; если он находит какой-либо другой порт, модуль lineinfile обновляет его до порта 8080. Точно так же в файле /etc/apache2/apache2.conf он обновляет MaxKeepAliveRequests до 1000 и KeepAliveTimeout до 100. <р>3. Добавляет строку с текстом «Здравствуйте, это моя страница Apache» в конце страницы index.html на удаленном сервере в каталоге /var/www/html.<р>3. Теперь вызовите playbook и выполните задачи с помощью команды ansible-playbook, чтобы добавить или обновить все строки, определенные в playbook на удаленном хосте.Плейбуки Ansible написаны на YAML.Чтобы узнать больше о YAML, нажмите здесь
Вызов ansible playbook
Ниже вы можете видеть, что TASK имеет статус изменено, что означает, что удаленный хост находится в ненадлежащем состоянии и был изменен для выполнения команды. Для той ЗАДАЧИ, которая имеет статус ОК, показывает, что они не требуют никаких изменений.
<р>4. Затем подключитесь к удаленному хосту по протоколу SSH с помощью вашего любимого клиента SSH. <р>5. Наконец, проверьте, все ли строки, определенные в my_playbook.yml, обновлены или добавлены на удаленном хосте с помощью команды cat.Снимок экрана ниже подтверждает, что администратор уже добавлен в файл sudoers.
Проверка файла sudoers
Опять же, приведенный ниже снимок экрана подтверждает, что apache по умолчанию прослушивает порт 8080.
Проверка портов в файле конфигурации
Наконец, проверьте MaxKeepAliveRequests и KeepAliveTimeout, если они были обновлены до 1000 и 100 соответственно.
Проверка MaxKeepAliveRequests и KeepAliveTimeout в файле конфигурации
Заключение
Модуль Ansible lineinfile — отличный способ изменять текстовые файлы на удаленных хостах. Модуль предоставляет отличный способ добавлять, удалять и изменять строки в текстовых файлах в ваших плейбуках.
Какие другие варианты использования, по вашему мнению, могут быть полезны при использовании модуля Ansible lineinfile?
Ненавидите рекламу? Хотите поддержать писателя? Получите многие из наших руководств в виде руководства по ATA.
Ещё от ATA Learning & Partners
Резервное копирование Office 365 для чайников
Лучшее руководство по защите данных Microsoft Office 365. Изучите готовые функции безопасности.
Руководства ATA
ATA известна своими высококачественными письменными учебными пособиями в виде сообщений в блогах. Поддержите ATA с помощью электронных книг ATA Guidebook PDF, доступных в автономном режиме и без рекламы!
Этот модуль является частью ansible-core и включен во все установки Ansible. В большинстве случаев можно использовать короткое имя модуля lineinfile даже без указания ключевого слова collections:. Однако мы рекомендуем использовать полное доменное имя, чтобы упростить ссылку на документацию модуля и избежать конфликтов с другими коллекциями, которые могут иметь такое же имя модуля.
Новое в версии 0.7: ansible.builtin
Краткий обзор
Этот модуль проверяет наличие определенной строки в файле или заменяет существующую строку с помощью регулярного выражения с обратной ссылкой.
Это в первую очередь полезно, когда вы хотите изменить только одну строку в файле.
См. модуль ansible.builtin.replace, если вы хотите изменить несколько похожих строк, или отметьте модуль ansible.builtin.blockinfile, если вы хотите вставить/обновить/удалить блок строк в файле. В других случаях см. модули ansible.builtin.copy или ansible.builtin.template.
Параметры
Если установлено, строка может содержать обратные ссылки (как позиционные, так и именованные), которые будут заполнены, если регулярное выражение совпадает.
Этот параметр немного изменяет работу модуля; insertbefore и insertafter будут игнорироваться, и если регулярное выражение нигде в файле не совпадает, файл останется без изменений.
Создайте файл резервной копии, включив в него информацию о временной метке, чтобы вы могли вернуть исходный файл, если вы каким-то образом стерли его неправильно.
Если установлено, вставки после и вставки перед будут работать с первой строкой, которая соответствует заданному регулярному выражению.
Если регулярные выражения передаются как в regexp, так и в insertafter , вставка после выполняется только в том случае, если совпадение с regexp не найдено.
Если регулярные выражения передаются как в regexp, так и в insertbefore , то insertbefore учитывается только в том случае, если совпадение с regexp не найдено.
Если установлены обратные ссылки, могут содержаться обратные ссылки, которые будут расширены с помощью групп захвата регулярных выражений, если регулярное выражение совпадает.
Для тех, кто привык к /usr/bin/chmod, помните, что режимы на самом деле представляют собой восьмеричные числа.Вы должны либо добавить начальный ноль, чтобы синтаксический анализатор Ansible YAML знал, что это восьмеричное число (например, 0644 или 01777), либо заключить его в кавычки (например, «644» или «1777»), чтобы Ansible получил строку и мог выполнить собственное преобразование из строки. в число.
Предоставление Ansible числа без соблюдения одного из этих правил приведет к получению десятичного числа, что приведет к неожиданным результатам.
Начиная с Ansible 1.8, режим может быть указан как символьный режим (например, u+rwx или u=rw,g=r,o=r ).
Если режим не указан и целевой объект файловой системы не существует, при установке режима для вновь созданного объекта файловой системы будет использоваться umask по умолчанию в системе.
Если режим не указан, а целевой объект файловой системы существует, будет использоваться режим существующего объекта файловой системы.
Указание режима — лучший способ убедиться, что объекты файловой системы создаются с правильными разрешениями. Дополнительные сведения см. в CVE-2020-1736.
Атрибуты, которыми должен обладать файл или каталог. Чтобы получить поддерживаемые флаги, просмотрите справочную страницу для chattr в целевой системе. Эта строка должна содержать атрибуты в том же порядке, в котором отображается lsattr.
Используется с state=present . Если установлено, строка может содержать обратные ссылки (как позиционные, так и именованные), которые будут заполнены, если регулярное выражение совпадает. Этот флаг немного меняет работу модуля; insertbefore и insertafter будут игнорироваться, и если регулярное выражение нигде в файле не совпадает, файл останется без изменений. Если регулярное выражение совпадает, последняя совпадающая строка будет заменена расширенным строковым параметром.
Создайте файл резервной копии, включив в него информацию о временной метке, чтобы вы могли вернуть исходный файл, если вы каким-то образом стерли его неправильно.
Используется с state=present . Если указано, файл будет создан, если он еще не существует. По умолчанию произойдет сбой, если файл отсутствует.
Используется с insertafter или insertbefore . Если установлено, вставки после и вставки перед поиском первой строки соответствуют регулярному выражению.
Используется с state=present . Если указано, строка будет вставлена после последнего совпадения указанного регулярного выражения. Если требуется первое совпадение, используйте (firstmatch=yes). Доступно специальное значение; EOF для вставки строки в конец файла. Если указанное регулярное выражение не имеет совпадений, вместо него будет использоваться EOF. Нельзя использовать с обратными ссылками .
Используется с state=present . Если указано, строка будет вставлена перед последним соответствием заданному регулярному выражению. Если требуется первое совпадение, используйте (firstmatch=yes). Доступно значение; BOF для вставки строки в начало файла. Если заданному регулярному выражению нет совпадений, строка будет вставлена в конец файла. Нельзя использовать с обратными ссылками .
Обязательно для состояния=присутствует . Строка для вставки/замены в файл. Если установлены обратные ссылки, они могут содержать обратные ссылки, которые будут расширены с помощью групп захвата регулярных выражений, если регулярное выражение совпадает.
Режим, которым должен быть файл или каталог. Для тех, кто привык к /usr/bin/chmod, помните, что режимы на самом деле представляют собой восьмеричные числа (например, 0644 или 01777 ). Отсутствие начального нуля, вероятно, приведет к неожиданным результатам. Начиная с версии 1.8 режим может быть указан как символьный режим (например, u+rwx или u=rw,g=r,o=r ).
Уровень — часть контекста файла SELinux. Это атрибут MLS/MCS, иногда называемый диапазоном. Функция _default работает так же, как и для seuser.
Пользовательская часть контекста файла SELinux. По умолчанию используется системная политика, если применимо. Если установлено значение _default , будет использоваться пользовательская часть политики, если она доступна.
Обычно этот модуль использует атомарные операции для предотвращения повреждения данных или несогласованного чтения из целевых файлов, иногда системы настроены или просто повреждены таким образом, чтобы это предотвратить. Одним из примеров являются файлы, смонтированные в Docker, их нельзя обновить атомарно, и это можно сделать только небезопасным способом.
Эта логическая опция позволяет Ansible вернуться к небезопасным методам обновления файлов в тех случаях, когда у вас нет другого выбора. Имейте в виду, что это зависит от условий гонки и может привести к повреждению данных.
Команда проверки для запуска перед копированием на место. Путь к файлу для проверки передается через «%s», который должен присутствовать, как в примере ниже. Команда передается безопасно, поэтому функции оболочки, такие как расширение и каналы, не будут работать.
Читайте также: