Модули – это дискретные единицы кода, которые можно запускать с помощью командной строки или с помощью плейбука для того, чтобы вносить определенные изменения в целевой узел или собирать с него информацию. Ansible реализует каждый модуль на удалённом целевом узле, а также собирает ответные значения. Модули Ansible также известны как плагины задач или библиотечные плагины.
Существует несколько наиболее важных Ansible-модулей, которые часто используются при автоматизации ряда задач. Но охватить все важные модули в одной статье будет не самой хорошей идеей, поэтому мы делим её на три части.
В этой части мы рассмотрим модули проверки подключения хоста, а также целевого узла (модуль ping), модуль, который может извлекать информацию с целевого узла (модуль setup), модули управления существующим пакетом и установки новых пакетов (yum, apt, package, pip и npm модули), а также модуль запуска базовых команд и скриптов на целевых узлах (raw, command, shell и script модули).
Итак, начнём..
Модуль Ping
Модуль Ping используется при проверке на удаленном хосте, особенно при подключении к удаленному хосту, и проверке Python на нём. Он также может использоваться для проверки логина пользователя и доступов.
--- - name: ping module hosts: all become: false tasks: - name: test connection ping:
Результатом выполнения команды будет:
host-1 | SUCCESS => { “ansible_facts”: { “discovered_interpreter_python”: “/usr/bin/python” }, “changed”: false, “ping”: “pong” }
Важные факты о модуле Ping:
Он не работает на ICMP, но по умолчанию работает на SSH или на любом другом установленном методе подключения.
Одним из допустимых параметров являются данные, которые принимают значения вида pong, crash или какой-либо другой строки.
Pong – по умолчанию. Он представляет собой возвращаемое значение при успешном выполнении.
Если данные предоставлены со значением crash, то этот модуль вернет исключение.
Модуль Setup
Модуль Setup помогает нам в сборе данных о целевых узлах, таких как hostname, ip, os и других. Этот модуль автоматически реализуется плейбуком для сбора полезной информации об удаленном хосте. Вся информация представлена в удобном формате t JSON, а всем значениям предшествует “ansible_”.
ansible host-1 -m setup -u ec2-user
Применив обозначенную выше команду, получим результат в следующем формате:

Также можно отфильтровать результаты, используя параметр фильтра:

Модуль yum
Модуль yum используется для установки различных пакетов или программного обеспечения в Linux на базе Redhat.
--- - name: Update Package on linux system hosts: all become: yes tasks: - name: Uninstall Apache yum: name: nginx state: absent - name: Install a list of packages with a list variable yum: name: "{{ packages }}" vars: packages: - httpd - httpd-tools
Модуль apt
Модуль apt package используется для управления ПО в ОС Linux на базе debian.
--- - name: Update Package on debian system hosts: all become: yes tasks: - name: Run the equivalent of "apt-get update" as a separate step apt: update_cache: yes - name: Install latest version of "openjdk-6-jdk" apt: name: openjdk-6-jdk state: latest install_recommends: no
Модуль package
Этот модуль управляет пакетами на целевом объекте без указания модуля диспетчера пакетов (yum, apt, …). Его удобно использовать в гетерогенной среде без необходимости создавать конкретную задачу под каждого менеджера пакетов. Этот модуль выступает в качестве прокси-сервера для базового модуля диспетчера пакетов, тогда как все параметры будут переданы базовому модулю:
--- - name: Update Packages on target system hosts: all become: yes tasks: - name: Install ntpdate ansible.builtin.package: name: ntpdate state: present - name: Install the latest version of Apache and MariaDB ansible.builtin.package: name: - httpd - mariadb-server state: latest
Модуль pip
Модуль pip используется при управлении пакетами Python в целевой системе.
--- - name: Update python packages hosts: all become: yes tasks: - name: Install multi python packages with version specifiers pip: name: - django>1.11.0,<1.12.0 - bottle>0.10,<0.20,!=0.11 - name: Install specified python requirements pip: requirements: /my_app/requirements.txt
Модуль npm
Модуль npm используется при управлении node.js пакетами. Этот модуль не является частью ansible-core модулей. Для того, чтобы использовать его в плейбуке, укажите: community.general.npm.
--- - name: npm module hosts: all tasks: - name: Install "coffee-script" node.js package. community.general.npm: name: coffee-script path: /app/location - name: Install packages based on package.json. community.general.npm: path: /app/location
Модуль raw
Модуль raw используется при выполнении низкоуровневой команды SSH, она очень эффективна, но должна выполняться лишь в нескольких случаях.
Наиболее распространенным случаем является установка Python в системе, в которой Python отсу��ствует. Другим случаем является обращение к любым устройствам, таким как маршрутизаторы, на которых не установлен Python.
В любом другом случае уместнее будет использовать модуль shell или модуль command. Параметры, переданные модулем raw, выполняются напрямую через удалённый настроенный модуль shell.
--- - name: raw module usage hosts: all become: yes tasks: - name: Bootstrap a host without python2 installed raw: dnf install -y python2 python2-dnf libselinux-python - name: Run a command that uses non-posix shell-isms (in this example /bin/sh doesn't handle redirection and wildcards together but bash does) raw: cat < /tmp/*txt args: executable: /bin/bash
Модуль Command
Модуль Command используется для выполнения команд на удаленном узле. В основном он применяется для выполнения простых команд Linux. Команда или несколько команд не будут обрабатываться модулем shell, поэтому такие переменные, как $HOSTNAME и операции типа “*”, “<”, “>”, “|”, “;” не будут работать. Для целей Windows нужно использовать модуль win_command. Для целей на базе Windows win_command может использоваться вместо модуля command.
--- - name: command module hosts: all tasks: - name: Run command if /path/to/database does not exist (without 'args') command: /usr/bin/make_database.sh db_user db_name creates=/path/to/database - name: Run command if /path/to/database does not exist (with 'args' keyword) ansible.builtin.command: /usr/bin/make_database.sh db_user db_name args: creates: /path/to/database
Модуль shell
Модуль shell предназначен для выполнения shell-команд на целевых хостах на базе unix. В отличие от модуля Ansible command, Ansible Shell будет принимать очень сложные команды с каналами, переадресацией и т.д. Также можно выполнять shell script с помощью этого модуля. Этот модуль предназначен для работы только с ПО на базе Linux, а не Windows. Для Windows следует использовать модуль win_powershell.
--- - name: shell module hosts: all tasks: - name: This command will change the working directory to somedir/ and will only run when somedir/somelog.txt doesn't exist shell: somescript.sh >> somelog.txt args: chdir: somedir/ creates: somelog.txt - name: This command will change the working directory to somedir/ shell: cmd: ls -l | grep log chdir: somedir/ - name: Run a command that uses non-posix shell-isms (in this example /bin/sh doesn't handle redirection and wildcards together but bash does) shell: cat < /tmp/*txt args: executable: /bin/bash
Модуль script
Модуль script можно использовать для запуска локального скрипта на удаленном узле. Когда мы вызываем модуль shell и передаем ему локальный shell script, сначала он передает script на удаленный узел бэкэнда, а затем выполняет его.
Две важные вещи, которые следует знать об этом модуле: первая – он не требует Python на удаленном узле, вторая – script выполняется через shell. Модуль script также поддерживается для узлов на базе Windows.
--- - name: script module hosts: all tasks: - name: Run a script with arguments (free form) ansible.builtin.script: /some/local/script.sh --some-argument 1234 - name: Run a script with arguments (using 'cmd' parameter) ansible.builtin.script: cmd: /some/local/script.sh --some-argument 1234
В следующей части мы рассмотрим все модули, связанные с управлением различными файлами и их свойствами, такими как модуль копирования или загрузки файлов (модули copy, fetch и get_url), модуль сжатия и распаковки файлов (модули archive и unarchive), модуль создания/удаления (модуль file), модуль управления доступом к файлам (модуль acl), модуль управления файловой конфигурацией (модуль template), модуль поиска файлов (модуль find) и модуль для замены текста внутри содержимого файла (модули replace, lineinfile и blockinfile).
Еще немного об изучении Ansible
Тех, кто хочет научиться управлять серверами и автоматизировать задачи с помощью Ansible, мы приглашаем на наш курс «Ansible: Infrastructure as Code», который пройдет с 23 января по 19 февраля.
Знания из курса особенно пригодятся администраторам, инженерам и желающим подняться вверх по карьерной лестнице в качестве девопса.
На курсе вы:
Узнаете как работать с переменными, как писать плейбуки и роли;
Развернете LEMP стек, PostgreSQL и Mongo кластеры,
Задеплоите Flask приложение;
Напишите свой модуль для Ansible;
Настроите IaC в Gitlab;
Разберетесь с работой с облаками и enterprise решениями.
После обучения вы сможете конфигурировать рутинные задачи с помощью удобного инструмента без страха правок конфигураций. Вы будете понимать, когда и как писать свои модули, а также смело залазить под капот Ansible.
Купите курс до 28 декабря и участвуйте в розыгрыше сертификата на 500 000Р на курсы Слёрма.
