Skip to main content

Ansible

Ansible automates the management of remote systems and controls their desired state.

Документация и другие ссылки

Ansible - инструмент управления и контроля состояния системы. Удаленной системы, что важно так как используется аnsible для упралвения серверами, раскатки приложений и т.п.

"контроля состояния" - это тоже немаловажно, так как у нас есть возможность в декларативном стиле задать желаемое состояние системы, а аnsible сам выполнит действия, которые требуются для достижения этого состояния.

Решаемые задача

Ansible широко используется в devops практиках для описания состояния инфраструктуры и раскатки приложений.

Использование

Установка
# подробно тут:
# https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html

# для ubuntu
sudo add-apt-repository -y ppa:rquillo/ansible
sudo apt-get update
sudo apt-get install ansible -y
проверка работоспособности
# выполним пинг для всех серверов из списка в inventory
ansible -m ping all -u ansible -k

Описание состояния инфраструктуры

Для работы ansible потребуется перечень хостов с которыми мы будем работать, для которых хотим задать состояние:

inventory.yaml
myhosts:
hosts:
my_host_01:
ansible_host: 10.0.0.1
my_host_02:
ansible_host: 10.0.0.2
my_host_03:
ansible_host: 10.0.0.3
info

Playbook - A list of plays that define the order in which Ansible performs operations, from top to bottom, to achieve an overall goal.

Play - An ordered list of tasks that maps to managed nodes in an inventory.

Task - A reference to a single module that defines the operations that Ansible performs.

Module - A unit of code or binary that Ansible runs on managed nodes. Ansible modules are grouped in collections with a Fully Qualified Collection Name (FQCN) for each module.

У нас есть список серверов, теперь можем определить что бы мы хотели иметь на серверах:

playbook.yaml
---
- hosts: myhosts
tasks:
- name: Install Nginx Web Server on RedHat Family
yum:
name=nginx
state=latest
when:
ansible_os_family == "RedHat"
notify:
- nginx systemd

- name: Install Nginx Web Server on Debian Family
apt:
name=nginx
state=latest
when:
ansible_os_family == "Debian"
notify:
- nginx systemd

handlers:
- name: nginx systemd
systemd:
name: nginx
enabled: yes
state: started

В этом playbook описана установка nginx для двух семейств ОС: "RedHat Family" и "Debian Family". Условие применения для каждого описания выражается в секции when:.

Для запуска (применения) инструкция используем команду:

ansible-playbook -i inventory.ini playbook.yaml

Переменные и шаблоны

Для гибкости описаний мы можем использовать переменные. Переменные можно использовать в шаблонах конфигураций, например в nginx.conf для нашего Nginx:

templates/nginx.conf
user  {{ nginx_user }};
worker_processes {{ worker_processes }};
worker_priority -1;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
worker_connections {{ worker_connections }};
}
...

здесь nginx_user, worker_processes и worker_connections - это переменные, которые будут описаны так:

vars.yml
nginx_user: nginx
worker_processes: auto
worker_connections: 2048

Для того, чтобы обработать и скопировать файл конфигурации на сервер добавляем:

playbook.yaml
---
- hosts: myhosts
tasks:
...
- name: Replace nginx.conf
template:
src=templates/nginx.conf
dest=/etc/nginx/nginx.conf

Развернуть это все можно командой:

# указание переменных в командной строке
ansible-playbook -i inventory.ini playbook.yaml --extra-vars "nginx_user=nginx worker_processes=auto worker_connections=2048"

# или с указанием файла переменных
ansible-playbook -i inventory.ini playbook.yaml --extra-vars "@vars.yaml"
info

Также, переменные могут быть объявлены в самом playbook, inventory, etc... Больше в документации: Using Variables

Управление

ansible-inventory -i inventory.ini --list

Роли и правильное использование Ansible

Роль - это типовая конфигурация, которую можно назначить серверу. В playbook она назначается так:

---
- name: load-balancer
hosts: all
roles:
- lb

Сами же роли, переменные, шаблоны и прочее раскладываются в проекте в определенную структуру. Подробнее в доках "Working with playbooks / Roles" и на хабре "Основы автоматизации в Ansible: роли и сценарии"

Ansible Galaxy

Ansible Galaxy - репозиторий готовых плейбуков и ролей.

Например, для установки Apache Kafka можно попробовать рассмотреть saiello.kafka:

Установка коллекции
ansible-galaxy collection install saiello.kafka