Руководство по Packet.net
Введение
Packet.net — хост bare metal инфраструктуры, поддерживаемый Ansible (>=2.3) через скрипт динамического инвентаризации и два модуля облака. Два модуля:
- packet_sshkey: добавляет открытый SSH-ключ из файла или значения в инфраструктуру Packet. Каждый созданный впоследствии узел будет иметь этот открытый ключ, установленный в .ssh/authorized_keys.
- packet_device: управляет серверами на Packet. Вы можете использовать этот модуль для создания, перезапуска и удаления узлов.
Обратите внимание, что данное руководство предполагает, что вы знакомы с Ansible и его принципом работы. Если нет, ознакомьтесь с их документацией перед началом.
Требования
Модули Packet и скрипт инвентаризации подключаются к API Packet с помощью пакета packet-python. Вы можете установить его с помощью pip:
$ pip install packet-python
Для проверки состояния устройств, созданных Ansible на Packet, рекомендуется установить один из клиентов командной строки Packet. В противном случае вы можете проверить их через портал Packet.
Для использования модулей и скрипта инвентаризации вам потребуется токен API Packet. Вы можете сгенерировать токен API через портал Packet здесь. Самый простой способ аутентификации — установить токен API Packet в переменной окружения:
$ export PACKET_API_TOKEN=Bfse9F24SFtfs423Gsd3ifGsd43sSdfs
Если вам неудобно экспортировать токен API, вы можете передать его в качестве параметра модулям.
На Packet устройства и зарезервированные IP-адреса принадлежат проектам. Для использования модуля packet_device необходимо указать UUID проекта, в котором вы хотите создать или управлять устройствами. UUID проекта можно найти на портале Packet здесь (он находится под таблицей проекта) или с помощью одного из доступных клиентов командной строки.
Если вы хотите использовать новую пару SSH-ключей в этом руководстве, вы можете сгенерировать ее в ./id_rsa и ./id_rsa.pub следующим образом:
$ ssh-keygen -t rsa -f ./id_rsa
Если вы хотите использовать существующую пару ключей, просто скопируйте закрытый и открытый ключи в каталог playbook.
Создание устройства
Следующий фрагмент кода — это простой playbook, который создает один сервер типа 0 (параметр «plan»). Вам необходимо указать «plan» и «operating_system». «location» по умолчанию «ewr1» (Парсиппани, Нью-Джерси). Все возможные значения параметров можно найти с помощью клиента командной строки.
# playbook_create.yml
- name: create ubuntu device
hosts: localhost
tasks:
- packet_sshkey:
key_file: ./id_rsa.pub
label: tutorial key
- packet_device:
project_id: <your_project_id>
hostnames: myserver
operating_system: ubuntu_16_04
plan: baremetal_0
facility: sjc1
После выполнения ansible-playbook playbook_create.yml, сервер должен быть развернут на Packet. Вы можете проверить это с помощью командной строки или на портале Packet.
Если вы получите ошибку с сообщением «failed to set machine state present, error: Error 404: Not Found», проверьте UUID вашего проекта.
Обновление устройств
Два параметра, используемые для уникальной идентификации устройств Packet, — это «device_ids» и «hostnames». Оба параметра принимают либо строку (впоследствии преобразуемую в список из одного элемента), либо список строк.
Параметры «device_ids» и «hostnames» взаимоисключающие. Следующие значения допустимы:
- device_ids: a27b7a83-fc93-435b-a128-47a5b04f2dcf
- hostnames: mydev1
- device_ids: [a27b7a83-fc93-435b-a128-47a5b04f2dcf, 4887130f-0ccd-49a0-99b0-323c1ceb527b]
- hostnames: [mydev1, mydev2]
Кроме того, имена хостов могут содержать специальный форматировщик «%d» вместе с параметром «count», что позволяет легко расширять имена хостов, которые следуют простому шаблону имени и номера; другими словами, hostnames: "mydev%d", count: 2 будет расширен до [mydev1, mydev2].
Если ваш playbook воздействует на существующие устройства Packet, вы можете передать только параметры «hostname» и «device_ids». Следующий playbook демонстрирует, как перезапустить конкретное устройство Packet, задав параметр «hostname»:
# playbook_reboot.yml
- name: reboot myserver
hosts: localhost
tasks:
- packet_device:
project_id: <your_project_id>
hostnames: myserver
state: rebooted
Вы также можете идентифицировать конкретные устройства Packet с помощью параметра «device_ids». UUID устройства можно найти на портале Packet или с помощью клиента командной строки. Следующий playbook удаляет устройство Packet, используя поле «device_ids»:
# playbook_remove.yml
- name: remove a device
hosts: localhost
tasks:
- packet_device:
project_id: <your_project_id>
device_ids: <myserver_device_id>
state: absent
Более сложные playbooks
В этом примере мы создадим кластер CoreOS с данными пользователя.
Кластер CoreOS будет использовать etcd для обнаружения других серверов в кластере. Перед развертыванием серверов вам необходимо сгенерировать токен обнаружения для вашего кластера:
$ curl -w "\n" 'https://discovery.etcd.io/new?size=3'
Следующий playbook создаст SSH-ключ, 3 сервера Packet, а затем подождет, пока SSH будет готов (или пока не пройдет 5 минут). Убедитесь, что вы подставите URL токена обнаружения в «user_data» и «project_id» перед запуском ansible-playbook. Также можете изменить «plan» и «facility».
# playbook_coreos.yml
- name: Start 3 CoreOS nodes in Packet and wait until SSH is ready
hosts: localhost
tasks:
- packet_sshkey:
key_file: ./id_rsa.pub
label: new
- packet_device:
hostnames: [coreos-one, coreos-two, coreos-three]
operating_system: coreos_beta
plan: baremetal_0
facility: ewr1
project_id: <your_project_id>
wait_for_public_IPv: 4
user_data: |
#cloud-config
coreos:
etcd2:
discovery: https://discovery.etcd.io/<token>
advertise-client-urls: http://$private_ipv4:2379,http://$private_ipv4:4001
initial-advertise-peer-urls: http://$private_ipv4:2380
listen-client-urls: http://0.0.0.0:2379,http://0.0.0.0:4001
listen-peer-urls: http://$private_ipv4:2380
fleet:
public-ip: $private_ipv4
units:
- name: etcd2.service
command: start
- name: fleet.service
command: start
register: newhosts
- name: wait for ssh
wait_for:
delay: 1
host: "{{ item.public_ipv4 }}"
port: 22
state: started
timeout: 500
loop: "{{ newhosts.results[0].devices }}"
Как и большинство модулей Ansible, модули Packet по умолчанию идемпотентны, что означает, что ресурсы в вашем проекте останутся неизменными после повторного запуска playbook. Таким образом, мы можем оставить вызов модуля packet_sshkey в нашем playbook. Если открытый ключ уже есть в вашей учетной записи Packet, вызов не повлияет.
Второй вызов модуля развертывает 3 сервера Packet типа 0 (указано параметром «plan») в проекте, идентифицированном параметром «project_id». Серверы развернуты с CoreOS beta (параметр «operating_system») и настроены с данными cloud-config в параметре «user_data».
Модуль packet_device имеет wait_for_public_IPv, используемый для указания версии IP-адреса, для ожидания (допустимые значения 4 или 6 для IPv4 или IPv6). Если указано, Ansible будет ожидать, пока вызов GET API для устройства не содержит маршрутизируемый по интернету IP-адрес указанной версии. При ссылке на IP-адрес созданного устройства в последующих вызовах модулей целесообразно использовать параметр wait_for_public_IPv или state: active в вызове модуля packet_device.
Запустите playbook:
$ ansible-playbook playbook_coreos.yml
После завершения playbook ваши новые устройства должны быть доступны по SSH. Попробуйте подключиться к одному и проверить, правильно ли запущен etcd:
tomk@work $ ssh -i id_rsa core@$one_of_the_servers_ip core@coreos-one ~ $ etcdctl cluster-health
После создания нескольких устройств вы, возможно, оцените скрипт динамической инвентаризации…
Скрипт динамической инвентаризации
Скрипт динамической инвентаризации запрашивает у API Packet список хостов и делает его доступным для Ansible, чтобы вы могли легко идентифицировать и действовать на устройствах Packet.
Вы можете найти его в репозитории Ansible Community General Collection в git по адресу scripts/inventory/packet_net.py.
Скрипт инвентаризации настраивается через файл ini.
Если вы хотите использовать скрипт инвентаризации, сначала необходимо экспортировать свой токен API Packet в переменную окружения PACKET_API_TOKEN.
Вы можете скопировать инвентаризацию и конфигурацию ini из клонированного репозитория git или скачать их в свою рабочую директорию следующим образом:
$ wget https://raw.githubusercontent.com/ansible-collections/community.general/main/scripts/inventory/packet_net.py $ chmod +x packet_net.py $ wget https://raw.githubusercontent.com/ansible-collections/community.general/main/scripts/inventory/packet_net.ini
Чтобы понять, что скрипт инвентаризации предоставляет Ansible, вы можете запустить:
$ ./packet_net.py --list
Он должен вывести JSON-документ, похожий на следующий урезанный словарь:
{
"_meta": {
"hostvars": {
"147.75.64.169": {
"packet_billing_cycle": "hourly",
"packet_created_at": "2017-02-09T17:11:26Z",
"packet_facility": "ewr1",
"packet_hostname": "coreos-two",
"packet_href": "/devices/d0ab8972-54a8-4bff-832b-28549d1bec96",
"packet_id": "d0ab8972-54a8-4bff-832b-28549d1bec96",
"packet_locked": false,
"packet_operating_system": "coreos_beta",
"packet_plan": "baremetal_0",
"packet_state": "active",
"packet_updated_at": "2017-02-09T17:16:35Z",
"packet_user": "core",
"packet_userdata": "#cloud-config\ncoreos:\n etcd2:\n discovery: https://discovery.etcd.io/e0c8a4a9b8fe61acd51ec599e2a4f68e\n advertise-client-urls: http://$private_ipv4:2379,http://$private_ipv4:4001\n initial-advertise-peer-urls: http://$private_ipv4:2380\n listen-client-urls: http://0.0.0.0:2379,http://0.0.0.0:4001\n listen-peer-urls: http://$private_ipv4:2380\n fleet:\n public-ip: $private_ipv4\n units:\n - name: etcd2.service\n command: start\n - name: fleet.service\n command: start"
}
}
},
"baremetal_0": [
"147.75.202.255",
"147.75.202.251",
"147.75.202.249",
"147.75.64.129",
"147.75.192.51",
"147.75.64.169"
],
"coreos_beta": [
"147.75.202.255",
"147.75.202.251",
"147.75.202.249",
"147.75.64.129",
"147.75.192.51",
"147.75.64.169"
],
"ewr1": [
"147.75.64.129",
"147.75.192.51",
"147.75.64.169"
],
"sjc1": [
"147.75.202.255",
"147.75.202.251",
"147.75.202.249"
],
"coreos-two": [
"147.75.64.169"
],
"d0ab8972-54a8-4bff-832b-28549d1bec96": [
"147.75.64.169"
]
}
В ключе ['_meta']['hostvars'] находится список устройств (уникально идентифицированных по их общедоступному IPv4-адресу) с их параметрами. Другие ключи под ['_meta'] — это списки устройств, сгруппированных по какому-либо параметру. Здесь это тип (все устройства типа baremetal_0), операционная система и местоположение (ewr1 и sjc1).
Помимо групп параметров, также есть группы с одним элементом с UUID или именем хоста устройства.
Теперь вы можете нацеливаться на группы в playbooks! Следующий playbook установит роль, которая предоставляет ресурсы для Ansible-цели для всех устройств в группе «coreos_beta»:
# playbook_bootstrap.yml
- hosts: coreos_beta
gather_facts: false
roles:
- defunctzombie.coreos-boostrap
Не забудьте указать динамическую инвентаризацию в аргументе -i!
$ ansible-playbook -u core -i packet_net.py playbook_bootstrap.yml
Если у вас есть какие-либо вопросы или замечания, сообщите нам! help@packet.net
© 2012–2018 Michael DeHaan
© 2018–2021 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.11/scenario_guides/guide_packet.html