[Перевод] Ansible: 30 самых важных модулей для DevOps-профессионалов (часть 1)

f54c1f396ae96f1d09fbfffb63deab4d.PNG

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

Применив обозначенную выше команду, получим результат в следующем формате:

dd7a385cdb44dbd42f328ba92914d196.png

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

5ae5bc6a5a8e3a32b3c7c5536e333252.png

Модуль 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Р на курсы Слёрма. 

Посмотреть программу курса и записаться.

© Habrahabr.ru