Packet.net ガイド

はじめに

Packet.net は、動的インベントリースクリプトと 2 つのクラウドモジュールを介して Ansible (2.3 以降) が対応するベアメタルインフラストラクチャーホストです。2 つのモジュールは、以下の通りです。

  • packet_sshkey - ファイルまたは値から Packet インフラストラクチャーに公開 SSH キーを追加します。今後作成されるすべてのデバイスには、この公開鍵が .ssh/authorized_keys にインストールされています。
  • packet_device - Packet 上のサーバーを管理します。このモジュールを使用して、デバイスの作成、再起動、および削除を行うことができます。

本ガイドは、Ansible とその仕組みに精通していることを前提とします。そうでない場合は、作業を開始する前に ドキュメント を確認してください。

要件

Packet モジュールおよびインベントリースクリプトは、packet-python パッケージを使用して Packet API に接続します。pip を使用してインストールできます。

$ pip install packet-python

Packet で Ansible が作成したデバイスの状態を確認するには、Packet CLI クライアント のいずれかをインストールすることが推奨されます。そうでない場合は、Packet ポータル で確認できます。

モジュールおよびインベントリースクリプトを使用するには、Packet API トークンが必要です。こちら で Packet ポータルから API トークンを生成できます。自身を認証する最も簡単な方法は、環境変数に Packet API トークンを設定することです。

$ export PACKET_API_TOKEN=Bfse9F24SFtfs423Gsd3ifGsd43sSdfs

API トークンのエクスポートが不明な場合は、これをパラメーターとしてモジュールに渡すことができます。

Packet では、デバイスと予約された IP アドレスは プロジェクト に属します。Packet_device モジュールを使用するには、デバイスを作成または管理するプロジェクトの UUID を指定する必要があります。Packet ポータル (こちら) (これはプロジェクトテーブルのすぐ下にあります) または利用可能な CLI のいずれを使用して、プロジェクトの UUID を確認できます。

このチュートリアルでは、新しい SSH キーペアを使用する場合は、以下のように ./id_rsa および ./id_rsa.pub に生成できます。

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

既存のキーペアを使用する場合は、秘密鍵と公開鍵を Playbook ディレクトリーにコピーします。

デバイスの作成

以下のコードブロックは、Type 0 サーバー (「plan」パラメーター) を作成する簡単な Playbook です。「plan」および「operating_system」を定義する必要があります。「location」は、「EWR1」 (Parsippany、NJ) に設定されます。CLI クライアント <https://www.packet.net/developers/integrations/>_ を使用して、パラメーターに使用できるすべての値を見つけることができます。

# 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 ポータル <https://app.packet.net/portal#/projects/list/table>`__ で検証できます。

エラーが発生し、「failed to set machine state present, error:Error 404:Not Found」メッセージが表示されたら、プロジェクト UUID を確認します。

デバイスの更新

Packet デバイスを一意に識別するために使用される 2 つのパラメーターは、「device_ids」および「hostnames」です。どちらのパラメーターも、1 つの文字 (後で単一の要素の一覧に変換) または文字列の一覧を受け入れます。

「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]

さらに、ホスト名には、簡単な名前と数字のパターンに従うホスト名を簡単に拡張できる「count」パラメーターとともに特別な「%d」フォーマッターを含めることができます。つまり、hostnames: "mydev%d", count:2 が [mydev1, mydev2] に展開します。

Playbook が既存の Packet デバイスで動作する場合は、「hostname」パラメーターおよび「device_ids」パラメーターのみを渡すことができます。以下の Playbook は、「hostname」パラメーターを設定して特定の Packet デバイスを再起動する方法を示しています。

# playbook_reboot.yml

- name: reboot myserver
  hosts: localhost
  tasks:

  - packet_device:
      project_id: <your_project_id>
      hostnames: myserver
      state: rebooted

「device_ids」パラメーターで特定の Packet デバイスを識別することもできます。デバイスの UUID は、Packet ポータル または CLI を使用して確認できます。以下の Playbook は、「device_ids」フィールドを使用して Packet デバイスを削除します。

# playbook_remove.yml

- name: remove a device
  hosts: localhost
  tasks:

  - packet_device:
      project_id: <your_project_id>
      device_ids: <myserver_device_id>
      state: absent

より複雑な Playbook

この例では、`ユーザーデータ<https://support.packet.com/kb/articles/user-data>`_ で CoreOS クラスターを作成します。

CoreOS クラスターは、クラスター内の他のサーバーの検出に etcd を使用します。サーバーをプロビジョニングする前に、クラスターの検出トークンを生成する必要があります。

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

以下の Playbook は、SSH キー、3 台の Packet サーバーを作成し、SSH の準備ができるまで (または 5 分経過するまで) 待ちます。ansible-playbook を実行する前に、「user_data」の検出トークン URL と「project_id」を置き換えてください。また、「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 の再実行後も同じになります。したがって、Playbook で packet_sshkey モジュール呼び出しを保持できます。公開鍵がすでに Packet アカウントにある場合、呼び出しは機能しません。

次のモジュール呼び出しは、「project_id」パラメーターで識別されるプロジェクトの 3 Packet タイプ 0 (「plan」パラメーターで指定) サーバーをプロビジョニングします。サーバーはすべて CoreOS ベータでプロビジョニングされ (「operating_system」パラメーター)、「user_data」パラメーターに渡される cloud-config ユーザーデータでカスタマイズされます。

packet_device モジュールには、待機する IP アドレスのバージョンを指定するために使用される wait_for_public_IPv があります (有効な値は、IPv4 または IPv6 である 4 または 6)。これが指定されている場合、Ansible はデバイスの GET API 呼び出しに指定バージョンのインターネットルーティング可能な IP アドレスが含まれるまで待機します。後続のモジュール呼び出しで作成されたデバイスの IP アドレスを参照する場合は、packet_device モジュール呼び出しで wait_for_public_IPv パラメーターまたは state: active を使用することが推奨されます。

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

いくつかのデバイスを作成したら、動的インベントリースクリプトを利用できます。

動的インベントリースクリプト

動的インベントリースクリプトは、ホストの一覧に Packet API をクエリーし、これを Ansible に公開して、Packet デバイスを簡単に識別し、操作できるようにします。これは、contrib/inventory/packet_net.py の Ansible の git リポジトリーにあります。

インベントリースクリプトは ini ファイル で設定可能です。

インベントリースクリプトを使用する場合には、最初に Packet API トークンを 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 またはホスト名を持つ 1 項目グループもあります。

Playbook でグループを対象にすることができるようになりました。以下の 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 までご連絡ください。