April 12

Ansible: автоматизация управления конфигураций для всех и каждого 🐾🖥️

Привет, любители кошек и кода! В прошлый раз мы говорили об автоматизации развертывания веб-приложений и упомянули такой инструмент как Ansible. Сегодня мы поговорим именно о нем, который может сделать жизнь разработчиков проще, а их проекты более управляемыми. Даже если вы новичок в этом мире, не волнуйтесь: Ansible удивительно прост в освоении, как и учить кошку прыгать на колени, когда вы держите в руках лакомство.

Что такое Ansible?

Ansible — это инструмент для автоматизации развертывания программного обеспечения, управления конфигурациями и оркестрации задач. Почему он так популярен? Потому что Ansible использует очень простой язык (YAML, или "YAML Ain't Markup Language"), который делает его доступным даже для тех, кто только начинает свой путь в автоматизации. Это как научить кошку сидеть: проще, чем кажется!

Почему Ansible?

  1. Простота и эффективность: Настройка Ansible не требует специальных агентов на серверах. Это как кошка, которая не нуждается в постоянном внимании, чтобы быть счастливой.
  2. Идемпотентность: В мире Ansible это означает, что повторное выполнение одних и тех же задач не приведет к ошибкам или непредвиденным последствиям. Если кошка уже сыта, она не станет есть второй раз.
  3. Модульность: Вы можете использовать готовые модули или создавать свои, чтобы расширять функциональность Ansible. Это как добавлять новые игрушки в арсенал кошачьих развлечений.

Первые шаги с Ansible

Чтобы начать работать с Ansible, вам нужно установить его на вашу машину (да, это можно сделать даже сидя на диване, пока ваша кошка мурлычет рядом). После установки создайте свой первый "playbook" — сценарий, в котором описаны задачи, которые Ansible должен выполнить. Это может быть что-то простое, например, установка обновлений на сервере или развертывание веб-приложения.

Как кошки могут помочь

Конечно, кошки не смогут писать код (хотя кто знает, что они делают, когда мы не видим), но они могут вдохновлять нас на творчество и помогать расслабиться во время перерывов в работе. А уж если говорить о способности быть незаметным и эффективным, то кошки — настоящие мастера, как и Ansible в мире автоматизации.

🐱 Представь себе, что ты — кот, и у тебя есть большой дом с множеством комнат (это как серверы или компьютеры в компьютерной сети). Теперь допустим, тебе нужно убедиться, что в каждой комнате правильное количество игрушек, подушки аккуратно расправлены, и в мисках всегда свежая вода — и все это без необходимости самостоятельно проверять каждую комнату каждый раз.

Ansible — это как волшебный помощник для этих задач. Вместо того чтобы самому метаться по всему дому и делать все эти вещи, ты можешь просто мяукнуть инструкции, сидя на своем любимом месте на подоконнике. Ты говоришь Ansible, что делать, например, "убедись, что в каждой комнате по три мячика" или "клади свежую рыбу в миску каждое утро", и Ansible позаботится о том, чтобы все было именно так, как ты просишь.

Тебе не нужно проверять каждую комнату; Ansible справится с этим и будет делать всё одинаково каждый раз, так что ты можешь расслабиться и сосредоточиться на более важных кошачьих делах, таких как загорание на солнце или наблюдение за птицами. К тому же, если что-то изменится, например, если появится новая комната, ты можешь просто один раз сообщить об этом Ansible, и он позаботится о том, чтобы и в новой комнате тоже были игрушки и свежая вода, как и в остальных.

Таким образом, Ansible помогает поддерживать все в порядке, не требуя от тебя лишних усилий!

Установка Ansible

Установка на Linux Ubuntu/Mint

Откройте терминал и введите следующие команды:bash

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

Установка на RHEL/Fedora/CentOS/Rocky/Alma

При помощи dnf:

sudo dnf install ansible

Установка на macOS:

Вы можете установить Ansible с помощью Homebrew:

brew install ansible

Установка на Windows

На Windows Ansible можно запустить через WSL (Windows Subsystem for Linux). Установите WSL, выбрав подходящий дистрибутив Linux, например Ubuntu, а затем установите Ansible, как указано для Linux.

Создание первого проекта

Создание вашего первого проекта на Ansible — это захватывающий шаг на пути к автоматизации вашей ИТ-инфраструктуры. Вот простое руководство, которое поможет вам начать работу с базовой настройкой Ansible, включая настройку вашей среды, написание простого плейбука и его выполнение для управления вашими узлами (серверами или машинами).

Шаг 0: Получение IP адреса и настройка SSH

Для работы с Ansible важно знать IP-адреса серверов и правильно настроить SSH-соединение. Ниже представлены основные шаги по получению IP-адреса сервера и настройке SSH для использования в Ansible.

Получение IP-адреса сервера

IP-адрес сервера может быть получен разными способами, в зависимости от того, как вы управляете своей инфраструктурой. Вот несколько общих методов:

  1. Через панель управления вашего хостинга или облачного провайдера: Большинство провайдеров, таких как AWS, Azure или DigitalOcean, предоставляют панели управления, где можно легко найти IP-адреса выделенных или виртуальных серверов.
  2. Использование команды ifconfig или ip в Linux: Если вы можете подключиться к серверу через SSH, выполните команду ifconfig или ip a в терминале сервера, чтобы узнать его IP-адрес.
  3. Через DHCP сервер: Если серверы получают IP-адреса динамически через DHCP, обратитесь к журналам или конфигурации DHCP-сервера.

Настройка SSH для Ansible

Для управления серверами через Ansible необходимо настроить SSH-ключи для безпарольного доступа. Вот основные шаги:

Создание SSH-ключа: Если у вас еще нет SSH-ключа, создайте его с помощью команды:

ssh-keygen -t rsa -b 2048

Следуйте инструкциям для сохранения ключа (обычно это файлы id_rsa и id_rsa.pub в директории ~/.ssh/).

Копирование публичного ключа на сервер: Скопируйте публичный ключ на каждый сервер, который Ansible будет управлять. Используйте команду:

ssh-copy-id user@server-ip

Замените user и server-ip соответствующими именем пользователя и IP-адресом сервера.

Настройка файла ansible.cfg: (не обязательно, только если вы используете нестандартный путь к ключу) Настройте Ansible для использования вашего SSH-ключа путем изменения или добавления следующих настроек в файле ansible.cfg:

[defaults]
host_key_checking = False
private_key_file = /path/to/your/private/key

Эта команда проверит соединение со всеми серверами, указанными в вашем инвентарном файле.

Подключение через SSH с паролем

Использование Ansible с SSH, когда требуется ввод пароля для аутентификации, возможно, но не рекомендуется по соображениям безопасности и масштабируемости. Однако, если использование ключей SSH не представляется возможным, вы можете настроить Ansible для работы с SSH-паролями следующим образом:

Шаг 1: Установка sshpass

Для автоматизации ввода пароля SSH через Ansible, вам понадобится утилита sshpass. Установите sshpass на машину, с которой вы запускаете Ansible:

На Ubuntu/Debian:

sudo apt-get install sshpass

На RHEL/Fedora/CentOS/Rocky/Alma:

sudo dnf install sshpass

На macOS:

brew install hudochenkov/sshpass/sshpass

Шаг 2: Настройка Ansible для использования пароля

Ansible поддерживает использование SSH-пароля через переменные инвентаря или интерактивный ввод. Вы можете указать пароль напрямую в файле инвентаря, но это не рекомендуется из-за очевидных рисков безопасности. Вместо этого рассмотрите следующие опции:

  1. Использование переменной командной строки: Вы можете передать пароль непосредственно в командной строке при запуске плейбука:bash
ansible-playbook playbook.yml -i inventory.ini --ask-pass

Ansible запросит пароль при запуске.

Использование Ansible Vault: Храните пароли в зашифрованном виде с помощью Ansible Vault. Создайте файл с паролями:

ansible-vault create credentials.yml

В этом файле можно хранить пароли:

ansible_ssh_pass: ваш_пароль

При запуске плейбука используйте ключ --ask-vault-pass для разблокировки зашифрованных данных:

ansible-playbook playbook.yml -i inventory.ini --ask-vault-pass

Использование переменных окружения: Ansible может считывать переменные окружения, такие как ANSIBLE_SSH_PASS. Вы можете экспортировать пароль перед запуском Ansible:

export ANSIBLE_SSH_PASS="ваш_пароль" ansible-playbook playbook.yml -i inventory.ini

Учтите, что использование паролей через переменные окружения может быть не безопасно на многопользовательских системах.

Шаг 3: Настройка файла инвентаря

Если вы все же решите указать пароль непосредственно в файле инвентаря (не рекомендуется), добавьте следующее:

[webservers]
server1 ansible_host=192.168.1.101 ansible_user=пользователь ansible_ssh_pass=пароль

Использование паролей для SSH в Ansible может быть удобным для небольших или временных сред, но для больших и постоянно используемых инфраструктур рекомендуется перейти на аутентификацию по ключам SSH. Это увеличит безопасность и упростит масштабирование ваших операций.

Шаг 1: Создание инвентарного файла

Инвентарный файл Ansible содержит информацию о узлах, которыми вы управляете. Создайте файл inventory.ini с таким содержимым:

[test]
server1 ansible_host=192.168.1.101
server2 ansible_host=192.168.1.102

Замените IP адреса на те, которые указаны на ваших серверах. Можно указать только один сервер если нет второго.

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

ansible all -m ping -i inventory.ini

Шаг 2: Написание плейбука

Плейбуки Ansible используют YAML-формат. Создайте файл first-playbook.yml со следующим содержимым:

---
- name: Обновление всех серверов
  hosts: webservers
  become: yes

  tasks:
  - name: Обновление кеша репозитория и установка обновлений
    apt:
      update_cache: yes
      upgrade: dist

Этот плейбук обновит все пакеты на серверах, указанных в группе webservers.

Шаг 3: Запуск плейбука

Запустите ваш плейбук, используя следующую команду в терминале:

ansible-playbook -i inventory.ini first-playbook.yml

Эта команда выполнит плейбук, который вы написали, применяя его к серверам, указанным в вашем инвентарном файле.

Готово! Вы создали и запустили ваш первый проект на Ansible. Далее разберем более подробно различные возможности данного инструмента.

Из чего состоит проект Ansible

Ansible использует ряд файлов в проекте для управления конфигурациями, инвентаризации, выполнения задач и шифрования данных. Вот основные типы файлов, с которыми вы столкнетесь при работе с Ansible:

1. Файлы инвентаря (Inventory Files)

Файлы инвентаря содержат информацию о хостах и группах хостов, которые Ansible должен управлять. Эти файлы могут быть в форматах INI или YAML.

INI-формат:

[webservers]
web1.example.com
web2.example.com

[dbservers]
db1.example.com

YAML-формат:

all:
  children:
    webservers:
      hosts:
        web1.example.com:
        web2.example.com:
    dbservers:
      hosts:
        db1.example.com:

2. Плейбуки (Playbooks)

Плейбуки — это основные сценарии Ansible, написанные на YAML. Они описывают задачи, которые должны быть выполнены на хостах, указанных в инвентарных файлах.

---
- name: Обновление всех веб-серверов
  hosts: webservers
  tasks:
    - name: Обновление системы
      apt:
        update_cache: yes
        upgrade: dist

3. Роли (Roles)

Роли позволяют организовать плейбуки более модульно, делая их переиспользуемыми и легче поддерживаемыми. Роли обычно содержат файлы tasks, handlers, files, templates, vars, и defaults.

role_name/
  ├── defaults/
  │   └── main.yml
  ├── handlers/
  │   └── main.yml
  ├── tasks/
  │   └── main.yml
  ├── files/
  ├── templates/
  ├── vars/
  │   └── main.yml
  └── meta/
      └── main.yml

4. Файл конфигурации (ansible.cfg)

Этот файл содержит глобальные настройки Ansible, которые определяют, как Ansible будет взаимодействовать с системами и какие параметры будут использоваться по умолчанию.

Пример содержимого ansible.cfg:

[defaults]
inventory = ./inventory
remote_user = admin
host_key_checking = False

Итого мы имеем примерно такую структуру проекта Ansible:

ansible-project/
│
├── ansible.cfg         # Файл конфигурации Ansible
├── inventory.ini       # Основной инвентарный файл
│
├── group_vars/         # Переменные для определенных групп хостов
│   ├── group1.yml
│   └── group2.yml
│
├── host_vars/          # Переменные для конкретных хостов
│   ├── hostname1.yml
│   └── hostname2.yml
│
├── roles/              # Каталог с ролями
│   ├── role1/
│   │   ├── defaults/
│   │   │   └── main.yml
│   │   ├── vars/
│   │   │   └── main.yml
│   │   ├── tasks/
│   │   │   └── main.yml
│   │   ├── handlers/
│   │   │   └── main.yml
│   │   ├── files/
│   │   ├── templates/
│   │   └── meta/
│   │       └── main.yml
│   │
│   └── role2/
│       ├── defaults/
│       │   └── main.yml
│       ├── vars/
│       │   └── main.yml
│       ├── tasks/
│       │   └── main.yml
│       ├── handlers/
│       │   └── main.yml
│       ├── files/
│       ├── templates/
│       └── meta/
│           └── main.yml
│
├── playbooks/          # Каталог с плейбуками
│   ├── playbook1.yml
│   └── playbook2.yml
│
└── files/              # Общие файлы для проекта
    ├── file1.txt
    └── file2.txt

Более подробно о ролях

В Ansible роли используются для организации и переиспользования кода, который управляет конфигурациями и развертываниями. Роли помогают упорядочить и структурировать код Ansible для удобства управления и повышения масштабируемости. Ниже приведено подробное описание основных компонентов, из которых состоит роль в Ansible:

Структура директорий роли

Каждая роль Ansible может включать следующие директории:

  • tasks/ - Содержит главный файл main.yml, который включает список задач, которые роль должна выполнить. Это основной файл, в котором описываются действия, необходимые для настройки узлов.
  • handlers/ - Содержит обработчики, которые могут быть вызваны задачами в файле tasks/main.yml или из других файлов задач в роли. Обработчики обычно используются для перезапуска сервисов или выполнения других действий в ответ на изменения.
  • defaults/ - Содержит файл main.yml с переменными по умолчанию для роли. Эти переменные имеют наименьший приоритет и могут быть переопределены переменными на уровне инвентаря, плейбуков или из других мест.
  • vars/ - Содержит файл main.yml с переменными, которые не должны быть легко переопределены. Переменные в этой директории имеют более высокий приоритет, чем переменные в defaults/.
  • files/ - Эта директория используется для хранения статических файлов, которые могут быть скопированы на узлы с помощью роли. Например, это могут быть конфигурационные файлы или скрипты.
  • templates/ - Содержит шаблоны файлов Jinja2, которые могут быть автоматически модифицированы при копировании на узлы. Шаблоны могут использовать переменные Ansible для создания динамически изменяемого контента.
  • meta/ - Содержит файл main.yml, который определяет некоторые метаданные роли, такие как зависимости от других ролей. Эти данные используются Ansible для построения корректного порядка выполнения ролей.

Примеры использования

Каждый из этих компонентов роли играет свою роль в организации и выполнении задач. Например, если роль предназначена для настройки веб-сервера, файлы в tasks/ могут включать установку и настройку веб-сервера, файлы в handlers/ могут обрабатывать перезапуск веб-сервера после изменения конфигурации, файлы в templates/ могут содержать шаблоны конфигурационных файлов веб-сервера, а files/ может включать статические ресурсы, такие как HTML-страницы.

Использование ролей позволяет легко масштабировать и модифицировать Ansible плейбуки, делая управление инфраструктурой более эффективным и упорядоченным.

Реальный пример развертывания стека LAMP

Создание роли в Ansible для установки стека LAMP (Linux, Apache, MySQL, PHP) включает создание структурированных каталогов и файлов, каждый из которых выполняет свою функцию в процессе установки и конфигурации. Вот пример структуры роли и содержания её файлов:

Структура роли LAMP

roles/
└── lamp/
    ├── defaults/
    │   └── main.yml       # Переменные по умолчанию
    ├── vars/
    │   └── main.yml       # Дополнительные переменные
    ├── tasks/
    │   └── main.yml       # Основные задачи для установки LAMP
    ├── handlers/
    │   └── main.yml       # Обработчики (например, для перезапуска Apache)
    ├── files/
    │   └── info.php       # Пример файла для проверки работы PHP
    ├── templates/
    │   └── my.cnf.j2      # Шаблон конфигурации MySQL
    └── meta/
        └── main.yml       # Метаинформация о роли

Содержание файлов роли

defaults/main.yml

---
# Переменные по умолчанию для конфигурации LAMP
apache_package_name: apache2
mysql_package_name: mysql-server
php_packages:
  - php
  - php-mysql
  - libapache2-mod-php
mysql_root_password: root
php_info_file: /var/www/html/info.php

vars/main.yml

---
# Дополнительные переменные, которые можно переопределить
mysql_bind_address: 0.0.0.0

tasks/main.yml

---
# Задачи для установки и настройки LAMP
- name: Установка Apache
  apt:
    name: "{{ apache_package_name }}"
    state: present

- name: Установка MySQL
  apt:
    name: "{{ mysql_package_name }}"
    state: present

- name: Установка PHP и необходимых модулей
  apt:
    name: "{{ php_packages }}"
    state: present

- name: Копирование файла info.php для тестирования PHP
  copy:
    src: info.php
    dest: "{{ php_info_file }}"

- name: Копирование шаблона my.cnf для MySQL
  template:
    src: my.cnf.j2
    dest: /etc/mysql/my.cnf
  notify:
    - restart mysql

- name: Обеспечение запуска MySQL
  service:
    name: mysql
    state: started
    enabled: true

handlers/main.yml

---
# Обработчики для перезапуска служб
- name: restart apache
  service:
    name: "{{ apache_package_name }}"
    state: restarted

- name: restart mysql
  service:
    name: mysql
    state: restarted

files/info.php

<?php
phpinfo();
?>

templates/my.cnf.j2

[mysqld]
bind-address = {{ mysql_bind_address }}

meta/main.yml

---
dependencies: []

Эта роль полностью описывает установку стека LAMP на сервере, начиная от установки пакетов до настройки конфигурации и копирования файлов. Вы можете использовать эту роль в плейбуке, указав имя роли и необходимые переменные.

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

Чтобы использовать роль для установки стека LAMP в вашем проекте Ansible, вам нужно включить эту роль в плейбук и настроить необходимые переменные и инвентарь. Вот как можно организовать ваш проект Ansible и использовать роль для установки LAMP на целевых серверах.

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

ansible-project/
│
├── ansible.cfg             # Файл конфигурации Ansible
├── inventory.ini           # Файл инвентаря
│
├── group_vars/
│   └── all.yml             # Общие переменные для всех хостов
│
├── roles/
│   └── lamp/               # Роль для установки LAMP
│       ├── defaults/
│       ├── vars/
│       ├── tasks/
│       ├── handlers/
│       ├── files/
│       ├── templates/
│       └── meta/
│
└── playbooks/
    └── install_lamp.yml    # Плейбук для установки LAMP

Файл инвентаря (inventory.ini)

[webservers]
server1 ansible_host=192.168.1.100
server2 ansible_host=192.168.1.101

Плейбук для установки LAMP (playbooks/install_lamp.yml)

Создайте плейбук, который использует роль lamp для установки стека LAMP на группу серверов webservers:

---
- name: Установка LAMP на веб-серверах
  hosts: webservers
  become: yes

  roles:
    - lamp

Настройка файла ansible.cfg

Убедитесь, что ваш файл ansible.cfg настроен для оптимальной работы с вашим проектом. Пример настройки:

[defaults]
inventory = ./inventory.ini
remote_user = admin
host_key_checking = False
retry_files_enabled = False

Запуск плейбука

Чтобы запустить плейбук и установить LAMP на сервера, указанные в вашем инвентаре, выполните следующую команду в корне вашего Ansible проекта:

ansible-playbook playbooks/install_lamp.yml

Эта команда инициирует процесс установки, во время которого Ansible подключится к указанным серверам, выполнит задачи, определенные в роли lamp, включая установку Apache, MySQL и PHP, настройку конфигурации и запуск необходимых служб.

Дополнительные настройки

Вы можете настроить или переопределить переменные в файлах group_vars/all.yml или непосредственно в плейбуке, чтобы управлять конфигурацией стека LAMP согласно вашим требованиям.

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