Как использовать DigitalOcean API v2 с Ansible 2.0 в Ubuntu 14.04

Вступление

Недавно был выпущен Ansible 2.0, а вместе с ним и поддержка version 2 API DigitalOcean. Это означает, что вы можете использовать Ansible не только для предоставления своих веб-приложений, но также для автоматического предоставления и управления вашими каплями.

Хотя DigitalOcean предоставляет простой веб-интерфейс для настройки ключей SSH и создания капель, это ручной процесс, который необходимо выполнять каждый раз, когда вы хотите подготовить новый сервер. Когда ваше приложение расширяется до большего количества серверов и требует возможности расти и уменьшаться по требованию, вам больше не нужно вручную создавать и настраивать сценарии развертывания приложения для каждого сервера.

Преимущество использования такого инструмента обеспечения, как Ansible, заключается в том, что он позволяет полностью автоматизировать этот процесс, и его запуск так же прост, как и запуск одной команды. В этом руководстве на примере будет показано, как использовать поддержку Ansible для DigitalOcean API v2.

В частности, в этом руководстве будет описан процесс настройки нового ключа SSH для учетной записи DO и подготовки двух разных капель, чтобы они были готовы к использованию для развертывания ваших веб-приложений. После изучения этого руководства вы сможете изменять и интегрировать эти задачи в существующие сценарии развертывания приложений.

Предпосылки

Этот учебник основан на базовых знаниях Ansible, поэтому, если вы новичок в Ansible, вы можете прочитать https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-ansible-on-ubuntu-14 -04 # how-делает-ansible-work [этот раздел руководства по установке Ansible] первым.

Чтобы следовать этому уроку, вам понадобится:

Шаг 1 - Настройка Ansible

На этом этапе мы настроим Ansible для связи с API DigitalOcean.

Как правило, Ansible просто использует SSH для подключения к различным серверам и запуска команд. Это означает, что конфигурация, необходимая для начала использования Ansible, обычно является стандартной для всех модулей. Однако, поскольку обмен данными с API DigitalOcean - это не просто команда оболочки SSH, нам потребуется выполнить небольшую дополнительную настройку. Python-модуль + dopy + (DigitalOcean API Python Wrapper) - это то, что позволит Ansible взаимодействовать с API.

Чтобы установить + dopy +, сначала установите менеджер пакетов Python + pip +.

sudo apt-get install python-pip

Затем установите + dopy +, используя + pip +.

sudo pip install 'dopy>=0.3.5,<=0.3.5'

Затем мы создадим новый каталог для работы, чтобы сохранить порядок, и настроим базовый файл конфигурации Ansible.

По умолчанию Ansible использует файл hosts, расположенный в + / etc / ansible / hosts +, который содержит все серверы, которыми он управляет. Хотя этот файл подходит для некоторых случаев использования, он глобален. Это глобальная конфигурация, которая подходит в некоторых случаях, но мы будем использовать локальный файл hosts в этом руководстве. Таким образом, мы не будем случайно ломать любые существующие конфигурации, которые могут у вас возникнуть при изучении и тестировании поддержки DO API Ansible.

Создайте и переместите в новый каталог, который мы будем использовать до конца этого урока.

mkdir ~/ansible-do-api
cd ~/ansible-do-api/

Когда вы запускаете Ansible, он ищет файл + ansible.cfg + в каталоге, где он запускается, и, если он его находит, он применяет эти параметры конфигурации. Это означает, что мы можем легко переопределить параметры, такие как + hostfile +, для каждого отдельного варианта использования.

Создайте новый файл с именем + ansible.cfg + и откройте его для редактирования, используя + nano + или ваш любимый текстовый редактор.

nano ansible.cfg

Вставьте следующее в + ansible.cfg +, затем сохраните и закройте файл.

Обновлен ansible.cfg

[defaults]
hostfile = hosts

Установка опции + hostfile + в группе + [defaults] + указывает Ansible использовать конкретный файл hosts вместо глобального. Этот + ansible.cfg + говорит Ansible искать хост-файл с именем + hosts + в том же каталоге.

Далее мы создадим файл + hosts +.

nano hosts

Поскольку в этом руководстве мы будем иметь дело только с API-интерфейсом DigitalOcean, мы можем указать Ansible работать на + localhost +, что упрощает работу и устраняет необходимость подключения к удаленному хосту. Это можно сделать, сказав Ansible использовать + localhost + и указав + ansible_connection + как + local +. Вставьте приведенный ниже код в + hosts +, затем сохраните и закройте файл.

Обновленный файл hosts

[digitalocean]
localhost ansible_connection=local

Наконец, мы будем использовать токен API, созданный в предварительных условиях, чтобы Ansible мог обмениваться данными с API DigitalOcean. Есть три способа сообщить Ansible о токене API:

  1. Предоставьте его непосредственно для каждой задачи DigitalOcean, используя параметр + api_token +.

  2. Определите его как переменную в файле playbook или файла hosts и используйте эту переменную для параметра + api_token +.

  3. Экспортируйте его как переменную окружения, как + DO_API_TOKEN + или + DO_API_KEY +.

Вариант 1 является наиболее прямым подходом и может показаться привлекательным, если вы не хотите создавать переменные. Однако это означает, что токен API необходимо будет копировать в каждую задачу, для которой он используется. Что еще более важно, это означает, что если он когда-либо изменится, вам нужно будет найти все его экземпляры и заменить их все.

Вариант 2 позволяет нам устанавливать токен API непосредственно в нашей книге воспроизведения, как вариант 1. В отличие от варианта 1, мы определяем его только в одном месте, используя переменную, которая удобнее и проще для обновления. Мы будем использовать вариант 2 для этого урока, потому что это самый простой подход.

Однако ничего не стоит, если вариант 3 - лучший способ защиты вашего токена API, потому что вам намного сложнее случайно зафиксировать токен API в репозитории (которым может поделиться кто угодно). Это позволяет настраивать токен на системном уровне и работать с различными книгами воспроизведения, не включая токен в каждом.

Создайте базовую пьесу под названием + digitalocean.yml +.

nano digitalocean.yml

Вставьте следующий код в файл, убедившись в его замене в вашем токене API.

Обновленный digitalocean.yml

---
- hosts: digitalocean

 vars:
   do_token:

 tasks:

Вы можете оставить этот файл открытым в вашем редакторе, так как мы продолжим работу с ним на следующем шаге.

Шаг 2 - Настройка ключа SSH

На этом этапе мы создадим новый ключ SSH на вашем сервере и добавим его в вашу учетную запись DigitalOcean с помощью Ansible.

Первое, что нам нужно сделать, это убедиться, что у пользователя есть пара ключей SSH, которую мы можем отправить в DigitalOcean, чтобы он мог быть установлен по умолчанию на ваших новых каплях. Хотя это легко сделать с помощью командной строки, мы можем сделать это так же легко с помощью модуля users в Ansible. Преимущество использования Ansible также заключается в том, что ключ существует до его использования, что позволяет избежать проблем при запуске playbook на разных хостах.

В вашей книге игр добавьте задачу + user + ниже, которую мы можем использовать, чтобы убедиться, что ключ SSH существует, затем сохраните и закройте файл.

Обновленный digitalocean.yml

---
- hosts: digitalocean

 vars:
   do_token:

 tasks:

Запустите вашу игровую книгу.

ansible-playbook digitalocean.yml

Вывод должен выглядеть так:

Выход

PLAY ***************************************************************************

TASK [setup] *******************************************************************
ok: [localhost]

TASK [ensure ssh key exists] ***************************************************
changed: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0

Когда это закончится, вы можете вручную проверить, существует ли ключ, выполнив:

ls -la ~/.ssh/id_rsa*

В нем будут перечислены все файлы, которые соответствуют + id_rsa * +. Вы должны увидеть + id_rsa + и + id_rsa.pub + в списке, указывая, что ваш SSH-ключ существует.

Затем мы вставим ключ в вашу учетную запись DigitalOcean, поэтому снова откройте вашу книгу для редактирования.

nano digitalocean.yml

Мы будем использовать digital_ocean Ansible модуль для загрузки вашего ключа SSH. Мы также зарегистрируем выходные данные задачи как переменную + my_ssh_key +, потому что мы понадобится для следующего шага.

Добавьте задачу в конец файла, затем сохраните и закройте файл.

Обновленный digitalocean.yml

---
. . .
 - name: ensure ssh key exists
   user: >
     name={{ ansible_user_id }}
     generate_ssh_key=yes
     ssh_key_file=.ssh/id_rsa

Мы используем несколько различных опций из модуля + digital_ocean + здесь:

  • * state * - может быть активным, отсутствующим или удаленным. В этом случае мы хотим + present +, потому что мы хотим, чтобы ключ SSH присутствовал в учетной записи.

  • * команда * - это либо дроплет, либо ssh. Нам нужен + ssh +, который позволяет нам управлять состоянием ключей SSH в учетной записи.

  • * name * - это имя для сохранения ключа SSH, оно должно быть уникальным и будет использоваться для идентификации вашего ключа через API и веб-интерфейс.

  • * ssh_pub_key * - это ваш открытый ключ SSH, который будет тем ключом, существование которого мы гарантировали с помощью пользовательского модуля.

  • * api_token * - это ваш токен API DigitalOcean, который мы имеем в качестве переменной (+ do_token +, определенный в разделе + vars +).

Теперь запустите вашу книгу.

ansible-playbook digitalocean.yml

Вывод должен выглядеть так:

Выход

. . .

TASK [ensure key exists at digital ocean] **************************************
changed: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=3    changed=1    unreachable=0    failed=0

Когда это закончится, вы можете вручную проверить, что ваш SSH-ключ существует в вашей учетной записи DigitalOcean, перейдя на панель управления, нажав * Настройки * (в меню шестеренки), затем * Безопасность * (в категории * Пользователь * слева). боковая панель). Вы должны увидеть ваш новый ключ в списке * SSH Keys *.

Шаг 3 - Создание новой капли

На этом шаге мы создадим новую каплю.

Мы кратко коснулись модуля + digital_ocean + в шаге 2. На этом шаге мы будем использовать другой набор опций для этого модуля:

  • * команда * - мы использовали эту опцию на предыдущем шаге с ` + ssh + `; на этот раз мы будем использовать его с `+ droplet + для управления каплями через этот модуль.

  • * state * - мы использовали это и на предыдущем шаге; здесь, это представляет состояние Капли, которое мы хотим быть + присутствует +.

  • * image_id * - это изображение, которое нужно использовать для новой капли, например + ubuntu-14-04-x64 +.

  • * имя * - это имя хоста, которое будет использоваться при создании дроплета.

  • * region_id * - это регион, в котором создается капля, например + NYC3 +.

  • * size_id * - это размер капли, которую мы хотим создать, например + 512mb +.

  • * sshkeyids * - это идентификатор (или идентификаторы) SSH-ключа, который должен быть установлен на сервере при его создании.

Есть намного больше вариантов, чем те, которые мы рассматриваем в этом руководстве (все они можно найти на странице документации Ansible), но, используя эти параметры в качестве руководства, мы можем написать вашу новую задачу.

Откройте вашу книгу для редактирования.

nano digitalocean.yml

Обновите вашу книгу, добавив новое задание, выделенное красным ниже, затем сохраните и закройте файл. Вы можете изменить параметры, такие как размер, регион и изображение в соответствии с вашим приложением. Приведенные ниже параметры создадут сервер Ubuntu 14.04 объемом 512 МБ с именем * droplet-one *, используя ключ SSH, который мы создали на предыдущем шаге.

Обновленный digitalocean.yml

. . .
     api_token={{ do_token }}
   register: my_ssh_key

Обратите внимание, что мы используем + {{my_ssh_key.ssh_key.id}} +, чтобы получить идентификатор ранее установленного ключа SSH и передать его в новую каплю. Это работает, если ключ SSH создан недавно или он уже существует.

Теперь запустите вашу книгу. Это займет немного больше времени, чем раньше, потому что будет создаваться капля.

ansible-playbook digitalocean.yml

Вывод должен выглядеть так:

. . .

TASK [ensure key exists at DigitalOcean] **************************************
ok: [localhost]

TASK [ensure droplet one exists] ******************************************************
changed: [localhost]

TASK [debug] *******************************************************************
ok: [localhost] => {
"msg": "IP is "
}

PLAY RECAP *********************************************************************
localhost                  : ok=5    changed=1    unreachable=0    failed=0

Ansible предоставил нам IP-адрес новой капли в ответном сообщении. Чтобы убедиться, что он работает, вы можете войти в него напрямую, используя SSH.

ssh root@

Это должно соединить вас с вашим новым сервером (используя ключ SSH, который мы создали на вашем сервере Ansible в шаге 2). Затем вы можете выйти обратно на свой Ansible сервер, нажав + CTRL + D +.

Шаг 4 - Обеспечение существования капли

На этом шаге мы обсудим концепцию идемпотентности и то, как это относится к обеспечению капель Ansible.

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

Если вы снова запустите свою книгу воспроизведения (пока не делайте этого!), Учитывая текущую конфигурацию, она продолжит работу и предоставит вторую каплю, также называемую + droplet-one +. Запустите его снова, и он сделает третью каплю. Это связано с тем, что DigitalOcean допускает несколько капель с одинаковым именем. Чтобы избежать этого, мы можем использовать параметр + unique_name +.

Параметр + unique_name + сообщает Ansible и DigitalOcean, что вы хотите уникальные имена хостов для ваших серверов. Это означает, что когда вы снова запустите свою книгу игр, она соблюдает идемпотентность и рассмотрит уже предоставленную каплю, и поэтому не будет создавать второй сервер с тем же именем.

Откройте вашу книгу для редактирования:

nano digitalocean.yml

Добавьте в параметр + unique_name +:

Обновленный digitalocean.yml

. . .
 - name: ensure droplet one exists
   digital_ocean: >
     state=present
     command=droplet
     name=droplet-one

     size_id=512mb
. . .

Сохраните и запустите ваш playbook:

ansible-playbook digitalocean.yml

Вывод должен привести к неизменным задачам, но вы заметите, что отладочный вывод с IP-адресом все еще отображается. Если вы проверите свою учетную запись DigitalOcean, вы заметите, что была предоставлена ​​только одна * droplet-one * Droplet.

Шаг 5 - Создание второй капли

На этом шаге мы скопируем нашу существующую конфигурацию для предоставления отдельной капли.

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

Во-первых, нам нужно определить наш список капель.

Откройте вашу книгу для редактирования:

nano digitalocean.yml

Добавьте в список имен дроплетов, которые будут предоставлены в разделе + vars +.

Обновленный digitalocean.yml

---
- hosts: digitalocean

 vars:
   do_token: <digitalocean_token>




 tasks:
. . .

Затем нам нужно обновить нашу задачу, чтобы пройтись по списку капель, проверить, существуют ли они, а затем сохранить результаты в переменной. После этого нам также нужно изменить наши задачи + debug + для вывода информации, хранящейся в переменной для каждого элемента.

Для этого обновите задачу * Убедитесь, что существует дроплет * в вашей книге игр, как показано ниже:

Обновленный digitalocean.yml

. . .
 - name:
   digital_ocean: >
     state=present
     command=droplet
     name=
     unique_name=yes
     size_id=512mb
     region_id=sgp1
     image_id=ubuntu-14-04-x64
     ssh_key_ids={{ my_ssh_key.ssh_key.id }}
     api_token={{ do_token }}

   register:

 - debug: msg="IP is "

Сохраните и запустите ваш playbook.

ansible-playbook digitalocean.yml

Результаты должны выглядеть так:

Выход

. . .
TASK [ensure droplets exists] **************************************************
ok: [localhost] => (item=droplet-one)
changed: [localhost] => (item=droplet-two)

TASK [debug] *******************************************************************

. . .

"msg": "IP is "

. . .

"msg": "IP is "
}

PLAY RECAP *********************************************************************
localhost                  : ok=5    changed=1    unreachable=0    failed=0

Вы можете заметить, что вывод + debug + содержит гораздо больше информации, чем в первый раз. Это связано с тем, что модуль + debug + выводит дополнительную информацию для справки по отладке; это небольшой недостаток использования зарегистрированных переменных с этим модулем.

Кроме того, вы увидите, что наш второй Droplet подготовлен, а наш первый уже запущен. Вы подготовили две капли DigitalOcean, используя только Ansible!

Удалить ваши капли так же просто. Параметр состояния в задаче сообщает Ansible, в каком состоянии должна находиться капля. Установка его в «+ present » гарантирует, что дроплет существует, и он будет создан, если он еще не существует; установка его в ` absent ` гарантирует, что дроплет с указанным именем * не * существует, и удалит все дроплеты, соответствующие указанному имени (если задано ` unique_name +`).

Если вы хотите удалить два примера Droplets, которые вы создали в этом учебном пособии, просто измените состояние в задаче создания на + absent + и перезапустите вашу игровую книгу.

Обновленный digitalocean.yml

. . .
 - name: ensure droplets exist
   digital_ocean: >
     state=
     command=droplet
. . .

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

ansible-playbook digitalocean.yml

Теперь ваши два примера Droplets будут удалены.

Заключение

Ansible - невероятно мощный и очень гибкий инструмент обеспечения. Вы видели, как легко предоставлять (и удалять) капли, используя API DigitalOcean, используя только стандартные концепции Ansible и встроенные модули.

Параметр состояния, для которого было установлено значение «+ present », сообщает Ansible, в каком состоянии должна находиться капля. Установка его в « present » гарантирует, что дроплет существует, и он будет создан, если он еще не существует; установка его в ` absent ` говорит Ansible, чтобы убедиться, что дроплет с указанным именем * не * существует, и удалит все дроплеты, соответствующие указанному имени (если установлено ` unique_name +`).

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

Related