В этой статье мы рассмотрим базовые и более сложные концепции Ansible с примерами. Статья предназначена для тех, кто только начинает работу с Ansible.
Ansible — это инструмент infrastructure as a code для автоматизации задач по подготовке и конфигурированию инфраструктуры.
Вам понадобятся: базовые знания о Linux (можно начать с cent OS/Ubuntu), практический опыт с облачными сервисами (AWS), общее представление о виртуальных машинах (AWS EC2).
Доступная инфраструктура
Сегодня много облачных провайдеров предлагают свои сервисы, например Amazon Web Services (AWS), Microsoft Azure, Google Cloud Platform (GCP), IBM Cloud, Alibaba Cloud, Tencent Cloud, Oracle Cloud. Для приложений мы можем использовать виртуальные машины (EC2), хранилища (AWS S3), балансировщики нагрузки и т. д.
Подготовка инфраструктуры
Мы можем развернуть код на виртуальных машинах AWS EC2 с бакетами S3. Создание этой инфраструктуры называется подготовкой. Подготовить инфраструктуру можно тремя методами.
* В этой статье мы взяли AWS в качестве примера *
Метод 1. Заходим на сайт https://aws.amazon.com и входим в аккаунт AWS. Запустить виртуальную машину EC2 можно вручную в пользовательском интерфейсе AWS.
Выше приводится снимок экрана дашборда AWS EC2, на котором можно подготавливать инфраструктуру.
Метод 2. Заходим на сайт https://aws.amazon.com и входим в аккаунт AWS. Запустить виртуальную машину EC2 можно вручную через AWS CLI. Для этого нужно установить AWS CLI и подключиться с локальной машины через SSH. См. https://aws.amazon.com/cli/.
Метод 3. Запускать виртуальные машины и сервисы можно с помощью плейбуков Ansible, описав нужную инфраструктуру в файле YAML.
# Примечание. В примерах мы не будем настраивать аутентификацию. См. руководство по AWS.
# Простейший пример подготовки инфраструктуры
- amazon.aws.ec2:
key_name: mykey
instance_type: t2.micro
image: ami-123456
wait: yes
group: webserver
count: 3
vpc_subnet_id: subnet-29e63245
assign_public_ip: yes
Конфигурация инфраструктуры
Создав инфраструктуру с помощью пользовательского интерфейса или CLI, мы можем вносить изменения в инфраструктуру или виртуальные машины, то есть конфигурировать их. Допустим, мы хотим установить Nginx на виртуальную машину EC2.
Метод 1. Заходим в EC2, щёлкаем Connect (Подключиться), выбираем SSH-клиент, открываем терминал на локальном компьютере и выполняем команды:
First step: chmod 400 private key file
Second Step: ssh -i “private key file” ec2-user@Public DNS
Устанавливаем Nginx после подключения к EC2 через SSH-сеанс
# Примечание. В примерах мы не будем настраивать аутентификацию. См. руководство по AWS.
[root@ANSIBLECONTROLLER ~]# yum install nginx -y
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
amzn2-core | 3.7 kB 00:00:00
amzn2extra-docker | 3.0 kB 00:00:00230 packages excluded due to repository priority protections --------------- Skipping this install -----------[root@ANSIBLECONTROLLER ~]# systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.[root@ANSIBLECONTROLLER ~]# systemctl status nginx● nginx.service - The nginx HTTP and reverse proxy serverLoaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)Active: inactive (dead)
При использовании этого метода нужно войти на виртуальную машину и выполнить команды вручную. Ansible легко автоматизирует такие задачи.
Метод 2. Используя такие инструменты, как Ansible, мы можем автоматизировать конфигурацию с помощью кода. Ниже приведён пример кода для установки Nginx с помощью Ansible.
--- Installing Nginx ----
- name: set up webserver
hosts: all
tasks:
- name: Adding EPEL Repo
yum:
name: epel-release
state: present
- name: ensure nginx is at the latest version
yum:
name: nginx
state: latest
- name: start nginx
service:
name: nginx
state: started
enabled: yes # if you want to also enable nginx
При таком подходе нам не придётся вручную выполнять команды на каждой виртуальной машине.
Итак, мы видели, что Ansible позволяет автоматизировать задачи по подготовке и конфигурированию инфраструктуры.
Залезьте под капот Ansible на курсе «Ansible: Infrastructure as Code», который стартует 6 февраля.
Инфраструктура как код
Инфраструктура как код (Infrastructure as a Code, или IAC) включает подготовку и конфигурацию инфраструктуры в виде кода.
Самый популярный инструмент для подготовки инфраструктуры — Terraform. Ansible для подготовки не так хорош, потому что приходится писать гораздо больше кода.
#создаем инстанс aws ec2 с terraform
provider "aws" {
region = "ap-south-1"
}
resource "aws_instance" "ec2" {
ami = "ami-019f0583716f0aec4" //ap-south-1
instance_type = "t2.micro"
tags = {
Name = "example"
}
}
#ami-id можно получить на amazon marketplace
Компоненты Ansible
Ansible — это очень простой инструмент автоматизации для подготовки ресурсов в облаке, управления конфигурацией, развёртывания приложений, оркестрации взаимодействия между сервисами и других задач.
Ansible включает контрольную ноду, которая управляет рабочими нодами по SSH.
Инвентарь
Инвентарь (inventory) — это файл конфигурации, где мы определяем информацию о хосте. Хранится в папке /etc/ansible/hosts.
Плейбуки
В плейбуках Ansible мы определяем, как применять политики, объявлять конфигурации, оркестрировать действия и запускать задачи на серверах — синхронно или асинхронно. Плейбук может включать один play или несколько. Обычно они хранятся в системе контроля версий, вроде Git и пишутся на YAML.
Play
Play — компонент плейбука, который состоит из группы задач, выполняемых на определённых хостах. Каждый play должен указывать хост или группу хостов. Пример:
-hosts: all # здесь мы указываем все хосты.
Будьте осторожны с пробелами, файлы YAML к ним очень чувствительны!
Задачи
Задачи (task) — это отдельные действия, которые выполняются плейбуками. Например:
- name: Install Apache httpd # Определение задачи может содержать модули,
например yum, git, service и copy.
Роли
Роли в Ansible назначаются группе хостов и помогают организовать задачи по автоматизации. Мы можем создать несколько ролей и назначить их группе задач. Допустим, роль webserver можно использовать для установки Apache и Varnish на указанной группе серверов.
Обработчики
Обработчики (handler) похожи на задачи, но выполняются только при вызове из события. Например, обработчик может запустить сервис httpd после того, как его установила задача. Обработчик вызывается директивой notify. Важно! Имя директивы notify и обработчика должны совпадать.
Шаблоны
Файлы шаблонов (template) основаны на шаблонизаторе Python Jinja2 и имеют расширение .j2. В файл шаблона при желании можно поместить содержимое файла index.html, но эффективнее всего использовать в них переменные и факты.
Переменные
В плейбуки можно включать собственные переменные. Есть пять способов определить переменную:
1. В play, в атрибуте vars_files:
vars_files:
- "/path/to/var/file"
2. В <role>/vars/apache-install.yml
Научитесь писать собственные плейбуки на курсе «Ansible: Infrastructure as Code», который стартует 6 февраля.
3. В командной строке:
# ansible-playbook apache-install.yml -e "http-port=80"
4. В play через vars:
vars: http_port: 80
5. В каталоге group_vars/
Пример плейбука
## ПЛЕЙБУК ДЛЯ УСТАНОВКИ И НАСТРОЙКИ APACHE HTTPD НА СЕРВЕРАХ
- hosts: all
tasks:
- name: Install Apache httpd
yum: pkg=httpd state=installed
notify:
- Start Httpd
handlers:
- name: Start httpd
service: name=httpd state=started
Плейбук нужно запустить на сервере Ansible. Следующая команда выполнена из пути, где хранится плейбук apache-playbook.yml:
# ansible-playbook apache-install.yml --ask-pass -u "ansibleadmin"
Еще больше о написании плейбуков
Если вы хотите повысить экспертизу и начать писать собственные плейбуки, приходите курс «Ansible: Infrastructure as Code», который стартует 6 февраля.
Курс полезен для администраторов, инженеров и желающих подняться вверх по карьерной лестнице в качестве девопса. Учиться будет интересно не только тем, кто недавно начал свое знакомство с инструментом, но и тем, кто хочет освежить имеющиеся знания и закрепить их на практике и выстроить структуру.
На курсе вы:
Узнаете как работать с переменными, как писать плейбуки и роли;
Развернете LEMP стек, PostgreSQL и Mongo кластеры,
Задеплоите Flask приложение;
Напишите свой модуль для Ansible;
Настроите IaC в Gitlab;
Разберетесь с работой с облаками и enterprise решениями.
После обучения вы сможете конфигурировать рутинные задачи с помощью удобного инструмента без страха правок конфигураций. Вы будете понимать, когда и как писать свои модули, а также смело залазить под капот Ansible.