[Перевод] Ansible для начинающих

cefd53ba5d2bb4da632dd8d7462a7efd.jpg

В этой статье мы рассмотрим базовые и более сложные концепции 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. 

cc45dfdd907ea219379b01bc755e9c4c.png

Выше приводится снимок экрана дашборда 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 позволяет автоматизировать задачи по подготовке и конфигурированию инфраструктуры.

7d51cf8c422430107f3012d2693a4a73.jpg

Залезьте под капот 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.

5f2284e805ee0ad18b680351866a6621.png

Инвентарь

Инвентарь (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. В /vars/apache-install.yml

b7e8d54cf2be7cdd7bea062839cf3373.jpg

Научитесь писать собственные плейбуки на курсе «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.

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

© Habrahabr.ru