Модули – это дискретные единицы кода, которые можно запускать с помощью командной строки или с помощью плейбука для того, чтобы вносить определенные изменения в целевой узел или собирать с него информацию. 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Р на курсы Слёрма.
vanyas
Это скорее для новичка статься, первый раз увидевшего ансибл, а не для "DevOps-профессионала", как сказано в заголовке статьи