Управление серверами Vscale через Ansible
Проект Vscale был запущен всего полгода назад, и сейчас он очень активно развивается. Интенсивное развитие во многом стало возможным благодаря сообществу: огромный вклад в развитие сервиса вносят пользователи, которые создают библиотеки для работы с API и делятся ими с широкой аудиторией на GitHub. В числе интересных разработок — клиенты на Go, Ruby, Java, а также плагин для Docker Machine.
Со своей стороны мы хотели бы предложить сообществу еще один полезный инструмент: модуль для системы управления конфигурациями Ansible, с помощью которого можно развертывать виртуальную инфраструктуру на базе Vscale.
Возможности модуля
Установив наш модуль, вы сможете написать сценарий для автоматического развёртывания виртуальной инфраструктуры на базе Vscale. С его помощью можно выполнять следующие операции:
- создание и удаление серверов;
- переустановка операционной системы на сервере;
- апгрейд конфигурации;
- включение, выключение и перезагрузка серверов.
В этой статье мы рассмотрим несколько примеров его использования. Все его возможности детально описаны в документации к модулю.
Загрузка и первичная настройка
Прежде чем начинать работу с модулем, нужно выполнить несколько подготовительных операций. Сначала сгенерируем в панели управления токен для доступа к API.
Затем добавим переменную окружения VS_API_KEY
и укажем полученный токен в качестве её значения:
$ export VS_API_KEY=5c22a088f3b37c933e7480399f1e09258d6977bcd1eb2401de29e8001c9bedc36
Cоздадим директории для SSH-ключей и библиотек:
$ mkdir -p vscale-ansible/{credentials,group_vars}
После этого сгенерируем SSH-ключ для доступа к серверам. Если вам требуется добавить уже имеющийся SSH-ключ, просто укажите путь к нему в конфигурационном файле (см. ниже):
$ ssh-keygen -f ./vscale-ansible/credentials/ansible
Откроем конфигурационный файл vscale-ansible/ansible.cfg и пропишем следующие настройки:
sudo_user = root
remote_user = root
host_key_checking = False
private_key_file = ./credentials/ansible
[ssh_connection]
control_path = %(directory)s/%%h-%%r
Создадим также файл vscale-ansible/inventory, в котором будут указаны имена управляемых с помощью Ansible хостов:
[fe-servers]
fe-[01:02]
[local]
localhost
После этого можно загружать модуль:
$ git clone https://github.com/vscale/ansible-vscale-modules.git ./library
Для удобства дальнейшей работы определим несколько переменных в файле vscale-ansible/group_vars/all.yml:
---
vscale_token: "{{ lookup('env', 'VS_API_KEY')}}"
key: "{{ lookup('file', 'credentials/ansible.pub') }}"
Тестовый сценарий: создание сервера
Попробуем написать сценарий, с помощью которого в Vscale будет создан новый сервер с нужными нам характеристиками. Создадим в текстовом редакторе файл createserver.yml и добавим следующие строки:
---
- name: Add SSH key
connection: local
gather_facts: no
hosts:
fe-servers
tasks:
- name: Add SSH key to Vscale account
run_once: true
vscale_ssh:
token: "{{ vscale_token }}"
name: "Ansible"
public_key: "{{ key }}"
state: present
В этом фрагменте мы описали процедуру добавления SSH-ключа, воспользовавшись двумя определёнными ранее переменными (token
и public_key
).
Далее описываем параметры сервера, который требуется создать:
- name: Create scalet for inventory hosts
vscale_scalets:
token: "{{ vscale_token }}"
name: "{{ inventory_hostname }}"
plan: small
location: spb0
image: ubuntu_14.04_64_002_master
key_name: "Ansible"
collect_facts: "yes"
power_state: "started"
state: present
register: server
- set_fact:
ansible_ssh_host: "{{ server['scalet']['public_address']['address'] }}"
Далее установим на нашем сервере Nginx:
- name: Install NGINX and fill disk
remote_user: root
hosts:
- fe-servers
tasks:
- name: Install NGINX
apt:
pkg: nginx
update_cache: yes
state: latest
- name: Filling disk
command: dd if=/dev/zero of=/large.file bs=100M count=150 creates=/large.file
В этом фрагменте мы не только описали стандартную процедуру установки Nginx, но и заполнили диск. Мы сделали это намеренно, чтобы вы смогли протестировать следующую часть нашего сценария:
- name: Check free disk space
remote_user: root
hosts:
- fe-servers
tasks:
- name: Gather facts
setup:
- name: Upgrade server if disk has than 3Gb left
hosts:
- fe-servers
connection: local
tasks:
- name: Upgrade
vscale_scalets:
token: "{{ vscale_token }}"
name: "{{ inventory_hostname }}"
plan: medium
upgrade: yes
state: present
when: "{{ (ansible_mounts[0].size_available)/2**30 < 3*(2**30) }}"
В ней мы запускаем проверку свободного места на диске. Если свободный объём диска составляет меньше 3 Gb, конфигурация сервера будет автоматически обновлена до более производительной.
Вот и всё. Сохраним внесённые изменения и выполним команду:
$ ansible-playbook -i inventory createserver.yml
Описанный сценарий для тестирования вы можете найти в нашем репозитории.
Установка ПО на серверах
Мы только что рассмотрели пример сценария, который просто создаёт новый сервер. Попробуем теперь автоматизировать процесс установки ПО.
Это можно сделать с помощью готовых сценариев и ролей — берите и пользуйтесь:
Если вы не ещё не установили модуль по приведенной выше инструкции, то можете просто клонировать репозиторий со сценариями, а затем подключить наш модуль с помощью команды git submodule:
$ git clone https://github.com/vscale/ansible-playbooks.git
$ cd ansible-playbooks
$ git submodule init
$ git submodule update
У этого способа есть определённые преимущества: если мы подключаем какой-то репозиторий в виде подмодуля, он всегда остаётся в рабочем, консистентном состоянии. Даже если мы обновим репозиторий в основной ветке и в нём что-то «сломается», ваш подмодуль после обновления не будет изменён.
Не забудьте сгенерировать SSH-ключ и добавить путь до него в конфигурационный файл :)
Структура и синтаксис сценариев довольно просты, и вы наверняка сможете написать что-нибудь своё — документация API вам в помощь.
Заключение
Приглашаем всех попробовать наш модуль Ansible и надеемся, что он окажется для вас полезным. Будем рады любым замечаниям и предложениям по его дальнейшему усовершенствованию.
А ещё мы призываем всех, кто пишет клиентские библиотеки для Vscale, не вариться в собственном соку, а знакомить сообщество с результатами своего труда. О наиболее интересных разработках мы обязательно напишем, а самых активных и талантливых — премируем.