Ansible для начинающих
В этой статье мы рассмотрим базовые и более сложные концепции 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
- Подробности: https://docs.ansible.com/ansible/latest/collections/amazon/aws/ec2_module.html.
Конфигурация инфраструктуры
Создав инфраструктуру с помощью пользовательского интерфейса или 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. В /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.
Ansible — это программное решение для удаленного управления конфигурациями
Ansible — это программное решение для удаленного управления конфигурациями. Оно позволяет настраивать удаленные машины. Главное его отличие от других подобных систем в том, что Ansible использует существующую инфраструктуру SSH, в то время как другие (chef, puppet, и пр.) требуют установки специального PKI (Public Key Infrastructure, инфраструктура открытых ключей) -окружения.
Ansible написана на языке программирования Python, с использованием декларативного языка разметки для описания конфигураций. Используется для автоматизации настройки и развертывания программного обеспечения. Обычно используется для управления Linux-узлами, но Windows также поддерживается.
Компания Ansible, Inc осуществляла коммерческую поддержку и сопровождение Ansible. 16 октября 2015 года Red Hat, Inc объявила о поглощении Ansible, Inc.
Ansible, скорее всего, подойдет командам, которым требуется программное обеспечение для автоматизации ИТ, способное работать со сложными облачными средами, или которым необходимо упростить настройку, выделение ресурсов и аналогичные задачи. Jenkins, напротив, является отличным инструментом CI/CD, который можно значительно расширить с помощью правильных плагинов.
Установка Ansible
У вас предварительно должен быть установлен Python лучше версии 3, хотя и с 2.7 должен работать.
В Ubuntu 22, просто введите команду:
apt install ansible
В более ранних версиях Ubuntu, возможно придется подключить репозиторий:
sudo apt-add-repository ppa:ansible/ansible
Послу установки у меня получилась такая версия:
# ansible --version ansible 2.10.8 config file = None configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python3/dist-packages/ansible executable location = /usr/bin/ansible python version = 3.10.4 (main, Jun 29 2022, 12:14:53) [GCC 11.2.0]
Внимание
Исполняемый файл ansible служит для выполнения одноразовых однозадачных операций, а ansible-playbook исполняемый файл, предназначенный для обработки плейбуков (планов) по координации большого числа задач.
Пишем плейбук: hosts
Получим список хостов, для работы ansible. Данная команда по умолчанию берёт данные из файла — /etc/ansible/hosts.
ansible all --list-hosts
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match ‘all’
hosts (0):
Создадим новый файл hosts.ini в папке ansible. С IP-адресом server-а.
192.168.13.13 Команде задаём ключ -i (INVENTORY) и путь, по которому нужно взять новый файл с хостами.
ansible all --list-hosts -i ./ansible/hosts.ini hosts (1): 192.168.13.13
Попробуем теперь выполнить простую команду ping на хостах.
ansible all -i hosts.ini -m ping 192.168.13.13 | UNREACHABLE! =>
Просит ввода пароля. Чтобы решить данную ошибку, добавляем –ask-pass который спросит пароль.
ansible all -i hosts.ini -m ping —ask-pass SSH password: 192.168.13.13 | FAILED! =>
Нельзя использовать пароли без установки sshpass. Установим.
sudo apt install sshpass
ansible all -i hosts.ini -m ping --ask-pass SSH password: 192.168.13.13 | SUCCESS => < "ansible_facts": < "discovered_interpreter_python": "/usr/bin/python3" >, "changed": false, "ping": "pong" >
Добавим в файл hosts.ini параметры доступа к серверу (user\password), чтобы мы могли больше не вводить пароль при выполнении плейбука.
192.168.13.13 ansible_user=vagrant ansible_password=vagrant
Убираем ключ –ask-pass и пробуем.
ansible all -i hosts.ini -m ping 192.168.13.13 | SUCCESS => < "ansible_facts": < "discovered_interpreter_python": "/usr/bin/python3" >, "changed": false, "ping": "pong" >
Все работает, мы получили строку «ping»: «pong».
Пишем плейбук: установка LEMP
Установим LEMP при помощи ansible. Документация по модулям ansible, например ansible.builtin.apt.
Ansible galaxy — это каталог с популярными ролями.
Добавим в ansible модуль поддержки mysql
ansible-galaxy collection install community.mysql
Скачать готовый плейбук ansible для установки LEMP playbook_lemp.yml.zip
Ansible
Ansible — это система, которая помогает автоматически управлять серверами в компьютерной сети. Она облегчает доставку и развертывание, то есть перенос и запуск программных продуктов на серверах.
С помощью Ansible разработчики, сисадмины и сетевые инженеры могут быстро настраивать серверы, чтобы на тех можно было запустить программный продукт. Это проще и удобнее, чем ручная настройка, особенно если серверов много или сеть очень разветвленная.
«IT-специалист с нуля» наш лучший курс для старта в IT
IT-специалист с нуля
Наш лучший курс для старта в IT. За 2 месяца вы пробуете себя в девяти разных профессиях: мобильной и веб-разработке, тестировании, аналитике и даже Data Science — выберите подходящую и сразу освойте ее.
Профессия / 8 месяцев
IT-специалист с нуля
Попробуйте 9 профессий за 2 месяца и выберите подходящую вам
Название «ансибл» взято из фантастических книг писательницы Урсулы Ле Гуин: там так назывались устройства для связи в космосе.
Система опенсорсная и бесплатная, любой разработчик может посмотреть ее исходный код и адаптировать под свои нужды.
Что такое Ansible и зачем он нужен
Ansible — система, которая работает по принципу infrastructure as a code, или «инфраструктура как код». Это подход, при котором инфраструктуру серверов описывают с помощью кода и конфигурационных файлов. Информация о настройках, разрешениях, установленных программных средствах сервера хранится в специальных файлах.
- Разработчик может написать конфигурационные файлы сам и настроить сервер вручную. Но если серверов много, процесс получится довольно долгим и трудоемким.
- Можно написать скрипты, которые настраивают серверы, но это тоже не лучшее решение — придется писать много разных скриптов, ведь на серверах разные системы и мощности.
Поэтому разработчики придумали системы автоматического управления конфигурациями, и Ansible — одна из них. В таких системах достаточно описать нужное состояние и способ его достичь. А система автоматически сделает все, что нужно, и сама проведет настройку сервера. В итоге сложное конфигурирование становится намного проще и быстрее.
Курс для новичков «IT-специалист
с нуля» – разберемся, какая профессия вам подходит, и поможем вам ее освоить
Особенности Ansible
Систем для автоматического управления конфигурациями много, у всех свои особенности. Ansible работает немного по иному принципу, нежели другие популярные решения.
Push вместо pull. Сеть из нескольких серверов часто выглядит так: есть главные управляющие машины, а есть зависимые. Стандартный подход систем управления конфигурациями называется pull: зависимые сервера «тянут» информацию с главного. В Ansible все наоборот, по умолчанию используется push-подход: главный сервер сам «проталкивает» информацию в зависимые. На практике разница в том, что открытым для доступа должен быть не главный сервер, а зависимые. Но при необходимости Ansible тоже можно настроить на работу в режиме pull.
Использование SSH-инфраструктуры. Обычно системы управления конфигурациями требуют установки специального окружения, в котором они смогут работать. Ansible, в отличие от них, работает с существующим SSH-окружением: стандартным безопасным протоколом для удаленного управления сервером. Поэтому Ansible универсальнее: не нужно устанавливать дополнительное ПО, чтобы система могла работать. Нужен только Python.
Декларативность. Ansible использует декларативный подход к написанию кода. Это значит, что разработчику надо описать не действия программы напрямую, а результат, которого она должна достичь. Как именно он будет достигнут — обдумывать уже не нужно, и это опять же сокращает время настройки.
Сбор информации. Вещь, которую важно помнить при начале работы с Ansible, — он будет собирать информацию о серверах всегда, если не указано обратное. Это не плохо само по себе, но иногда бывает излишне.
Как устроен Ansible
Архитектура Ansible сама по себе довольно простая. Система состоит:
- из главного управляющего сервера — там установлен Ansible, и оттуда отдаются команды. К серверу подключаются пользователи, база данных и облачные системы, ему можно отдавать команды с помощью плейбуков — о них поговорим ниже;
- зависимых серверов, или хостов — их можно настраивать и конфигурировать с главного.
Внутри управляющего сервера — API, модули и плагины для работы с разными программными решениями, а еще инвентарь, из которого он черпает информацию о хостах. Про инвентарь мы тоже расскажем чуть позже.
Набор модулей для работы с серверным ПО
У Ansible довольно обширный набор модулей для взаимодействия с разными программными компонентами. То есть, он «из коробки» умеет работать с огромным количеством ПО, которое обычно используется на серверах. Например:
- с базами данных и СУБД;
- облачными системами и хранилищами;
- шаблонизаторами и популярными форматами файлов;
- пакетными менеджерами вроде apt, pip или npm;
- программами для оповещений и мониторинга;
- ядром и другими компонентами Linux.
Для всего этого у Ansible есть свои наборы модулей, доступные сразу после установки. Поэтому, чтобы работать с каким-то популярным серверным ПО с помощью Ansible, обычно не нужно скачивать дополнительные библиотеки и инструменты. Он умеет работать с компонентами сразу.
Hosts: хранение списка серверов
Один из компонентов Ansible — инвентарь. Так называется особое хранилище, в котором Ansible держит информацию о хостах. По умолчанию это хранилище находится по адресу /etc/ansible/hosts в системе Linux: в файле hosts находится перечень зависимых серверов. Их можно объединить в группы и дать группам имена: серверы базы данных, DNS-серверы и так далее. А еще можно назначать «родительские» и «дочерние» группы.
Для каждого хоста можно указать свои параметры и переменные. Но описывать их в hosts считается не очень хорошей практикой, потому что так файл станет слишком большим и непонятным для разработчиков. Поэтому в Ansible есть еще несколько хранилищ для переменных:
- group_vars хранит переменные, специфичные для каких-то групп;
- hosts_vars содержит переменные хостов;
- /vars описывает переменные для какой-то роли. Про роли расскажем чуть позже.
Ansible Playbook: hosts, tasks и другое
Плейбуки в Ansible — это файлы сценариев. Они создаются в человекопонятном формате YAML и содержат информацию о том, какого результата и на каких машинах нужно достичь. Для решения простых задач можно обойтись и без них, но вообще-то плейбуки считаются основой работы с Ansible. Примеры playbook-скриптов в самом простом виде выглядят приблизительно так:
Это базовые параметры Ansible playbook, но есть и другие — их указывают перед выполнением задач, чтобы уточнить команды или дать инструкции по работе. Например:
Роли: автоматизация рутины
Роли — инструмент Ansible, чтобы быстрее решать типовые задачи. Вместо блока tasks в плейбуке можно указать роль: шаблонный набор задач и переменных. Полезно, если нужно, например, отдать одну и ту же задачу разным серверам и не хочется писать несколько блоков tasks.
Возможности работы с Ansible
Благодаря удобной структуре с Ansible довольно легко работать. Процесс выглядит примерно так:
- Заполнить файл hosts, указать там список зависимых серверов, их доменные имена или IP-адреса.
- Указать переменные, которые нужны для подключения. Например, какому-то серверу может понадобиться имя пользователя. По умолчанию связь между серверами идет через SSH по ключу.
- Написать плейбук, в нем указать, с какими хостами сейчас нужно работать и что сделать. Сохранить плейбук в файл.
- Отдать Ansible команду на запуск плейбука.
А для некоторых действий плейбуки и вовсе не нужны. Например, узнать информацию о каком-то хосте можно просто командой в консоли. Ну а если в разных плейбуках нужно выполнять одни и те же действия — помогут роли.
Получается удобная и простая, но вместе с тем функциональная система. Разработчик может:
- отдать команду одному хосту, группе хостов или всем узлам одновременно;
- задать типовой набор переменных, чтобы применять их повторно;
- писать роли и переиспользовать наборы команд;
- использовать плейбуки, чтобы отдавать сложные команды и уточнять их.
При этом не нужно устанавливать на зависимые сервера специальное ПО, а из коробки можно работать с популярными серверными программами. Мы не будем глубоко уходить в принцип работы, но порой для настройки нескольких серверов достаточно пары строчек кода.
Преимущества Ansible
Простота освоения. Ansible довольно легко освоить, у него относительно низкий порог входа, а еще активное доброжелательное комьюнити и подробная документация. При этом система популярна, ее часто используют при управлении серверами, и у нее довольно простой код — это тоже помогает освоению.
Понятные языки. Сам Ansible написан на языке программирования Python, а еще использует формат YAML. Оба этих языка с понятным для человека синтаксисом, в них легко сориентироваться, а поддержка Python по умолчанию есть во многих Linux-системах. А еще Python — один из самых популярных языков в мире, то есть, его многие знают. Дополнительные модули для Ansible можно писать на любом языке.
Широкий набор компонентов. Благодаря большому количеству модулей и плагинов Ansible умеет работать с популярным серверным ПО сразу — не нужно скачивать множество сложных вспомогательных программ.
Работа по SSH. Если обычно системам конфигурирования нужно специальное окружение, то Ansible может работать по стандартному протоколу SSH, и на вспомогательные сервера не нужно устанавливать какое-то отдельное ПО для связи с ним. Хватает стандартных средств связи между компьютерами.
Гибкие настройки. Возможность работать в режимах pull и push, поддержка параллельных обращений, многообразные настройки команд и переменных — в Ansible много возможностей. Так что работать с ним комфортно, для многих часто встречающихся задач в системе уже есть решения.
Недостатки Ansible
Отсутствие контроля состояний. Во многих системах управления есть контроль состояний: отслеживание, что сейчас происходит на зависимых серверах. Например, контроль состояний помогает следить, какие зависимости установлены на разных хостах, чтобы избежать конфликтов. В Ansible такого нет: он просто выполняет задачи, которые ему дали, и не смотрит на состояние хоста. Некоторым это неудобно.
Отсутствие понятного GUI. Изначально Ansible был чисто консольным ПО. Позже появилась версия с графическим интерфейсом, но он до сих пор довольно сырой и недоработанный, и в нем реализована не вся функциональность и порой возникают ошибки. Так что по возможности лучше пользоваться Ansible с помощью консоли.
Плохая совместимость с Windows. Ansible сначала поддерживал только Unix-подобные ОС, в том числе Linux. Начиная с версии 1.7 в него добавили поддержку WIndows, но она до сих пор неполная. Работать приходится с оболочкой PowerShell, и в Windows все равно понадобится установить Linux-модуль.
Как начать работать с Ansible
Чтобы установить Ansible, на компьютере должен быть Python. Во многих дистрибутивах Linux Python вшит по умолчанию, но если в вашей системе его нет — понадобится сначала установить этот язык. Начинать работать с Ansible в Windows не рекомендуем: это сложнее и не так удобно.
Потом можно скачать и установить Ansible одной командой в консоли:
sudo apt install ansible
Затем можно начать описывать файл hosts и осваивать плейбуки. Чтобы успешно работать с Ansible, понадобится изучить YAML — впрочем, это довольно простой формат, который можно базово освоить за день. А синтаксис команд и возможности Ansible подробно описаны в его документации.
Что такое Ansible и как его использовать
Что такое Ansible? Это ПО с открытым исходным кодом, которое автоматизирует поставку программного обеспечения, управление конфигурацией и развёртывание приложений. Ansible помогает DevOps-специалистам автоматизировать сложные задачи.
Примечание Вы читаете улучшенную версию некогда выпущенной нами статьи.
- Ключевые особенности программы AnsibleУстановка и запускСтруктура AnsibleДемо «Реальное приложение»Дополнительные материалы
Ключевые особенности программы Ansible
- Безагентное. В клиенте не установлено программное обеспечение или агент, который общается с сервером.
- Идемпотентное. Независимо от того, сколько раз вы вызываете операцию, результат будет одинаковым.
- Простое и расширяемое. Программа Ansible написанa на Python и использует YAML для написания команд. Оба языка считаются относительно простыми в изучении.
Установка и запуск
# ubuntu sudo apt-get install ansible
#mac-OS brew install ansible
Инструкцию по установке на другие ОС можно найти здесь.
Структура Ansible
Модули
Это небольшие программы, выполняющие определённую работу на сервере. Например, вместо запуска этой команды:
sudo apt-get install htop
Мы можем использовать модуль apt и установить htop:
- name: Install htop apt: name=htop
Использование модуля даст вам возможность узнать, установлен он или нет.
Плагины
Ansible поставляется с несколькими удобными плагинами, и вы можете легко написать свой собственный.
Инвентаризация хостов
Чтобы предоставить перечень хостов, нам нужно обозначить список, находящийся в файле инвентаризации. Он напоминает содержание файла hosts.
В простейшем виде он может содержать одну строку:
35.178.45.231 ansible_ssh_user=ubuntu
Playbooks
Ansible playbooks — это способ отправки команд на удалённые компьютеры с помощью скриптов. Вместо того, чтобы индивидуально использовать команды для удалённой настройки компьютеров из командной строки, вы можете настраивать целые сложные среды, передавая скрипт одной или нескольким системам.
group_vars
Файл содержит набор переменных, например имя пользователя и пароль базы данных.
Роли
Это способ сгруппировать несколько задач в один контейнер, чтобы эффективно автоматизировать работу с помощью понятной структуры каталогов.
Обработчики
Представляют собой списки задач, которые на самом деле не отличаются от обычных задач, на которые ссылается глобально уникальное имя и которые оповещаются уведомителями. Если ничто не уведомляет обработчик, он не будет запускаться. Независимо от того, сколько задач уведомляет обработчик, он запускается только один раз, после того как все задачи завершены.
Теги
Если у вас playbook с большим объёмом, может быть полезно иметь возможность запускать только определённую часть его конфигурации.
Демо «Реальное приложение»
Цель этой демонстрации — установить приложение Laravel в VPS. Для этого используем Lightsail.
Последовательность действий для создания и запуска Laravel APP:
- Создайте экземпляр Ubuntu Lightsail.Установите зависимости Ansible на ваш VPS.Добавьте SSH-ключи в Git.Выполните сборку хостов и ansible.cfg.Определите роль в Ansible.Определите обработчик.Установите модули PHP.Установите Nginx.Добавьте default-конфигурацию Nginx.Добавьте переменные для управления учётными данными БД, хоста, URL-адресом источника GitHub и переменными .env.Используйте Ansible-Vault.Создайте базу данных MySql, имя пользователя и пароль.Клонируйте кодовую базу в ваш VPS.Сгенерируйте .env.Создайте playbook.
Рассмотрим каждый пункт подробнее.
Создание экземпляра Ubuntu Lightsail
Перейдите на панель управления Lightsail и нажмите «Создать экземпляр».
Выберите свою любимую ОС.
Выберите «Добавить скрипт запуска», который запускается после создания вашего экземпляра. Не забудьте получить SSH-ключ.
Установка зависимостей Ansible на нашем VPS
Добавьте эти sh-команды для установки зависимостей:
sudo add-apt-repository ppa:deadsnakes/ppa -y sudo apt-get update sudo apt-get install -y python2.7 python3 python-pip
Теперь у нас есть готовый экземпляр, перейдём к построению Ansible Project.
Добавление SSH-ключей в Git
Вы должны добавить свой сервер id_rsa.pub к своим ключам GitHub SSH, войдя в свой сервер.
# Подключитесь к вашему серверу через SSH и запустите ssh-keygen sudo chmod -R 644 .ssh/id_rsa cat .ssh/id_rsa.pub # Добавьте результат команды в аккаунт Git # github settings=> SSH keys => Add new Key # bitbucket settings=> ssh-keys => Add new Key
Введение в Git: от установки до основных команд
Сборка хостов и ansible.cfg
[aws] # Ваш IP сервера 127.0.0.39
[defaults] hostfile = hosts.ini # configure log dir log_path= logs/ansible-log.log
Определение роли в Ansible
Используем модуль Ping, чтобы убедиться, что хост работает, после чего нужно обновить все пакеты и установить два модуля: git и htop.
--- - ping: ~ ### - name: Update apt packages apt: update_cache: yes ## - name: Install GIT VCS apt: name: git state: latest ## - name: Install htop apt: name=htop
Определение обработчика
--- - name: Restart PHP-FPM service: name: php>-fpm state: restarted #### - name: Restart Nginx service: name: nginx state: restarted
Установка модулей PHP
Чтобы вызвать обработчик, мы должны использовать notify: Restart PHP-FPM, имена обработчиков должны быть уникальными.
В этом руководстве мы определили php как тег, поэтому, например, если вы хотите запустить только эту задачу из своего playbook, вам необходимо выполнить её с —tags = ”php”, которая будет исполнять только её.
--- - name: Install PHP > PPA Repo apt_repository: repo: 'ppa:ondrej/php' tags: - php ## - name: Install PHP > apt: name=php> state=latest ## - name: Install PHP packages become: true apt: name: ">" state: latest with_items: - php>-curl - php>-fpm - php>-intl - php>-mysql - php>-xml - php>-mbstring notify: Restart PHP-FPM tags: - php
Установка Nginx
- name: Install Nginx web server apt: name: nginx state: latest notify: Restart Nginx tags: - nginx ### - name: Update nginx config files become: true template: src: templates/nginx.conf dest: "/etc/nginx/sites-available/default" tags: - nginx notify: Restart Nginx ### - name: link nginx config become: true file: src: "/etc/nginx/sites-available/default" dest: "/etc/nginx/sites-enabled/default" state: link tags: - nginx notify: Restart Nginx
Добавление default-конфигурации Nginx
server < listen 80 default_server; listen [::]:80 default_server ipv6only=on; server_name >; root >public; location / < try_files $uri $uri/ /index.php?$args; index index.php index.html index.htm; >if (!-d $request_filename) < rewrite ^/(.*)/$ /$1 permanent; >location = /favicon.ico < access_log off; log_not_found off; >location ~ \.php$ < try_files $uri $uri/ /index.php?$args; index index.php index.html index.htm; fastcgi_pass unix:/var/run/php/php>-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME >public$fastcgi_script_name; fastcgi_param APPLICATION_ENV testing; fastcgi_param PATH /usr/bin:/bin:/usr/sbin:/sbin; fastcgi_intercept_errors on; include fastcgi_params; > >
vars.yml
--- ##@ref https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html#variables-and-vaults ansible_ssh_user: "ubuntu" current_user: "ubuntu" server_name: "app_name" repo_git_url: "app_github_url" ansible_ssh_private_key_file: "ssh_dir" php_version: 7.2 app_work_dir: /var/www/app_name/ #mysql config mysql_host: "mysql_host" mysql_db: app_name mysql_user: sql_user mysql_pass: sql_pass #other config cache_driver: file session_driver: file app_env: production app_debug: false app_key: "your_app_key" app_name: "app_name" app_url: "your_app_url"
Примечание: Рекомендуется использовать ansible-vault для шифрования и дешифрования переменных.
Как использовать Ansible-Vault
Создайте секретный файл хранилища, содержащий ключ шифрования, который шифрует ваши переменные.
touch .vault_pass.txt echo 'YOUR_CONFIG_PASS' > .vault_pass.txt
Чтобы зашифровать переменные, используйте:
ansible-vault encrypt group_vars/vars.yml --vault-password-file .vault_pass.txt
Чтобы расшифровать переменные, используйте:
ansible-vault decrypt group_vars/vars.yml --vault-password-file .vault_pass.txt
Создание базы данных MySql, имени пользователя и пароля
- mysql_user: name: ">" password: ">" priv: '*.*:ALL' state: present tags: - mysql-db ## - name: Create APP DB database mysql_db: name=">" state=present login_user=">" login_password=">"
mysql_user и mysql_pass определены внутри vars.yml.
Клонирование кодовой базы
- name: update repo - pull the latest changes git: repo: ">" dest: ">" update: yes version: master accept_hostkey: yes key_file: /home/>/.ssh/id_rsa tags: - code-deploy
repo_git_url и app_work_dir определены внутри vars.yml.
Генерирование .env
Ansible использует шаблонизатор Jinja2 для динамических выражений и доступа к переменным. Создадим файл env.conf.
APP_ENV=> APP_DEBUG=> APP_KEY=> APP_URL=> APP_NAME=> DB_HOST=> DB_DATABASE=> DB_USERNAME=> DB_PASSWORD=> CACHE_DRIVER=> SESSION_DRIVER=>
Определим role , чтобы переместить этот шаблон в директорию нашего приложения.
--- - name: Copy lara env file become: true template: src: templates/env.conf dest: ">/.env" tags: - env-file
Создание playbook
--- - hosts: aws #common options between modules sudo: yes gather_facts: no vars_files: - ./group_vars/vars.yml roles: - misc - php - mysql - redis - nginx - bootstrap-app - code-deploy ### handlers: - include: handlers/main.yml
Как видно, мы определили aws как хост для этого playbook, и sudo yes даёт нам возможность выполнять команду как пользователю sudo. У нас есть vars_files, где мы храним наши vars. Мы установили roles, каждая role выполняет определённую задачу. И, наконец, у нас есть handlers, которые содержат все обработчики проекта.
Запуск playbook
#ansible-playbook playbookName ansible-playbook code-deploy.yml # Запуск с конкретными тегами ansible-playbook playbook.yml --tags="env-files,php" # Если вы используете ansible-vault ansible-playbook code-deploy.yml --vault-password-file .vault_pass.txt
Полная структура проекта
├── ansible.cfg ├── code-deploy.yml ├── files │ └── dump.sql ├── group_vars │ └── vars.yml ├── handlers │ └── main.yml ├── hosts.ini ├── logs │ └── ansible-log.log ├── roles │ ├── bootstrap-app │ │ └── tasks │ │ └── main.yml │ ├── code-deploy │ │ ├── tasks │ │ │ ├── config-files.yml │ │ │ └── main.yml │ │ └── templates │ │ └── env.conf │ ├── misc │ │ └── tasks │ │ └── main.yml │ ├── mysql │ │ └── tasks │ │ ├── config.yml │ │ └── main.yml │ ├── nginx │ │ ├── tasks │ │ │ └── main.yml │ │ └── templates │ │ └── nginx.conf │ ├── php │ │ └── tasks │ │ └── main.yml │ └── redis │ └── tasks │ └── main.yml ├── scripts │ ├── install_composer.sh │ └── startup.sh └── site.yml
Дополнительные материалы для начинающих изучать Ansible
- Репозиторий на GitHub, который содержит полный исходный код.
- Этот сайт запущен и работает с использованием этой кодовой базы.
- Советы по использованию Ansible playbooks.
- Описание архитектуры программы Ansible.
- Статья «How to Use Ansible to Automate Initial Server Setup on Ubuntu».
- О других инструментах сисадмина и DevOps читайте в нашей подборке.