- Что такое Ansible и как его использовать
- Что такое Ansible и как его использовать
- Ключевые особенности программы Ansible
- Установка и запуск
- Структура Ansible
- Модули
- Плагины
- Инвентаризация хостов
- Playbooks
- group_vars
- Обработчики
- Демо «Реальное приложение»
- Последовательность действий для создания и запуска Laravel APP:
- Создание экземпляра Ubuntu Lightsail
- Установка зависимостей Ansible на нашем VPS
- Добавление SSH-ключей в Git
- Сборка хостов и ansible.cfg
- Определение роли в Ansible
- Определение обработчика
- Установка модулей PHP
- Установка Nginx
- Добавление default-конфигурации Nginx
- vars.yml
- Как использовать Ansible-Vault
- Создание базы данных MySql, имени пользователя и пароля
- Клонирование кодовой базы
- Генерирование .env
- Создание playbook
- Основы автоматизации настройки Windows Server с помощью Ansible
- Основы автоматизации конфигурации Windows Server с помощью Ansible
- Установка PIP в Ubuntu
- Установка Pywinrm в Ubuntu
- Установка Ansible в Ubuntu
- Настройка WinRM для Ansible
- Скрипт PowerShell для подключения Ansible при настройке соединения WinRM
- Проверка соединения Ansible при помощи Win_Ping
- Запуск команд из Ansible на Windows Server
- Как работать с Ansible: простая и удобная шпаргалка
- Краткий словарь терминов Ansible
- Проверка подключения к нодам
- Подключение с помощью другого пользователя
- Настройка пользовательского ключа SSH
- Настойка парольной аутентификации
- Использование пароля sudo
- Пользовательский файл инвентаря
- Динамический файл инвентаря
- Запуск специальных команд
- Запуск плейбуков
- Запрос информации о play
- Управление выполнением плейбука
- Ansible Vault для хранения конфиденциальных данных
- Создание нового зашифрованного файла
- Шифрование существующего файла Ansible
- Просмотр содержимого зашифрованного файла
- Редактирование зашифрованного файла
- Расшифровка файлов
- Использование нескольких паролей
- Использование файла паролей
- Запуск плейбука с зашифрованными данными
- Устранение неполадок
- Заключение
- Система управления Ansible
- Что такое Ansible?
- Почему Ansible?
- Установка
- Группы серверов
- Файл hosts
- Информация об узлах (Facts)
- Модули Ansible
- Примеры простых задач
- Cценарии (playbooks)
- Шаблонизация
- Обработчики событий (Handlers)
- Контроль выполнения
- Делегирование задачи другому хосту
- Структура проекта
- Пример сценария
- Ansible AWX
- Заключение
Что такое Ansible и как его использовать
Что такое Ansible и как его использовать
Что такое Ansible? Это ПО с открытым исходным кодом, которое автоматизирует поставку программного обеспечения, управление конфигурацией и развёртывание приложений. Ansible помогает DevOps-специалистам автоматизировать сложные задачи.
Примечание Вы читаете улучшенную версию некогда выпущенной нами статьи.
Ключевые особенности программы Ansible
Установка и запуск
Инструкцию по установке на другие ОС можно найти здесь.
Структура Ansible
Модули
Это небольшие программы, выполняющие определённую работу на сервере. Например, вместо запуска этой команды:
Мы можем использовать модуль apt и установить htop:
Использование модуля даст вам возможность узнать, установлен он или нет.
Плагины
Ansible поставляется с несколькими удобными плагинами, и вы можете легко написать свой собственный.
Инвентаризация хостов
Чтобы предоставить перечень хостов, нам нужно обозначить список, находящийся в файле инвентаризации. Он напоминает содержание файла hosts.
В простейшем виде он может содержать одну строку:
Playbooks
Ansible playbooks — это способ отправки команд на удалённые компьютеры с помощью скриптов. Вместо того, чтобы индивидуально использовать команды для удалённой настройки компьютеров из командной строки, вы можете настраивать целые сложные среды, передавая скрипт одной или нескольким системам.
group_vars
Файл содержит набор переменных, например имя пользователя и пароль базы данных.
Это способ сгруппировать несколько задач в один контейнер, чтобы эффективно автоматизировать работу с помощью понятной структуры каталогов.
Обработчики
Представляют собой списки задач, которые на самом деле не отличаются от обычных задач, на которые ссылается глобально уникальное имя и которые оповещаются уведомителями. Если ничто не уведомляет обработчик, он не будет запускаться. Независимо от того, сколько задач уведомляет обработчик, он запускается только один раз, после того как все задачи завершены.
Если у вас playbook с большим объёмом, может быть полезно иметь возможность запускать только определённую часть его конфигурации.
Демо «Реальное приложение»
Цель этой демонстрации — установить приложение Laravel в VPS. Для этого используем Lightsail.
Последовательность действий для создания и запуска Laravel APP:
Рассмотрим каждый пункт подробнее.
Создание экземпляра Ubuntu Lightsail
Перейдите на панель управления Lightsail и нажмите «Создать экземпляр».
Выберите свою любимую ОС.
Выберите «Добавить скрипт запуска», который запускается после создания вашего экземпляра. Не забудьте получить SSH-ключ.
Установка зависимостей Ansible на нашем VPS
Добавьте эти sh-команды для установки зависимостей:
Теперь у нас есть готовый экземпляр, перейдём к построению Ansible Project.
Добавление SSH-ключей в Git
Вы должны добавить свой сервер id_rsa.pub к своим ключам GitHub SSH, войдя в свой сервер.
Сборка хостов и ansible.cfg
Определение роли в Ansible
Используем модуль Ping, чтобы убедиться, что хост работает, после чего нужно обновить все пакеты и установить два модуля: git и htop.
Определение обработчика
Установка модулей PHP
Чтобы вызвать обработчик, мы должны использовать notify: Restart PHP-FPM, имена обработчиков должны быть уникальными.
В этом руководстве мы определили php как тег, поэтому, например, если вы хотите запустить только эту задачу из своего playbook, вам необходимо выполнить её с —tags = ”php”, которая будет исполнять только её.
Установка Nginx
Добавление default-конфигурации Nginx
vars.yml
Примечание: Рекомендуется использовать ansible-vault для шифрования и дешифрования переменных.
Как использовать Ansible-Vault
Создайте секретный файл хранилища, содержащий ключ шифрования, который шифрует ваши переменные.
Чтобы зашифровать переменные, используйте:
Чтобы расшифровать переменные, используйте:
Создание базы данных MySql, имени пользователя и пароля
mysql_user и mysql_pass определены внутри vars.yml.
Клонирование кодовой базы
repo_git_url и app_work_dir определены внутри vars.yml.
Генерирование .env
Ansible использует шаблонизатор Jinja2 для динамических выражений и доступа к переменным. Создадим файл env.conf.
Создание playbook
Как видно, мы определили aws как хост для этого playbook, и sudo yes даёт нам возможность выполнять команду как пользователю sudo. У нас есть vars_files, где мы храним наши vars. Мы установили roles, каждая role выполняет определённую задачу. И, наконец, у нас есть handlers, которые содержат все обработчики проекта.
Основы автоматизации настройки Windows Server с помощью Ansible
В этой статье я хочу описать работу с Ansible при помощи командной строки, продемонстрировав, насколько легко автоматизировать настройку Windows без особых усилий. Ansible представляет собой прекрасную платформу для обучения автоматизации, и он довольно широко используется в среде центров обработки данных и на уровне предприятий. Давайте взглянем на основы автоматизации настройки Windows Server, и на то, как легко сделать это с помощью управляющего сервера Ansible.
Основы автоматизации конфигурации Windows Server с помощью Ansible
В качестве моего управляющего сервера Ansible я использую сервер Ubuntu 16.04. Управляющий сервер – это место, с которого с помощью Ansible мы будем запускать наши модули, сценарии, задачи и т.п. В моем стенде этот сервер с Ansible Tower. Для использования Ansible и работе с этой системой из командной строки нам просто потребуется установить несколько небольших утилит. Поскольку я использую сервер с Tower, то мне не требуется устанавливать Ansible, так как он входит в состав установки Tower. Однако я все же пройду по всем простым шагам, нужным для установки Ansible.
Установка PIP в Ubuntu
Что такое PIP? Это альтернативный установщик пакетов python, которые многие используют для управления действиями с пакетами, связанными с python.
Для установки PIP в Ubuntu нужно выполнить команды:
sudo apt-get install python-pip python-dev build-essential
Установка Pywinrm в Ubuntu
Модуль Pywinrm позволяет Ansible взаимодействовать с сервисом WinRM на Windows. Для установки модуля Pywinrm после того, как был установлен pip, выполните команду:
sudo pip install pywinrm
Установка Ansible в Ubuntu
После того, как вы установили два указанных выше пакета, нужно установить сам Ansible:
sudo pip install ansible
Для проверки версии установленного ansible введите команду:
После того, как Ansible установлен на управляющем сервере, мы готовы начать взаимодействовать с сервером Windows.
Настройка WinRM для Ansible
Соединение с WinRM может оказаться непростым делом, особенно, если вы не находитесь в одном домене с ним. Существует несколько удобных команд WinRM, которые могут помочь установить соединение с WinRM с сервера Ansible, или с любого другого сервера.
Просмотр текущей конфигурации WinRM. Находясь в PowerShell, выполните следующие команды:
В результате будут выведена текущая конфигурация WinRM, доверенные хосты, настройки шифрования и т.п. Для моего лабораторного сервера Ansible я устанавливаю параметр AllowUnencrypted (работать без шифрования) в значение true, а в качестве значения TrustedHosts (доверенные хосты) ставлю *, что позволяет работать с любыми хостами.
Чтобы разрешить нешифрованный трафик, выполните команду:
Чтобы добавить новый TrustedHost (доверенный хост) в конфигурацию, выполните команду:
Также вы можете указать конкретный хост, если вам это нужно.
Скрипт PowerShell для подключения Ansible при настройке соединения WinRM
Существует удобный конфигурационный PowerShell скрипт, доступный на Github. Он позволяет автоматически настроить конфигурации WinRM, файрвола, PowerShell Remoting и т.п. для подключения Ansible. Вы можете скачать готовый скрипт его по следующей ссылке: https://github.com/ansible/ansible/blob/devel/examples/scripts/ConfigureRemotingForAnsible.ps1
Проверка соединения Ansible при помощи Win_Ping
Для проверки соединения из Ansible, вы можете использовать команду win_ping, которая использует соединение с WinRM для подключения к серверу. Она проверяет, все ли в соединении с WinRM работает так, как ожидается.
Создайте файл inventory.yml, в котором перечислены хосты, соединения с которыми вы хотите проверить. Файл inventory.yml, который создал я, имеет только один хост для проверки и выглядит следующим образом:
Для проверки соединения с хостами, указанными в инвентаризационном файле, используйте приведенную ниже команду. Команда выполняет проверку проверки WinRM соединения.
Если все верно настроили, вы должны увидеть сообщение SUCCESS.
Теперь мы можем использовать автоматизацию Ansible для управления Windows Server.
Запуск команд из Ansible на Windows Server
Для начала работы мы можем использовать несколько основных команд. Мы можем взаимодействовать с нашим сервером, как, как если мы работали бы с ним с консоли. Ниже приводится команда для получения IP конфигурации на нашем Windows Server.
Мы также можем остановить, запустить и перезапустить любые службы:
Заключение
Начать использовать Ansible для автоматизациии настройки Windows Server совсем не сложно. Мы можем быстро управлять настройками сервера, устанавливать соединение с WinRM, и затем выполнять команды на сервере. Далее мы познакомимся со сценариями для дальнейшей автоматизации и глубже погрузимся в автоматизацию конфигурации Windows Server при помощи Ansible.
Как работать с Ansible: простая и удобная шпаргалка
Ansible – это современный инструмент управления конфигурацией, который облегчает задачу настройки и обслуживания удаленных серверов.
Этот мануал написан в виде шпаргалки. По сути это краткий справочник по командам и методам, обычно используемым при работе с Ansible. Краткий обзор Ansible и инструкции по установке и настройке вы найдете в руководстве Установка и настройка Ansible в Ubuntu 18.04.
Как пользоваться этим мануалом:
Краткий словарь терминов Ansible
В этом руководстве широко используются такие термины Ansible:
Если вы хотите попрактиковаться с командами, используемыми в этом руководстве, на рабочем плейбуке Ansible, Используйте плейбук из мануала Автоматизация начальной настройки сервера с помощью Ansible в Ubuntu 18.04. Вам понадобится как минимум один удаленный сервер в качестве ноды.
Проверка подключения к нодам
Чтобы убедиться, что Ansible может подключаться к нодам и запускать команды и плейбуки, вы можете использовать следующую команду:
Модуль ping проверит, есть ли у вас валидные учетные данные для подключения к нодам, определенным в файле инвентаря, и может ли Ansible запускать сценарии Python на удаленном сервере. Ответ pong означает, что Ansible готов запускать команды и плейбуки на этой ноде.
Подключение с помощью другого пользователя
То же самое относится и к ansible-playbook:
Настройка пользовательского ключа SSH
Если вы используете свой ключ SSH для подключения к удаленным серверам, вы можете предоставить его с помощью параметра –private-key:
Эта опция также работает для ansible-playbook:
Настойка парольной аутентификации
Если вам нужно использовать парольную аутентификацию для подключения к нодам, добавьте опцию –ask-pass к команде Ansible.
Это заставит Ansible запросить у вас пароль пользователя на удаленном сервере, к которому вы пытаетесь подключиться:
Эта опция также действительна для ansible-playbook:
Использование пароля sudo
Если удаленный пользователь должен предоставить пароль для запуска команд sudo, вы можете включить опцию –ask-become-pass в команду Ansible. Опция позволит вам ввести пароль sudo удаленного пользователя:
Эта опция также действительна для ansible-playbook:
Пользовательский файл инвентаря
Такая опция действительна и для ansible-playbook:
Динамический файл инвентаря
Ansible поддерживает сценарии инвентаризации для создания динамических файлов. Это полезно, если ваш инвентарь часто меняется, когда серверы создаются и уничтожаются.
Вы можете найти ряд скриптов с открытым исходным кодом в официальном репозитории Ansible GitHub. После загрузки требуемого сценария на Ansible control machine и настройки необходимых параметров (например, учетных данных API) вы можете запустить исполняемый файл в качестве пользовательского инвентаря с любой командой Ansible, которая поддерживает эту опцию.
Следующая команда использует скрипт инвентаря my_inventory.py с командой ping для проверки подключения ко всем текущим активным серверам:
За более подробной информацией о том, как использовать динамические файлы инвентаризации, пожалуйста, обратитесь к официальной документации Ansible.
Запуск специальных команд
Прежде чем вносить изменения на свои ноды, вы можете выполнить пробный прогон, чтобы увидеть, как ваша команда повлияет на серверы. Это можно сделать, включив параметр –check:
Запуск плейбуков
Чтобы запустить плейбук и выполнить все определенные в нем задачи, используйте команду ansible-playbook:
Запрос информации о play
Опция –list-tasks используется для перечисления всех задач, которые будут выполнены в play, при этом не внося никаких изменений на удаленные серверы:
Точно так же можно запросить все хосты, которые будут затронуты выполнением play, без запуска каких-либо задач на удаленных серверах:
Вы можете использовать теги, чтобы ограничить выполнение play. Чтобы вывести список всех тегов, доступных в play, используйте параметр –list-tags:
Управление выполнением плейбука
Вы можете использовать опцию –start-at-task, чтобы определить новую точку входа вашего плейбука. Затем Ansible пропустит все, что предшествует указанной задаче, выполнив оставшуюся часть play с заданного момента. Эта опция в качестве аргумента требует правильное имя задачи:
Чтобы выполнять только задачи, связанные с конкретными тегами, вы можете использовать опцию –tags. Например, если вы хотите выполнить только задачи, помеченные как nginx или mysql, вы можете использовать:
Если вы хотите пропустить все задачи, которые находятся под определенными тегами, используйте –skip-tags. Следующая команда будет выполнять myplaybook.yml, пропуская все задачи, помеченные как mysql:
Ansible Vault для хранения конфиденциальных данных
Если ваши плейбуки Ansible содержат конфиденциальные данные, такие как пароли, ключи API и учетные данные, важно обеспечить их безопасность с помощью шифрования. Ansible предоставляет ansible-vault для шифрования файлов и переменных.
Несмотря на то, что любой файл данных Ansible, а также двоичные файлы, возможно зашифровать изначально, чаще для шифрования переменных файлов, содержащих конфиденциальные данные, используется ansible-vault. После шифрования файла с помощью этого инструмента вы сможете выполнять, редактировать или просматривать его, только предоставив соответствующий пароль, указанный при первом шифровании файла.
Создание нового зашифрованного файла
Вы можете создать новый зашифрованный файл Ansible с помощью:
ansible-vault create credentials.yml
Эта команда выполнит следующие действия:
Шифрование существующего файла Ansible
Чтобы зашифровать существующий файл Ansible, вы можете использовать следующую команду:
ansible-vault encrypt credentials.yml
Эта команда запросит у вас пароль, который вам нужно будет вводить при каждом доступе к файлу credentials.yml.
Просмотр содержимого зашифрованного файла
Если вы хотите просмотреть содержимое файла, который ранее был зашифрован с помощью ansible-vault, и вам не нужно изменять его содержимое, вы можете использовать команду:
ansible-vault view credentials.yml
Она предложит вам указать пароль, который вы выбрали при первом шифровании файла с помощью ansible-vault.
Редактирование зашифрованного файла
Чтобы изменить содержимое файла, который ранее был зашифрован с помощью Ansible Vault, выполните:
ansible-vault edit credentials.yml
Эта команда предложит вам указать пароль, который вы выбрали при первом шифровании файла credentials.yml. После проверки пароля откроется редактор командной строки по умолчанию с незашифрованным содержимым файла, что позволит вам внести нужные изменения. По завершении вы можете сохранить и закрыть файл, как обычно, и обновленное содержимое будет сохранено и зашифровано.
Расшифровка файлов
Если вы хотите навсегда расшифровать файл, ранее зашифрованный с помощью ansible-vault, вы можете сделать это с помощью следующего синтаксиса:
ansible-vault decrypt credentials.yml
Эта команда предложит вам ввести тот пароль, который использовался при первом шифровании файла. После проверки пароля содержимое файла будет сохранено на диск в виде незашифрованных данных.
Использование нескольких паролей
Ansible поддерживает для хранилища несколько паролей, сгруппированных по разным идентификаторам. Это полезно, если вы хотите иметь выделенные пароли хранилища для различных сред – для разработки, тестирования и производства.
Чтобы создать новый зашифрованный файл с пользовательским идентификатором хранилища, включите параметр –vault-id вместе с меткой и расположением, где ansible-vault может найти пароль для этого хранилища. Метка может быть любой, а расположение может быть либо prompt (что означает, что команда должна предложить вам ввести пароль), либо путь к файлу паролей.
Это создаст новый идентификатор по имени dev, который использует prompt для получения пароля. Комбинируя этот метод с файлами переменных группы, вы сможете создать отдельные хранилища для каждой среды приложения:
Мы использовали dev и prod в качестве идентификаторов хранилищ, чтобы продемонстрировать, как вы можете создавать отдельные хранилища для каждой среды. Самостоятельно вы можете создать столько хранилищ, сколько захотите, и использовать любой ID.
Теперь, чтобы просмотреть, отредактировать или расшифровать эти файлы, вам необходимо предоставить тот же ID хранилища и источник пароля вместе с командой ansible-vault:
Использование файла паролей
Если вам нужно автоматизировать процесс инициализации серверов в Ansible с помощью стороннего инструмента, вам потребуется способ ввода пароля хранилища без его запроса. Вы можете сделать это, используя файл паролей через ansible-vault.
Файл паролей может быть простым текстовым файлом или исполняемым скриптом. Если файл является исполняемым, выходные данные, созданные ним, будут использоваться в качестве пароля хранилища. В противном случае в качестве пароля хранилища будет использоваться необработанное содержимое файла.
Чтобы применить файл паролей в ansible-vault, необходимо указать путь к файлу паролей при выполнении любой из команд vault:
Ansible не различает контент, который был зашифрован с помощью prompt, и простой файл пароля при условии, что входной пароль один и тот же. С практической точки зрения это означает, что файл можно зашифровать, используя prompt, а затем создать файл пароля для хранения того же пароля, который использовался в методе prompt. Также верно и обратное: вы можете зашифровать содержимое, используя файл паролей, а затем использовать метод prompt, предоставляя тот же пароль при запросе Ansible.
Для большей гибкости и безопасности, чтобы не хранить свой пароль в текстовом файле, вы можете использовать скрипт Python для получения пароля из других источников. Официальный репозиторий Ansible содержит несколько примеров сценариев, которые вы можете использовать для справки при создании своего скрипта под потребности вашего проекта.
Запуск плейбука с зашифрованными данными
Каждый раз, когда вы запускаете плейбук, в котором используются данные, ранее зашифрованные с помощью ansible-vault, вам нужно будет указывать пароль хранилища в команде playbook.
Если вы использовали параметры по умолчанию и prompt при шифровании данных плейбука, вы можете использовать опцию –ask-vault-pass, чтобы Ansible запрашивал пароль:
Если вы использовали файл пароля вместо prompt, вы должны использовать опцию –vault-password-file:
Если вы используете данные, зашифрованные с помощью ID, вам нужно указать тот же ID хранилища и источник пароля, который вы использовали при первом шифровании данных:
Если вы используете файл пароля с ID, вы должны указать метку, а затем полный путь к файлу пароля в качестве источника:
Если ваш play использует несколько хранилищ, вы должны добавить параметр –vault-id для каждого из них в произвольном порядке:
Устранение неполадок
Заключение
В этом мануале рассматриваются наиболее распространенные команды Ansible, которые вы можете использовать при подготовке серверов. Также вы узнали, как удаленно выполнять команды на ваших нодах, как запускать плейбуки и использовать различные пользовательские настройки.
Существует еще много вариантов команд и флагов, которые могут пригодиться вам в работе с Ansible. Чтобы получить обзор всех доступных опций, вы можете использовать команду help:
Если вы хотите получить более полное представление об Ansible и всех его доступных командах и функциях, обратитесь к официальной документации Ansible.
Система управления Ansible
Представьте себе, что вам нужно управлять парком серверов, расположенных к тому же в разных географических точках. Каждый из этих серверов требует настройки, регулярного обновления и мониторинга. Конечно, для решения этих задач можно воспользоваться самым простым способом: подключиться к каждому серверу по ssh и внести необходимые изменения. При всей своей простоте этот способ сопряжен с некоторыми трудностями: он чрезвычайно трудоемок, а на выполнение однообразных операций уходит очень много времени.
Чтобы упростить процессы настройки и конфигурирования серверов, можно также писать shell-скрипты. Но и этот способ вряд ли можно назвать совершенным. Скрипты нужно постоянно изменять, подстраивая их под каждую новую задачу. При их написании необходимо учитывать различие операционных систем и версий. Не будем забывать и о том, что отладка скриптов отнимает много усилий и забирает немало времени.
Оптимальным вариантом решения описанных проблем является внедрение системы удаленного управления конфигурацией. В таких системах достаточно лишь описать нужное состояние управляемого узла. Система должна сама определить, что нужно сделать для достижения этого состояния, и осуществит все необходимые действия.
Со всеми сложностями, о которых идет речь выше, мы хорошо знакомы на собственном опыте: у нас имеется 10 точек присутствия с NS-серверами, расположенные в разных точках планеты. На них необходимо регулярно вносить различные изменения: обновлять операционную систему, устанавливать и обновлять различное ПО, изменять конфигурцию и т.п. Мы решили все эти операции автоматизировать и внедрить систему удаленного управления конфигурациями. Изучив имеющиеся решения, мы остановили свой выбор на Ansible.
В этой статье мы бы хотели подробно рассказать о его возможностях этого инструмента управления конфигурациями и поделиться собственным опытом его использования.
Что такое Ansible?
Ansible — опенсорсное программное решение для удаленного управления конфигурациями, разработанное Майклом Де Хаанном в 2012 году. Название продукта взято из научно-фантастической литературы: в романах американской писательницы Урсулы Ле Гуин ансиблом называется устройство для оперативной космической связи.
Ansible берет на себя всю работу по приведению удаленных серверов в необходимое состояние. Администратору необходимо лишь описать, как достичь этого состояния с помощью так называемых сценариев (playbooks; это аналог рецептов в Chef). Такая технология позволяет очень быстро осуществлять переконфигурирование системы: достаточно всего лишь добавить несколько новых строк в сценарий.
Почему Ansible?
Преимущества Ansible по сравнению с другими аналогичными решениями (здесь в первую очередь следует назвать такие продукты, как Puppet, Chef и Salt) заключаются в следующем:
Установка
Требования для установки Ansible минимальны. На машине с которой производится управление должен быть установлен Python 2.6 или выше. На управляемых узлах должен быть установлен только Python версии не ниже 2.4, но он, как правило, по умолчанию включен в состав большинства дистрибутивов linux-систем. MS Windows не поддерживается.
Вам также могут потребоваться следующие модули Python, устанавливаемые через pip или пакетный менеджер вашей операционной системы:
В Ubuntu установка самого Ansible и зависимостей осуществляется добавлением репозитория и установкой пакета:
О процедуре установки в других ОС можно прочитать в официальной документации.
Группы серверов
Файл hosts
Помимо списка управляемых узлов, в файле hosts могут быть указаны и другие сведения, необходимые для работы: номера портов для подключения по SSH, способ подключения, пароль для подключения по SSH, имя пользователя, объединения групп и т.п. В некоторых случаях — в частности, при работе с большими и сложными конфигурациями, — различные параметры можно выносить в отдельные файлы и каталоги (о структуре каталогов см. ниже).
Более подробно о файле hosts и правилах его написания можно почитать в официальной документации.
Информация об узлах (Facts)
Перед внесением изменений Ansible подключается к управляемым узлам и собирает информацию о них: о сетевых интерфейсах и их состоянии, об установленной операционной системе и т.п. Он может делать это как с помощью собственного модуля, так и с помощью инструментов ohai и facter, если они установлены (такая возможность специально предусмотрена для пользователей, уже имеющих опыт работы с системами удаленного управления конфигурациями: ohai и facter являются библиотеками фактов для Chef и Puppet).
Переменные
Во время деплоя, как правило, требуется не только установить какое-либо приложение, но и настроить его в соответствии с определенными параметрами на основании принадлежности к группе серверов или индивидуально (например, ip-адрес BGP-соседа и номер его AS или параметры для базы данных). Как уже было сказано, загромождать файл hosts будет не очень красиво, поэтому разработчики Ansible пошли следующим путём:
Модули Ansible
В состав Ansible входит огромное количество модулей для развёртывания, контроля и управления различными компонентами, которые можно условно разделить на следующие группы (в скобках приведены названия некоторых продуктов и сервисов):
Примеры простых задач
С помощью Ansible можно одновременно выполнить одну задачу на целой группе серверов. Попробуем, например, отправить запрос ping на серверы выбранной группы:
Следующий пример соберёт информацию о хостах и выведёт её на консоль в формате JSON:
А вот так можно создать логический том (или, в зависимости от текущего состояния, изменить его размер) с именем examplevolume в группе examplegroup:
Ansible позволяет не только выполнять единичные задачи, но и писать сценарии, которые необходимо выполнить на управляемых узлах. Рассмотрим структуру и правила написания таких сценариев более подробно.
Cценарии (playbooks)
Все сценарии в Ansible пишутся на YAML. Это — человекочитаемый формат сериализованных данных, гораздо более простой, чем XML или JSON.
Чтобы выполнить сценарий используется команда ansible-playbook со следующим сиснтаксисом:
В начале сценария обязательно должна присутствовать последовательность символов «» (так в YAML обозначается начало документа). Перед каждым новым разделом списка ставится дефис ( — ):
Основными параметрами/группами простого сценария являются:
В разделе hosts указывается группа управляемых узлов, к которой будут применены описываемые в сценарии изменения.
Так, строка формата:
означает, что изменения будут применены к узлам из группы webservers.
Сценарии могут выполняться не только от имени пользователя, под именем которого установлено соедиение, но и любого другого. В следующем примере авторизация на хосте будет произведена с именем yourname, но задачи будут выполняться от имени пользователя root (если, конечно, этому пользователю это разрешено использовать sudo):
Если добавить параметр “user: postgres”, то все действия будут выполняться с привилегиями пользователя postgres.
В разделе vars указываются переменные, которые будут использованы в сценарии, и их значения:
Список изменений/состояний, которые необходимо произвести на управляемом узле, приводится в разделе tasks. Каждой задаче (task) присваивается имя (name), его можно опустить. Далее указывается модуль Ansible, который будет задействован при её выполнении:
Для каждой задачи можно указывать пользователя, от имени которого она будет выполнена:
Шаблонизация
В Ansbile используется шаблонизатор Jinja2. Приведём пример простого шаблона (часть конфига powerdns):
Обратим внимание на то, что файл шаблона и файл с паролем пользователя базы данных находятся на машине управления, а результатом будет файл на удалённом узле.
Обработчики событий (Handlers)
Ansible не просто выполняет задачи в указанном порядке, но и проверяет их состояние на наличие изменений. Если при выполнении сценария требовалось, например, добавить строку в конфигурационный файл, и в результате выполнения он изменился (необходимой строки действительно не было), то Ansible может выполнить специальную задачу, описанную как обработчик события (handler). Если при выполнении строка уже была в конфигурационном файле, то обработчик выполнен не будет. Обработчики событий описываются в конце сценария; в описании задачи они указываются через параметр notify. Приведём пример:
Контроль выполнения
Допустим, что при выполнении сценария нам нужно проверять определённые переменные или состояния и, в зависимости от них, выполнять или не выполнять какие-либо задачи. Для этого можно использовать оператор “when”:
Делегирование задачи другому хосту
Иногда требуется выполнить задачу на определённом узле, но в контексте другого узла. Например, во время обновления узла может возникнуть необходимость отключить для него мониторинг, находящийся на отдельном сервере. Для этого используется управляющая директива delegate_to. Приведём пример:
Результатом выполнения этой задачи будет отключение сообщений для сервиса dnsserver в Nagios.
Ролью называется типовой набор переменных и задач, назначаемых для одного или нескольких серверов. Если вам нужно применить к серверу или группе серверов типовой набор операций, вам достаточно просто назначить ему роль. Предварительно в проекте каталоге проекта должна быть создана соответствующая структура. В сценариях роли назначаются следующим образом:
Структура проекта
Пример сценария
Чтобы понять, как это все работает, рассмотрим практический пример: простой сценарий развёртывания новой версии PostgreSQL 9.3 на debian-based ОС. Роли в этом примере не используются.
Ansible AWX
Во всех приведенных выше примерах управление Ansible осуществляется с помощью интерфейса командной строки. Но с официального сайта можно загрузить графическую панель управления Ansibleworks AWX, очень симпатичную внешне и удобную в использовании. Собственно, за счет ее распространения и осуществляется монетизация продукта: управление небольшим (до 10) количеством серверов обходится бесплатно, если же серверов больше — нужно приобретать лицензию. Похожие варианты монетизации используются и разработчиками конкурирующих решений — Puppet и Chef.
Заключение
Ansible — достаточно простой, но при этом эффективный инструмент для удаленного управления конфигурациями. В рамках этой статьи мы сделали лишь беглый обзор его возможностей и рассказали, как пишутся сценарии для решения простых задач. Все возможности и варианты использования Ansible в рамках одной статьи охватить невозможно. О применении этого инструмента для решения более специфических задач мы расскажем в последующих публикациях.
Для желающих узнать больше — несколько ссылок:
https://github.com/ansible/ — официальный аккаунт на github c исходным кодом проекта и хорошим набором примеров проектов
http://www.ansibleworks.com/docs/ — официальная документация (активно пополняется);
http://jpmens.net/2012/06/06/configuration-management-with-ansible/ — статья Яна Пита Менса об управлении конфигурациями с помощью Ansible (в его блоге есть и много других материалов по теме).
https://gist.github.com/marktheunissen/2979474 — пример сценария с подробными комментариями, правда для старой версии.
www.ansibleworks.com/docs/contrib.html — ещё больше ссылок на примеры использования, включая в том числе и очень сложные конфигурации.
Для тех кто не может комментировать посты на Хабре, приглашаем к нам в блог.