Работа с VPC при помощи пакета ansible-selvpc-modules

Как мы уже писали, сервис Virtual Private Cloud компании Selectel построен на базе платформы OpenStack, об этом подробнее можно прочитать в нашей предыдущей статье.

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

Работа с виртуальным приватным облаком начинается с создания проекта и резервирования для него ресурсов. Эти операции можно выполнить через панель управления или с помощью нашего API.

Часто при работе с VPC-сервисом может возникнуть необходимость создать несколько одинаковых виртуальных машин, добавить, выделить определенное количество ресурсов, создать новых пользователей и так далее.

Чтобы привести начальную конфигурацию проекта и работу с OpenStack API к общему знаменателю, мы разработали пакет ansible-selvpc-modules, который включает в себя несколько ansible-модулей, предназначенных специально для нашего сервиса. Он будет полезен в работе для любого рода специалистов, которые взаимодействуют с нашим API.

Модули покрывают весь набор функций, который предоставляет наш сервис. Теперь нет необходимости вручную, либо через сторонние утилиты устанавливать ресурсы для проекта: все это можно сделать сразу в одном плейбуке с помощью ansible-selvpc-modules.

Пакет ansible-selvpc-modules включает в себя:

  • selvpc_projects — для управления VPC проектами;
  • selvpc_quotas — для управления ресурсами проекта;
  • selvpc_limits — для получения информации о доступных ресурсах;
  • selvpc_users — для работы с пользователями;
  • selvpc_floatingips — для работы с плавающими ip адресами;
  • selvpc_subnets — для работы с подсетями;
  • selvpc_roles — для работы с ролями в проекте;
  • selvpc_tokens — для создания ключей;
  • selvpc_licenses — для работы с лицензиями.

Ниже я опишу процесс установки пакета, а также приведу пример использования, в котором мы по шагам пройдём путь от создания проекта до запуска виртуальных машин.

Установка

Создадим изолированное виртуальное окружение, активируем и установим ansible-selvpc-modules:

$ virtualenv --no-site-packages env
$ source env/bin/activate
$ pip install git+https://github.com/selectel/ansible-selvpc-modules

Также нам понадобятся дополнительные пакеты для работы: shade как зависимость для os_* ansible-модулей и jmespath для удобного парсинга json-а (подробнее). Ставим из PyPi:

$ pip install shade jmespath

Для работы с Resell API нужны ключи. Зарегистрированные пользователи Selectel могут получить их здесь.

Теперь добавим переменные окружения SEL_URL и SEL_TOKEN:

$ export SEL_URL=https://api.selectel.ru/vpc/resell/
// На момент написания статьи актуальной версией API является 2
$ export SEL_TOKEN=<ваш API-ключ полученный выше в панели>

Так как в примере я буду использовать OpenStack модули для Ansible, дополнительно мне понадобятся следующие переменные:

$ export OS_PROJECT_DOMAIN_NAME=<ваш логин на my.selectel.ru>
$ export OS_USER_DOMAIN_NAME=<аналогично предыдущему>

Для облегчения жизни и хождений на хосты через Ansible выставим переменную окружения ANSIBLE_HOST_KEY_CHECKING в значение False:

$ export ANSIBLE_HOST_KEY_CHECKING=False

Все необходимые пакеты установлены, переменные добавлены, приступим к написанию плейбука.

Пример

1. Создадим файл example_vars.yaml, где определим переменные image, username, password и project_name, а также два списка с именами наших дисков и виртуальных машин. (image — образ OS, под управлением которой будет работать наши виртуальные машины, flavor — конфигурация машины, в нашем случае это 512 RAM и 1 VCPU, подробнее):

---
username: TestUser
password: 123456
project_name: TestProject
image: Ubuntu 16.04 LTS 32-bit
volumes:
  - display_name: volume1
  - display_name: volume2
  - display_name: volume3
servers:
  - name: vm1
  - name: vm2
  - name: vm3

2. Создадим файл example.yaml, в котором мы будем описывать наши таски. Добавим необходимые параметры hosts и vars_files.

Переменная hosts определяет машину/машины, с которым мы будем осуществлять выполнение тасков, а vars_files указывает, откуда подгружать необходимые переменные (тут это файл example_vars.yaml):

---
- hosts: localhost
  vars_files:
    - example_vars.yaml

3. Приступим к написанию тасков. Первым делом добавим создание проекта с помощью selvpc_projects и выделение квот для проекта, используя selvpc_quotas-модуль. Для 3 машин нам будет достаточно 3 процессорных ядер, 1536 RAM и 15 GB SSD-диска:

...
tasks:
   - name: Create project
     selvpc_projects:
         project_name: "{{ project_name }}"
     register: project_out
 
   - name: Set quotas on created project
     selvpc_quotas:
         project_id: "{{ project_out.project.id }}"
         quotas:
             compute_cores:
             - region: ru-1
               zone: ru-1a
               value: 3
             compute_ram:
             - region: ru-1
               zone: ru-1a
               value: 1536
             volume_gigabytes_fast:
             - region: ru-1
               zone: ru-1a
               value: 15
     register: quotas_out

4. Создадим и добавим пользователя в проект:

tasks:
   ...
     - name: Create user
       selvpc_users:
           username: "{{ username }}"
           password: "{{ password }}"
       register: user_out
  
     - name: Add created user to project
       selvpc_roles:
           project_id: "{{ project_out.project.id }}"
           user_id: "{{ user_out.user.id }}"

5. Создадим сеть:

tasks:
    ...
     - name: Create public net
       selvpc_subnets:
            project_id: "{{ project_out.project.id }}"
            subnets:
              - region: ru-1
                type: ipv4
                quantity: 1
                prefix_length: 29
       register: public_net
  
     - name: Get info about network
       selvpc_subnets:
            subnet_id: "{{ public_net|json_query(subnets[0].id') }}"
       register: network_out

6. После создания сети для создания виртуальных машин нам потребуются диски, которые можно создать с помощью готового Ansible модуля os_volume:

tasks:
   ...
     - name: Create volumes
       os_volume:
          state: present
          auth:
            auth_url: https://api.selvpc.ru/identity/v3
            username: "{{ username }}"
            password: "{{ password }}"
            project_name: "{{ project_name }}"
          display_name: "{{ item.display_name }}"
          image: "{{ image }}"
          size: 5
         region_name: ru-1
       with_items: "{{ volumes }}"
       register: volume

7. Для доступа к нашим машинам нам будут нужны SSH-ключи. Мы создадим один ключ для всех машин. В этом нам поможет os_keypair:

tasks:
   ...
     - name: Create key
       os_keypair:
          state: present
          auth:
            auth_url: https://api.selvpc.ru/identity/v3
            username: "{{ username }}"
            password: "{{ password }}"
            project_name: "{{ project_name }}"
          name: ansible_key
         region_name: ru-1
          public_key_file: "{{ '~' | expanduser }}/.ssh/id_rsa.pub"
       register: key

8. С помощью os_nova_flavor создадим конфигурацию(flavor) для наших машин, в нашем случае это 512 RAM и 1 VCPU и назовем ее “selectel_test_flavor”(можно дать любое другое):

tasks:
   ...
     - name: Create flavor
       os_nova_flavor:
          state: present
          auth:
            auth_url: https://api.selvpc.ru/identity/v3
            username: "{{ username }}"
            password: "{{ password }}"
            project_name: "{{ project_name }}"
          name: selectel_test_flavor
          ram: 512
          vcpus: 1
          disk: 0
          region_name: ru-1
          is_public: False
       register: flavor

9. Опишем таск для их создания и дополнительно таск для добавления их в in-memory inventory для последующей работы с уже созданными хостами, в конце небольшую паузу для того, чтобы виртуальные машины успели включиться перед использованием:

tasks:
   ...
     - name: Create servers
       os_server:
          state: present
          auth:
            auth_url: https://api.selvpc.ru/identity/v3
            username: "{{ username }}"
            password: "{{ password }}"
            project_name: "{{ project_name }}"
          name: "{{ item.1.name }}"
          flavor: "{{ flavor }}"
          boot_volume: "{{ item.0 }}"
          nics: "net-id={{ network_out.subnet.network_id }}"
          key_name: ansible_key
         region_name: ru-1
       with_together:
          - "{{ volume|json_query('results[*].id') }}"
          - "{{ servers }}"
       register: created_servers
  
  
     - name: Add hosts to inventory
       add_host:
          name: "{{ item }}"
          ansible_host: "{{ item }}"
          ansible_ssh_user: root
          groups: just_created
       with_items: "{{ created_servers|json_query('results[*].openstack.accessIPv4') }}"
  
- pause:
     seconds: 60

10. В конце добавим таск для проверки наших хостов на доступность:

tasks:
   ...
- hosts: just_created
  tasks:
    - name: Ping all instances
      ping:
      register: results
 debug: msg={{ results }}

Я также добавил debug и ignore_errors в данном таске для наглядности, это не является обязательным (debug позволит нам выводить более подробный результат выполнения тасков, а ignore_errors не прекратит выполнение плейбука, в случае возникновения каких-либо ошибок).

Дополнительно в конце плейбука я добавил удаление конфигурации(flavor), пользователя и проекта, чтобы почистить все, что было создано ранее:

- hosts: localhost
  gather_facts: False
  vars_files:
    - example_vars.yaml
  tasks:
    - name: Delete flavor
      os_nova_flavor:
          state: absent
          auth:
            auth_url: https://api.selvpc.ru/identity/v3
            username: "{{ username }}"
            password: "{{ password }}"
            project_name: "{{ project_name }}"
          name: "{{ flavor.flavor.name }}"
          region_name: ru-1
      register: out
  
     - name: Delete user
       selvpc_users:
           user_id: "{{ user_out.user.id }}"
           state: absent
       register: out
  
     - name: Delete project
       selvpc_projects:
           project_id: "{{ project_out.project.id }}"
           state: absent
       register: out

Полный файл плейбука можно найти здесь.

11. Запускаем наш плейбук:

$ ansible-playbook example.yaml

Во время паузы, которую мы добавили ранее в конце пункта 9, можно сходить в панель управления проекта и посмотреть на созданные серверы:

Результаты выполнения плейбука в консоли:

TASK [Ping all instances] 
*************************************************************************
ok: [95.213.234.211]
ok: [95.213.234.212]
ok: [95.213.234.210]
  
TASK [debug] 
*************************************************************************
ok: [95.213.234.210] => {
    "msg": {
        "changed": false, 
        "ping": "pong"
    }
}
ok: [95.213.234.211] => {
    "msg": {
        "changed": false, 
        "ping": "pong"
    }
}
ok: [95.213.234.212] => {
    "msg": {
        "changed": false, 
        "ping": "pong"
    }
}
  
PLAY [localhost] 
*************************************************************************
TASK [Delete flavor]
*************************************************************************
changed: [localhost]
  
TASK [Delete user] 
*************************************************************************
changed: [localhost]
  
TASK [Delete project] 
*************************************************************************
changed: [localhost]
  
PLAY RECAP 
*************************************************************************
95.213.234.210          : ok=3    changed=0    unreachable=0    failed=0   
95.213.234.211          : ok=3    changed=0    unreachable=0    failed=0   
95.213.234.212          : ok=3    changed=0    unreachable=0    failed=0   
localhost               : ok=25   changed=13   unreachable=0    failed=0 

В выводе мы видим, что все таски выполнились успешно и наши хосты доступны. Также мы видим, что созданный пользователь и проект, а с ним и виртуальные машины были успешно удалены.

Заключение

Мы рассмотрели использование пакета ansible-selvpc-modules для управления проектами VPС.

Ansible-модули покрывают весь набор функций, которые предоставляет наш сервис, и полезны в работе специалистов, взаимодействующих с нашим API.

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

Документация и исходники

Что еще почитать по теме

T-Rex 21 сентября 2022

Гипервизор VMware ESXi: функции и отличия от ESX

В статье рассказываем о работе с гипервизором ESXi, его отличиях от ESX и vSphere.
T-Rex 21 сентября 2022
Андрей Салита 14 сентября 2022

Отличия TCP- и UDP-протоколов — определяем разницу на примерах

Рассматриваем два самых популярных протокола транспортного уровня — протоколы TCP и UDP — и сравниваем их.
Андрей Салита 14 сентября 2022
Владимир Туров 7 сентября 2022

Bat-файлы — их создание и команды

Рассмотрим мощный инструмент автоматизации рутинных задач в семействе операционных систем Windows.
Владимир Туров 7 сентября 2022

Новое в блоге

Михаил Фомин 24 июня 2022

Docker Swarm VS Kubernetes — как бизнес выбирает оркестраторы

Рассказываем, для каких задач бизнесу больше подойдет Docker Swarm, а когда следует выбрать Kubernetes.
Михаил Фомин 24 июня 2022
Ульяна Малышева 30 сентября 2022

«Нулевой» локальный диск. Как мы запустили облако только с сетевыми дисками и приручили Ceph

Чем хороши сетевые диски и почему именно Ceph, рассказал директор по развитию ядра облачной платформы Иван Романько.
Ульяна Малышева 30 сентября 2022
Валентин Тимофеев 30 сентября 2022

Как проходит онбординг сотрудников ИТО? Что нужно, чтобы выйти на смену в дата-центр

Рассказываем, как обучаем новых сотрудников, какие задачи и испытания проходят инженеры прежде, чем выйти на свою первую смену.
Валентин Тимофеев 30 сентября 2022
T-Rex 28 сентября 2022

Книги по SQL: что почитать новичкам и специалистам

Собрали 6 книг, которые помогут на старте изучения SQL и при углублении в тему.
T-Rex 28 сентября 2022