Установка и использование Ansible: полное руководство по автоматизации - docs.devboxops.com

Установка и использование Ansible: полное руководство по автоматизации

Полное руководство по установке и настройке Ansible: от базовой установки до создания playbook и управления ролями

Установка и использование Ansible

Что такое Ansible

Ansible — простая и гибкая система управления конфигурациями. Подразумевает минимум два файла для начала работы:

  • inventory-файл — список хостов, разделенных на группы
  • файл задач (playbook) — указатель на нужные роли, написанный в YAML-формате

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

Модули Ansible

В состав Ansible входит огромное количество модулей для развёртывания, контроля и управления различными компонентами:

  • Мониторинг (Nagios, monit)
  • Управление пакетами (apt, yum, rhn-channel, npm, pacman, pip, gem)
  • Работа с утилитами (git, hg)
  • Система (LVM, SELinux, ZFS, cron, файловые системы, сервисы, модули ядра)
  • Сеть и сетевая инфраструктура (OpenStack, Arista)
  • Файлы (шаблонизация, регулярные выражения, права доступа)
  • Базы данных (MySQL, PostgreSQL, Redis, Riak)
  • Облачные ресурсы и виртуализация (OpenStack, libvirt)
  • Оповещения (Jabber, IRC, почта, MQTT, HipChat)

О том, с чем умеет работать Ansible “из коробки”, можно прочитать в официальной документации.

Установка и подготовка к работе

На рабочей машине подключаем PPA и устанавливаем актуальную версию:

apt update
apt install software-properties-common
add-apt-repository --yes --update ppa:ansible/ansible
apt install ansible

Важно: Привилегии root для работы с Ansible не нужны, поэтому все операции выполняются под обычным пользователем.

Применение на практике

Добавление сервера в inventory-файл

Пример готового файла inventory.yml:

---
all:
  children:
    project-name:
      hosts:
        project-server:
          ansible_host: 'project-server.example.com'
      vars:
        ansible_user: 'root'
        ansible_python_interpreter: /usr/bin/python3

Обеспечение доступа к серверу для Ansible

Чтобы Ansible смог подключиться к серверу, необходимо предварительно добавить в /root/.ssh/authorized_keys на сервере публичную часть вашего ssh-ключа.

Рекомендация: После настройки убираем ключ, чтобы исключить вероятность случайного применения Ansible при ошибке в конфигах (например, если скопировали строчку в inventory-файле и не поменяли IP). Эта схема подходит для разовой настройки.

Проверка доступности хостов

Проверить доступность хоста для Ansible можно с помощью модуля ping:

ansible -m ping all -i ~/ansible_hosts

Пример вывода:

server-tester | SUCCESS => {
    "changed": false,
    "failed": false,
    "ping": "pong"
}

Подготовка playbook

Перед подготовкой необходимо ознакомиться с синтаксисом YAML. В playbook указываем:

  • Название
  • Хост
  • Пользователя, под которым Ansible будет работать
  • Путь к файлам с переменными
  • Нужные роли

Когда Ansible видит название роли (например, atop), он ищет одноименный каталог в ~/project-ansible/roles/. Там должна быть готова структура роли: ~/project-ansible/roles/atop/tasks/main.yml.

Пример playbook:

---
- name: General playbook
  hosts: all
  become: true
  become_method: sudo
  vars_files:
    - vault.yml

  roles:
    - role: nginx
      nginx_letsencrypt_cert_renewal : true
      nginx_vhosts:
        - main_server_config.j2
        - proxied_server_config.j2
      domain_name: "XXXYYYZZZ-students.devboxops.xyz"
      proxied_domain_name: "XXXYYYZZZ-proxied-students.devboxops.xyz"

    - role: user
      user_name: "dev-user"
      user_password: "prod_user_password"
      user_sudo: "yes"
      user_sudoers: ["/bin/systemctl stop systemd-journald", "/bin/systemctl start systemd-journald"]
      user_ssh_key: "key1"

    - role: user
      user_name: "prod-user"
      user_password: "dev_user_password"
      user_sudo: "yes"
      user_sudoers: ["/bin/systemctl stop rsyslog", "/bin/systemctl start rsyslog"]
      user_ssh_key: "key2"

Запуск playbook

Когда inventory-файл и playbook готовы, запускаем Ansible командой:

ansible-playbook -i inventory/project --ask-vault-pass servername.yml

где servername.yml — подготовленный playbook.

Пример минимального playbook с одной ролью:

- name: testsrv server
  hosts: testsrv
  remote_user: root
  roles:
    - nginx

Получаемый вывод:

$ ansible-playbook testsrv.yml -i ~/ansible_hosts

PLAY [testsrv server] *****************************************************************

TASK [Gathering Facts] ***************************************************************
ok: [testsrv]

TASK [nginx : install packages] *******************************************************
changed: [testsrv] => (item=[u'nginx'])

TASK [nginx : nginx service check] *****************************************************
ok: [testsrv]

TASK [nginx : nginx enable] ************************************************************
changed: [testsrv]

RUNNING HANDLER [nginx : nginx restart] ************************************************
changed: [testsrv]

PLAY RECAP ***************************************************************************
testsrv                     : ok=2   changed=3    unreachable=0    failed=0

Результаты выполнения модулей

В выводе отображается результат работы каждого модуля:

  • ok — модуль отработал корректно, изменения на сервере не требуются
  • changed — модуль отработал корректно, внесены изменения на сервер
  • unreachable — не удалось подключиться к серверу по SSH
  • failed — что-то пошло не так

Повторный запуск

Если какие-то модули отработали некорректно и причины были исправлены, playbook можно запустить повторно. Запуск пройдет быстрее, так как Ansible не будет повторно обновлять кэш apt, устанавливать пакеты и т.д.

Пример повторного запуска:

$ ansible-playbook testsrv.yml -i ~/ansible_hosts

PLAY [testsrv server] *****************************************************************

TASK [Gathering Facts] ***************************************************************
ok: [testsrv]

TASK [nginx : install packages] *******************************************************
ok: [testsrv] => (item=[u'nginx'])

TASK [nginx : nginx service check] *****************************************************
ok: [testsrv]

TASK [nginx : nginx enable] ************************************************************
ok: [testsrv]

RUNNING HANDLER [nginx : nginx restart] ************************************************
ok: [testsrv]

PLAY RECAP ***************************************************************************
testsrv                     : ok=5    changed=0    unreachable=0    failed=0

Запуск с опцией –check

Ansible поддерживает режим Dry Run с опцией --check. При запуске playbook с этой опцией на сервере не будет произведено никаких изменений.

Особенности режима –check

  • Модули, поддерживающие check mode — сообщат об изменениях, которые должны быть внесены (без фактического применения)
  • Модули, не поддерживающие check mode — не будут осуществлять изменения, но и не сообщат о том, что должно быть изменено

Ограничения Dry Run

Dry run может работать неэффективно в случаях, когда в playbook есть шаги, использующие переменные, задаваемые при выполнении предыдущих команд.

Пример проблемы с предварительно скачиваемым бинарником:

TASK [test-binary : extract binary to /usr/local/bin] ***************************
fatal: [testsrv]: FAILED! => {
  "changed": false,
  "msg": "Source '/tmp/test-binary.tar.gz' does not exist"
}

Типичные проблемы при использовании –check:

  • Скачивание файлов и последующее их использование
  • Проверка checksum различными шагами
  • Создание симлинков на несуществующие файлы

Параметры проверки в Ansible

В Ansible существует 3 параметра, связанных с проверкой:

  1. Опция –check (dry run)
  2. Check mode в модулях
  3. Параметр task’ов check_mode

Таблица поведения check mode

Таблица ниже демонстрирует что, происходит при их использовании(взято здесь)

|============|=========|======================|==================|
| check_mode | dry run | check mode supported | result           |
|============|=========|======================|==================|
|   true     |   no    |   no                 |   skip           |
|   false    |   no    |   no                 |   run            |
|   absent   |   no    |   no                 |   run            |
|------------|---------|----------------------|------------------|
|   true     |   no    |   yes                |   report changed |
|   false    |   no    |   yes                |   run            |
|   absent   |   no    |   yes                |   run            |
|============|=========|======================|==================|
|   true     |   yes   |   no                 |   skip           |
|   false    |   yes   |   no                 |   run            |
|   absent   |   yes   |   no                 |   skip (!)       |
|   true     |   yes   |   yes                |   report_changed |
|   false    |   yes   |   yes                |   run            |
|   absent   |   yes   |   yes                |   report_changed |
|============|=========|======================|==================|

Некоторые подробности доступны тут

Ссылки

Top