Spec-Zone.ru › Ansible 2.5

Использование Ansible с хостом Packet

Введение

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 CLI. В противном случае вы можете проверить их через портал Packet.

Для использования модулей и скрипта инвентаризации вам потребуется токен API Packet. Вы можете сгенерировать токен API через портал Packet здесь. Самый простой способ аутентификации — установить токен API Packet в переменной окружения:

$ export PACKET_API_TOKEN=Bfse9F24SFtfs423Gsd3ifGsd43sSdfs

Если вам некомфортно экспортировать токен API, вы можете передать его в качестве параметра модулям.

На Packet, виртуальные сервера и зарезервированные IP-адреса принадлежат проектам. Для использования модуля packet_device необходимо указать UUID проекта, в котором вы хотите создать или управлять виртуальными серверами. UUID проекта можно найти на портале Packet здесь (он находится под таблицей проекта) или с помощью одного из доступных CLI.

Если вы хотите использовать новую пару SSH-ключей в этом руководстве, вы можете сгенерировать её для ./id_rsa и ./id_rsa.pub следующим образом:

$ ssh-keygen -t rsa -f ./id_rsa

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

Создание виртуального сервера

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

# 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. Вы можете проверить это через 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]

Кроме того, hostnames могут содержать специальный форматтер «%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 или с помощью CLI. Следующий 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.devices }}"

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

Второй вызов модуля предоставляет 3 виртуальных сервера типа 0 Packet (указано с помощью параметра «plan») в проекте, идентифицированном с помощью параметра «project_id». Серверы предоставлены с CoreOS beta (параметр «operating_system») и настроены с данными пользователя cloud-config, переданными в параметр «user_data».

Модуль packet_device имеет wait_for_public_IPv, который используется для указания версии IP-адреса, для которого следует ждать (допустимые значения — 4 или 6 для IPv4 или IPv6). Если указано, Ansible будет ждать, пока вызов API GET для виртуального сервера не содержит маршрутизируемый по Интернету 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 в git по адресу contrib/inventory/packet_net.py.

Скрипт инвентаризации настраивается с помощью файла ini.

Если вы хотите использовать скрипт инвентаризации, необходимо сначала экспортировать свой токен API Packet в переменную окружения PACKET_API_TOKEN.

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

$ wget https://github.com/ansible/ansible/raw/devel/contrib/inventory/packet_net.py
$ chmod +x packet_net.py
$ wget https://github.com/ansible/ansible/raw/devel/contrib/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–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.5/scenario_guides/guide_packet.html

Spec-Zone.ru

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