Ansible — это комплексное решение для автоматизации вашей ИТ-среды. Вы можете использовать Ansible для автоматизации настройки серверов Linux и Windows, оркестровки предоставления услуг, развертывания облачных сред и даже настройки сетевых устройств.
Модули Ansible абстрагируют действия в вашей системе, поэтому вам не нужно беспокоиться о деталях реализации. Вы просто описываете желаемое состояние, а Ansible гарантирует, что целевая система ему соответствует.
Доступность этого модуля — одно из основных преимуществ Ansible, и его часто называют Ansible с «включенными батареями». Действительно, вы можете найти модули для большого количества задач, и хотя это здорово, я часто слышу от новичков, что они не знают, с чего начать.
Хотя ваш выбор модулей будет зависеть исключительно от ваших требований и того, что вы пытаетесь автоматизировать с помощью Ansible, вот десять основных модулей, которые вам понадобятся для начала работы с Ansible для автоматизации системы Linux.
Модуль 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следующий модуль.
template
Модуль template работает аналогично copyмодулю, но он обрабатывает контент динамически с использованием языка шаблонов Jinja2 перед его копированием на целевые хосты.
copy
Например, определите шаблон «сообщение дня», который отображает имя целевой системы, например:
$ 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это файл результатов:
rh8-vm03
Welcome to rh8-vm03.
Хотя copyмодуль также может интерполировать переменные при использовании contentпараметра, templateмодуль обеспечивает дополнительную гибкость за счет создания файлов шаблонов, которые позволяют определять более сложное содержимое, включая forциклы, ifусловия и многое другое. Для получения полной справки проверьте документацию Jinja2 .
content
for
if
Этот модуль также является идемпотентным и не будет копировать файл, если содержимое целевой системы уже соответствует содержимому шаблона.
User модуль позволяет создавать и управлять пользователями Linux в целевой системе. Этот модуль имеет множество различных параметров, но в самом простом виде вы можете использовать его для создания нового пользователя.
Например, чтобы создать пользователя ricardoс UID 2001, частью групп usersи wheel, и паролем mypassword, примените userмодуль со следующими параметрами:
ricardo
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 устанавливает пароль только при создании пользователя, а не при последующих запусках.
update_password: on_create
Вы также можете использовать этот модуль для удаления пользователя, установив параметр state: absent.
state: absent
В userмодуле есть множество опций для управления несколькими пользовательскими аспектами. Обязательно ознакомьтесь с документацией модуля для получения дополнительной информации.
Модуль package позволяет вам устанавливать, обновлять или удалять программные пакеты из вашей целевой системы с помощью стандартного диспетчера пакетов операционной системы.
Например, чтобы установить веб-сервер Apache на машине Red Hat Linux, примените модуль следующим образом:
- name: Ensure Apache package is installed package: name: httpd state: present
Этот модуль не зависит от дистрибутива и работает с использованием базового менеджера пакетов, например, yum/dnfдля дистрибутивов aptна основе Red Hat и для Debian. Из-за этого он выполняет только основные задачи, такие как установка и удаление пакетов. Если вам нужен больший контроль над параметрами диспетчера пакетов, используйте специальный модуль для целевого дистрибутива.
yum/dnf
apt
Также имейте в виду, что, хотя сам модуль работает в разных дистрибутивах, имя пакета для каждого может быть разным. Например, в дистрибутиве на основе Red Hat пакет веб-сервера Apache имеет имя httpd, а в Debian — apache2. Убедитесь, что ваши инструкции справляются с этим.
httpd
apache2
Этот модуль идемпотентен, и он не будет действовать, если текущее состояние системы совпадает с желаемым.
Используйте Service модуль для управления целевыми системными службами с помощью необходимой системы инициализации; например, systemd .
В самой простой форме все, что вам нужно сделать, это указать имя службы и желаемое состояние. Например, чтобы запустить sshdслужбу, используйте такой модуль:
sshd
- name: Ensure SSHD is started service: name: sshd state: started
Вы также можете обеспечить автоматический запуск службы при загрузке целевой системы, указав параметр enabled: yes.
enabled: yes
Как и packageмодуль, serviceмодуль гибок и работает в разных дистрибутивах. Если вам нужна тонкая настройка конкретной целевой системы инициализации, используйте соответствующий модуль; например, модуль systemd.
package
service
systemd
Подобно другим модулям, которые вы видели до сих пор, этот serviceмодуль также идемпотентен.
Используйте модуль firewalld для управления системным брандмауэром с помощью firewalldдемона в системах, которые его поддерживают, например в дистрибутивах на основе Red Hat.
firewalld
Например, чтобы открыть службу HTTP на порту 80, используйте ее так:
- name: Ensure port 80 (http) is open firewalld: service: http state: enabled permanent: yes immediate: yes
Вы также можете указать настраиваемые порты вместо имен служб с помощью portпараметра. В этом случае обязательно укажите протокол. Например, чтобы открыть TCP-порт 3000, используйте это:
port
- name: Ensure port 3000/TCP is open firewalld: port: 3000/tcp state: enabled permanent: yes immediate: yes
Вы также можете использовать этот модуль для управления другими firewalldаспектами, такими как зоны или сложные правила. Обязательно проверьте документацию модуля, чтобы получить полный список опций.
File модуль позволяет контролировать состояние файлов и разрешения каталогов , устанавливающими, право собственности, и SELinux этикетки.
Например, используйте fileмодуль для создания каталога, /appпринадлежащего пользователю ricardo, с разрешениями на чтение, запись и выполнение для владельца и группы users:
file
/app
- name: Ensure directory /app exists file: path: /app state: directory owner: ricardo group: users mode: 0770
Вы также можете использовать этот модуль для рекурсивной установки свойств файлов в каталогах с помощью параметра recurse: yesили удаления файлов и каталогов с помощью параметра state: absent.
recurse: yes
Этот модуль работает с идемпотентностью для большинства своих параметров, но некоторые из них могут заставлять его каждый раз менять целевой путь. Подробности смотрите в документации.
Модуль 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:
regexp
sshd_config
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, чтобы включить это изменение.
Этот модуль также является идемпотентным, но в случае модификации строки убедитесь, что регулярное выражение соответствует как исходному, так и обновленному состоянию, чтобы избежать ненужных изменений.
Используйте модуль unarchive для извлечения содержимого архивных файлов, таких как tarили zipfiles. По умолчанию он копирует архивный файл с управляющего узла на целевую машину перед его извлечением. Измените это поведение, указав параметр remote_src: yes.
tar
zip
remote_src: yes
Например, извлеките содержимое .tar.gzфайла, который уже был загружен на целевой хост, с помощью этого синтаксиса:
.tar.gz
- name: Extract contents of app.tar.gz unarchive: src: /tmp/app.tar.gz dest: /app remote_src: yes
Некоторые технологии архивирования требуют, чтобы в целевой системе были доступны дополнительные пакеты; например, пакет unzipдля извлечения .zipфайлов.
unzip
.zip
В зависимости от используемого формата архива этот модуль может работать идемпотентно, а может и не работать. Чтобы предотвратить ненужные изменения, вы можете использовать параметр, createsчтобы указать файл или каталог, который этот модуль будет создавать при извлечении содержимого архива. Если этот файл или каталог уже существует, модуль не извлекает содержимое снова.
creates
Command модуль является гибким , что позволяет выполнять произвольные команды на целевой системе. Используя этот модуль, вы можете делать в целевой системе практически все, если для этого есть команда.
Несмотря на то, что commandмодуль гибкий и мощный, его следует использовать с осторожностью. Избегайте использования командного модуля для выполнения задачи, если для этого доступен другой подходящий модуль. Например, вы можете создавать пользователей, используя commandмодуль для выполнения useraddкоманды, но вместо этого вы должны использовать userмодуль, поскольку он отвлекает от вас многие детали, заботясь о крайних случаях и обеспечивая изменение конфигурации только при необходимости.
command
useradd
В случаях, когда модули недоступны, или для запуска пользовательских скриптов или программ, commandмодуль по-прежнему является отличным ресурсом. Например, используйте этот модуль для запуска сценария, который уже присутствует на целевой машине:
- name: Run the app installer command: "/app/install.sh"
По умолчанию этот модуль не идемпотентен, поскольку Ansible выполняет команду каждый раз. Чтобы сделать commandмодуль идемпотентным, вы можете использовать whenусловия для выполнения команды только при наличии соответствующего условия или createsаргумента, аналогично примеру с разархивированным модулем.
when
Используя эти модули, вы можете настраивать целые системы Linux, копируя, создавая шаблоны или изменяя файлы конфигурации, создавая пользователей, устанавливая пакеты, запуская системные службы, обновляя брандмауэр и т. Д.
Если вы новичок в Ansible, обязательно ознакомьтесь с документацией о том, как создавать playbooks, чтобы объединить эти модули для автоматизации вашей системы.
Начиная с Ansible 2.10, модули организованы в коллекции. Большинство модулей в этом списке являются частью ansible.builtinколлекции и доступны по умолчанию в Ansible, но некоторые из них являются частью других коллекций. Список коллекций можно найти в документации Ansible .
ansible.builtin
Продолжая использовать данный сайт вы принимаете политику конфиденциальности и cookies