Управление серверами Vscale через Ansible

9b5317de0acf4325ae46f8291f377987.png

Проект 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, не вариться в собственном соку, а знакомить сообщество с результатами своего труда. О наиболее интересных разработках мы обязательно напишем, а самых активных и талантливых — премируем.

© Habrahabr.ru