10 модулей Ansible для автоматизации системы Linux

Ansible — это комплексное решение для автоматизации вашей ИТ-среды. Вы можете использовать Ansible для автоматизации настройки серверов Linux и Windows, оркестровки предоставления услуг, развертывания облачных сред и даже настройки сетевых устройств.

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

Доступность этого модуля — одно из основных преимуществ Ansible, и его часто называют Ansible с «включенными батареями». Действительно, вы можете найти модули для большого количества задач, и хотя это здорово, я часто слышу от новичков, что они не знают, с чего начать.

Хотя ваш выбор модулей будет зависеть исключительно от ваших требований и того, что вы пытаетесь автоматизировать с помощью Ansible, вот десять основных модулей, которые вам понадобятся для начала работы с Ansible для автоматизации системы Linux.

1. Copy

Модуль copy позволяет копировать файл с узла управления Ansible на целевые хосты. Помимо копирования файла, он позволяет вам установить владельца, права доступа и метки SELinux для файла назначения. Вот пример использования модуля копирования для копирования файла конфигурации «сообщения дня» на целевые хосты:

- name: Ensure MOTD file is in place
  copy:
    src: files/motd
    dest: /etc/motd
    owner: root
    group: root
    mode: 0644

Для менее сложного содержимого вы можете скопировать содержимое непосредственно в целевой файл, не имея локального файла, например:

- name: Ensure MOTD file is in place
  copy:
    content: "Welcome to this system."
    dest: /etc/motd
    owner: root
    group: root
    mode: 0644

Этот модуль работает идемпотентно , что означает, что он будет копировать файл только в том случае, если тот же файл еще не существует с тем же содержимым и разрешениями.

Модуль копирования — отличный вариант для копирования небольшого количества файлов со статическим содержимым. Если вам нужно скопировать большое количество файлов, обратите внимание на модуль синхронизации . Чтобы скопировать файлы с динамическим содержимым, взгляните на templateследующий модуль.

2. Template

Модуль template работает аналогично copyмодулю, но он обрабатывает контент динамически с использованием языка шаблонов Jinja2 перед его копированием на целевые хосты.

Например, определите шаблон «сообщение дня», который отображает имя целевой системы, например:

vi templates/motd.j2
Welcome to {{ inventory_hostname }}.

Затем создайте экземпляр этого шаблона с помощью templateмодуля, например:

- name: Ensure MOTD file is in place
  template:
    src: templates/motd.j2
    dest: /etc/motd
    owner: root
    group: root
    mode: 0644

Перед копированием файла Ansible обрабатывает шаблон и интерполирует переменную, заменяя ее именем целевой хост-системы. Например, если имя целевой системы — rh8-vm03это файл результатов:

Welcome to rh8-vm03.

Хотя copyмодуль также может интерполировать переменные при использовании contentпараметра, templateмодуль обеспечивает дополнительную гибкость за счет создания файлов шаблонов, которые позволяют определять более сложное содержимое, включая forциклы, ifусловия и многое другое. Для получения полной справки проверьте документацию Jinja2 .

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

3. User

User модуль позволяет создавать и управлять пользователями Linux в целевой системе. Этот модуль имеет множество различных параметров, но в самом простом виде вы можете использовать его для создания нового пользователя.

Например, чтобы создать пользователя ricardoс UID 2001, частью групп usersи wheel, и паролем mypassword, примените userмодуль со следующими параметрами:

- name: Ensure user ricardo exists
  user:
    name: ricardo
    group: users
    groups: wheel
    uid: 2001
    password: "{{ 'mypassword' | password_hash('sha512') }}"
    state: present

Обратите внимание, что этот модуль пытается быть идемпотентным, но не может гарантировать этого для всех его параметров. Например, если вы снова выполните предыдущий пример модуля, он сбросит пароль на определенное значение, изменяя пользователя в системе для каждого выполнения. Чтобы сделать этот пример идемпотентным, используйте параметр update_password: on_create, гарантирующий, что Ansible устанавливает пароль только при создании пользователя, а не при последующих запусках.

Вы также можете использовать этот модуль для удаления пользователя, установив параметр state: absent.

В userмодуле есть множество опций для управления несколькими пользовательскими аспектами. Обязательно ознакомьтесь с документацией модуля для получения дополнительной информации.

4. Package

Модуль package позволяет вам устанавливать, обновлять или удалять программные пакеты из вашей целевой системы с помощью стандартного диспетчера пакетов операционной системы.

Например, чтобы установить веб-сервер Apache на машине Red Hat Linux, примените модуль следующим образом:

- name: Ensure Apache package is installed
  package:
    name: httpd
    state: present

Этот модуль не зависит от дистрибутива и работает с использованием базового менеджера пакетов, например, yum/dnfдля дистрибутивов aptна основе Red Hat и для Debian. Из-за этого он выполняет только основные задачи, такие как установка и удаление пакетов. Если вам нужен больший контроль над параметрами диспетчера пакетов, используйте специальный модуль для целевого дистрибутива.

Также имейте в виду, что, хотя сам модуль работает в разных дистрибутивах, имя пакета для каждого может быть разным. Например, в дистрибутиве на основе Red Hat пакет веб-сервера Apache имеет имя httpd, а в Debian — apache2. Убедитесь, что ваши инструкции справляются с этим.

Этот модуль идемпотентен, и он не будет действовать, если текущее состояние системы совпадает с желаемым.

5. Service

Используйте Service модуль для управления целевыми системными службами с помощью необходимой системы инициализации; например, systemd .

В самой простой форме все, что вам нужно сделать, это указать имя службы и желаемое состояние. Например, чтобы запустить sshdслужбу, используйте такой модуль:

- name: Ensure SSHD is started
  service:
    name: sshd
    state: started

Вы также можете обеспечить автоматический запуск службы при загрузке целевой системы, указав параметр enabled: yes.

Как и packageмодуль, serviceмодуль гибок и работает в разных дистрибутивах. Если вам нужна тонкая настройка конкретной целевой системы инициализации, используйте соответствующий модуль; например, модуль systemd.

Подобно другим модулям, которые вы видели до сих пор, этот serviceмодуль также идемпотентен.

6. Firewalld

Используйте модуль firewalld для управления системным брандмауэром с помощью firewalldдемона в системах, которые его поддерживают, например в дистрибутивах на основе Red Hat.

Например, чтобы открыть службу HTTP на порту 80, используйте ее так:

- name: Ensure port 80 (http) is open
  firewalld:
    service: http
    state: enabled
    permanent: yes
    immediate: yes

Вы также можете указать настраиваемые порты вместо имен служб с помощью portпараметра. В этом случае обязательно укажите протокол. Например, чтобы открыть TCP-порт 3000, используйте это:

- name: Ensure port 3000/TCP is open
  firewalld:
    port: 3000/tcp
    state: enabled
    permanent: yes
    immediate: yes

Вы также можете использовать этот модуль для управления другими firewalldаспектами, такими как зоны или сложные правила. Обязательно проверьте документацию модуля, чтобы получить полный список опций.

7. File

File модуль позволяет контролировать состояние файлов и разрешения каталогов , устанавливающими, право собственности, и SELinux этикетки.

Например, используйте fileмодуль для создания каталога, /appпринадлежащего пользователю ricardo, с разрешениями на чтение, запись и выполнение для владельца и группы users:

- name: Ensure directory /app exists
  file:
    path: /app
    state: directory
    owner: ricardo
    group: users
    mode: 0770

Вы также можете использовать этот модуль для рекурсивной установки свойств файлов в каталогах с помощью параметра recurse: yesили удаления файлов и каталогов с помощью параметра state: absent.

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

8. Lineinfile

Модуль lineinfile позволяет вам управлять отдельными строками в существующих файлах. Полезно обновлять целевую конфигурацию в существующих файлах без изменения остальной части файла или копирования всего файла конфигурации.

Например, добавьте новую запись в файл хостов следующим образом:

- name: Ensure host rh8-vm03 in hosts file
  lineinfile:
    path: /etc/hosts
    line: 192.168.122.236 rh8-vm03
    state: present

Вы также можете использовать этот модуль для изменения существующей строки, применив параметр regexpдля поиска существующей строки для замены. Например, обновите sshd_configфайл, чтобы предотвратить вход в систему с правами root, изменив строку PermitRootLogin yesна PermitRootLogin no:

- name: Ensure root cannot login via ssh
  lineinfile:
    path: /etc/ssh/sshd_config
    regexp: '^PermitRootLogin'
    line: PermitRootLogin no
    state: present

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

Этот модуль также является идемпотентным, но в случае модификации строки убедитесь, что регулярное выражение соответствует как исходному, так и обновленному состоянию, чтобы избежать ненужных изменений.

9. Unarchive

Используйте модуль unarchive для извлечения содержимого архивных файлов, таких как tarили zipfiles. По умолчанию он копирует архивный файл с управляющего узла на целевую машину перед его извлечением. Измените это поведение, указав параметр remote_src: yes.

Например, извлеките содержимое .tar.gzфайла, который уже был загружен на целевой хост, с помощью этого синтаксиса:

- name: Extract contents of app.tar.gz
  unarchive:
    src: /tmp/app.tar.gz
    dest: /app
    remote_src: yes

Некоторые технологии архивирования требуют, чтобы в целевой системе были доступны дополнительные пакеты; например, пакет unzipдля извлечения .zipфайлов.

В зависимости от используемого формата архива этот модуль может работать идемпотентно, а может и не работать. Чтобы предотвратить ненужные изменения, вы можете использовать параметр, createsчтобы указать файл или каталог, который этот модуль будет создавать при извлечении содержимого архива. Если этот файл или каталог уже существует, модуль не извлекает содержимое снова.

10. Command

Command модуль является гибким , что позволяет выполнять произвольные команды на целевой системе. Используя этот модуль, вы можете делать в целевой системе практически все, если для этого есть команда.

Несмотря на то, что commandмодуль гибкий и мощный, его следует использовать с осторожностью. Избегайте использования командного модуля для выполнения задачи, если для этого доступен другой подходящий модуль. Например, вы можете создавать пользователей, используя commandмодуль для выполнения useraddкоманды, но вместо этого вы должны использовать userмодуль, поскольку он отвлекает от вас многие детали, заботясь о крайних случаях и обеспечивая изменение конфигурации только при необходимости.

В случаях, когда модули недоступны, или для запуска пользовательских скриптов или программ, commandмодуль по-прежнему является отличным ресурсом. Например, используйте этот модуль для запуска сценария, который уже присутствует на целевой машине:

- name: Run the app installer
  command: "/app/install.sh"

По умолчанию этот модуль не идемпотентен, поскольку Ansible выполняет команду каждый раз. Чтобы сделать commandмодуль идемпотентным, вы можете использовать whenусловия для выполнения команды только при наличии соответствующего условия или createsаргумента, аналогично примеру с разархивированным модулем.

Что дальше?

Используя эти модули, вы можете настраивать целые системы Linux, копируя, создавая шаблоны или изменяя файлы конфигурации, создавая пользователей, устанавливая пакеты, запуская системные службы, обновляя брандмауэр и т. Д.

Если вы новичок в Ansible, обязательно ознакомьтесь с документацией о том, как создавать playbooks, чтобы объединить эти модули для автоматизации вашей системы.

Начиная с Ansible 2.10, модули организованы в коллекции. Большинство модулей в этом списке являются частью ansible.builtinколлекции и доступны по умолчанию в Ansible, но некоторые из них являются частью других коллекций. Список коллекций можно найти в документации Ansible .