Spec-Zone.ru › Ansible

Руководство по Packet.net

Введение

Packet.net — это хостинг инфраструктуры на физических серверах, поддерживаемый коллекцией community.general с помощью шести облачных модулей. Это следующие шесть модулей:

  • community.general.packet_device: управляет серверами в Packet. С помощью этого модуля можно создавать, перезапускать и удалять устройства.
  • community.general.packet_ip_subnet: назначает подсеть IP-адресов физическому серверу
  • community.general.packet_project: создает или удаляет проект на хосте Packet
  • community.general.packet_sshkey: добавляет открытый SSH-ключ из файла или значения в инфраструктуру Packet. На каждом последующем созданном устройстве этот открытый ключ будет установлен в .ssh/authorized_keys.
  • community.general.packet_volume: создает или удаляет том на хосте Packet
  • community.general.packet_volume_attachment: подключает том к устройству на хосте Packet или отключает его

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

Требования

Модули Packet подключаются к API Packet с помощью пакета packet-python. Его можно установить с помощью pip:

$ pip install packet-python

Чтобы проверять состояние устройств, созданных Ansible в Packet, рекомендуется установить один из клиентов Packet CLI. Также проверить устройства можно на портале 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

Если вы хотите использовать существующую пару ключей, просто скопируйте закрытый и открытый ключи в каталог плейбука.

Создание устройства

Следующий фрагмент кода — это простой плейбук, создающий один сервер Type 0 (параметр plan). Необходимо указать plan и operating_system. По умолчанию для location используется значение ewr1 (Парсиппани, штат Нью-Джерси). Все возможные значения параметров можно найти с помощью клиента CLI.

# playbook_create.yml

- name: Create Ubuntu device
  hosts: localhost
  tasks:

    - community.general.packet_sshkey:
        key_file: ./id_rsa.pub
        label: tutorial key

    - community.general.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 должен быть подготовлен сервер. Это можно проверить с помощью CLI или на портале 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].

Если ваш плейбук работает с существующими устройствами Packet, можно передать только параметры hostname и device_ids. В следующем плейбуке показано, как перезагрузить определенное устройство Packet, задав параметр hostname:

# playbook_reboot.yml

- name: reboot myserver
  hosts: localhost
  tasks:

    - community.general.packet_device:
        project_id: <your_project_id>
        hostnames: myserver
        state: rebooted

Также можно определить нужные устройства Packet с помощью параметра device_ids. UUID устройства можно найти на портале Packet или с помощью CLI. В следующем плейбуке удаляется устройство Packet с использованием поля device_ids:

# playbook_remove.yml

- name: remove a device
  hosts: localhost
  tasks:

    - community.general.packet_device:
        project_id: <your_project_id>
        device_ids: <myserver_device_id>
        state: absent

Более сложные плейбуки

В этом примере мы создадим кластер CoreOS с помощью пользовательских данных.

Для обнаружения других серверов в кластере кластер CoreOS будет использовать etcd. Перед подготовкой серверов необходимо создать токен обнаружения для кластера:

$ curl -w "\n" 'https://discovery.etcd.io/new?size=3'

Следующий плейбук создаст SSH-ключ и три сервера Packet, а затем будет ждать готовности SSH (или истечения 5 минут). Перед выполнением ansible-playbook замените URL токена обнаружения в user_data и project_id. Также можно изменить plan и facility.

# playbook_coreos.yml

- name: Start 3 CoreOS nodes in Packet and wait until SSH is ready
  hosts: localhost
  tasks:

    - community.general.packet_sshkey:
        key_file: ./id_rsa.pub
        label: new

    - community.general.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
      ansible.builtin.wait_for:
        delay: 1
        host: "{{ item.public_ipv4 }}"
        port: 22
        state: started
        timeout: 500
      loop: "{{ newhosts.results[0].devices }}"

Как и в большинстве модулей Ansible, состояния модулей Packet по умолчанию идемпотентны: после повторного запуска плейбука ресурсы в проекте останутся неизменными. Поэтому вызов модуля packet_sshkey можно оставить в плейбуке. Если открытый ключ уже есть в вашей учетной записи Packet, вызов ничего не изменит.

Второй вызов модуля подготавливает три сервера Packet Type 0 (указанные с помощью параметра plan) в проекте, определенном параметром project_id. На всех серверах устанавливается бета-версия CoreOS (параметр 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.

Запустите плейбук:

$ ansible-playbook playbook_coreos.yml

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

tomk@work $ ssh -i id_rsa core@$one_of_the_servers_ip
core@coreos-one ~ $ etcdctl cluster-health

Если у вас есть вопросы или комментарии, сообщите нам! help@packet.net

© 2012–2018 Michael DeHaan
© 2018–2025 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/projects/ansible/latest/collections/community/general/docsite/guide_packet.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API