Ubuntu 16.04でAnsible 2.0でDigitalOcean API v2を使用する方法

前書き

Ansible 2.0はhttps://developers.digitalocean.com/documentation/v2/[DigitalOcean APIのバージョン2]のサポートを提供します。つまり、Ansibleを使用して、Webアプリケーションをプロビジョニングするだけでなく、自動的にドロップレット。

DigitalOceanはSSHキーのセットアップとDropletの作成のためのシンプルなWebインターフェイスを提供しますが、新しいサーバーをプロビジョニングするたびに実行する必要がある手動プロセスです。 アプリケーションが多数のサーバーを含むように拡張され、オンデマンドで拡大および縮小する機能が必要な場合、各サーバーのアプリケーション展開スクリプトを手動で作成および構成する必要はありません。

Ansibleなどのプロビジョニングツールを使用する利点は、このプロセスを完全に自動化できることと、単一のコマンドを実行するだけで簡単に開始できることです。 このチュートリアルでは、DigitalOcean API v2のAnsibleのサポートの使用方法を例で示します。

特に、このチュートリアルでは、DOアカウントに新しいSSHキーを設定し、2つの異なるドロップレットをプロビジョニングして、Webアプリケーションのデプロイに使用できるようにするプロセスについて説明します。 このチュートリアルに従うと、これらのタスクを変更して、既存のアプリケーション展開スクリプトに統合できるようになります。

前提条件

このチュートリアルは基本的なAnsibleの知識に基づいているため、Ansibleを初めて使用する場合は、https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-ansible-on-ubuntu-16を読むことができます。 -04#how-does-ansible-work [Ansibleインストールチュートリアルのこのセクション]最初に。

このチュートリアルを実行するには、次のものが必要です。

  • sudo non-root userを持つUbuntu 16.04ドロップレット。

  • サーバーにインストールされたAnsibleは、https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-ansible-on-ubuntu-16-04#install-ansibleに従って設定できます。 -on-ubuntu-1404 [以前のAnsibleチュートリアルのこのステップ]。

  • 読み取りと書き込みhttps://www.digitalocean.com/community/tutorials/how-to-use-the-digitalocean-api-v2#how-to-generate-a-personal-access-token [パーソナルアクセストークン] API用。 トークンは安全な場所に書き留めてください。このチュートリアルの後半で必要になります。

ステップ1-Ansibleの構成

このステップでは、DigitalOcean APIと通信するようにAnsibleを構成します。

通常、AnsibleはSSHを使用して異なるサーバーに接続し、コマンドを実行するだけです。 つまり、Ansibleの使用を開始するために必要な構成は、一般的にすべてのモジュールの標準です。 ただし、DigitalOcean APIとの通信は単なるSSHシェルコマンドではないため、少し追加のセットアップを行う必要があります。 + dopy +DigitalOcean API Python Wrapper)Pythonモジュールは、AnsibleがAPIと通信できるようにするものです。

`+ dopy `をインストールするには、まずPythonパッケージマネージャー ` pip +`をインストールします。

sudo apt-get install python-pip

次に、 `+ pip `を使用して ` dopy +`をインストールします。

sudo pip install dopy

次に、作業を整理するために作業する新しいディレクトリを作成し、基本的なAnsible構成ファイルを設定します。

デフォルトでは、Ansibleは `+ / etc / ansible / hosts +`にあるhostsファイルを使用します。このファイルには、管理しているすべてのサーバーが含まれています。 このファイルは一部のユースケースには適していますが、グローバルです。 これはグローバル構成であり、一部のユースケースでは問題ありませんが、このチュートリアルではローカルホストファイルを使用します。 このようにして、AnsibleのDO APIサポートについて学び、テストしている間に、既存の構成を誤って壊すことはありません。

新しいディレクトリを作成して移動します。このディレクトリは、このチュートリアルの残りの部分で使用します。

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

`+ [defaults] `グループで ` hostfile `オプションを設定すると、グローバルなファイルの代わりに特定のホストファイルを使用するようにAnsibleに指示します。 この ` ansible.cfg `は、同じディレクトリ内で ` hosts +`というホストファイルを探すようAnsibleに指示します。

次に、 `+ hosts +`ファイルを作成します。

nano hosts

このチュートリアルではDigitalOcean APIのみを扱うため、Ansibleに `+ localhost `で実行するように指示できます。これにより、物事がシンプルになり、リモートホストに接続する必要がなくなります。 これを行うには、Ansibleに「 localhost 」を使用するように指示し、「 ansible_connection 」を「 local 」として指定します。 以下のコードを ` hosts +`に貼り付け、ファイルを保存して閉じます。

更新されたホストファイル

[digitalocean]
localhost ansible_connection=local

最後に、前提条件で作成されたAPIトークンを使用して、AnsibleがDigitalOcean APIと通信できるようにします。 APIトークンについてAnsibleに伝える方法は3つあります。

  1. `+ api_token +`パラメーターを使用して、各DigitalOceanタスクで直接提供します。

  2. プレイブックまたはホストファイルで変数として定義し、その変数を `+ api_token +`パラメーターに使用します。

  3. `+ DO_API_TOKEN `または ` DO_API_KEY +`として、環境変数としてエクスポートします。

オプション1は最も直接的なアプローチであり、変数を作成したくない場合は魅力的に聞こえるかもしれません。 ただし、APIトークンは、使用されている各タスクにコピーする必要があることを意味します。 さらに重要なことは、これが変更された場合、すべてのインスタンスを見つけてすべて置き換える必要があることを意味します。

オプション2では、オプション1と同様に、プレイブック内でAPIトークンを直接設定できます。 オプション1とは異なり、変数を使用して1か所で定義するだけです。これは、より便利で更新が容易です。 最も簡単なアプローチであるため、このチュートリアルではオプション2を使用します。

ただし、オプション3がAPIトークンを保護するために使用するのに最適な方法であることは、価値がありません。誤ってAPIトークンをリポジトリ(誰かと共有される可能性があります)にコミットするのがはるかに難しくなります。 これにより、トークンをシステムレベルで構成し、それぞれにトークンを含めることなく、異なるプレイブック間で動作することができます。

`+ digitalocean.yml +`という基本的なプレイブックを作成します。

nano digitalocean.yml

次のコードをファイルに貼り付けて、APIトークンを置き換えてください。

更新されたdigitalocean.yml

---
- hosts: digitalocean

 vars:
   do_token:

 tasks:

このファイルは次のステップで引き続き作業するため、エディターでこのファイルを開いたままにしておくことができます。

ステップ2-SSHキーのセットアップ

このステップでは、サーバー上に新しいSSHキーを作成し、Ansibleを使用してDigitalOceanアカウントに追加します。

最初に行う必要があるのは、ユーザーにSSHキーペアがあることを確認することです。SSHキーペアをDigitalOceanにプッシュして、新しいDropletにデフォルトでインストールできるようにします。 これはコマンドラインから簡単に実行できますが、Ansibleのhttp://docs.ansible.com/ansible/user_module.html[users]モジュールを使用しても簡単に実行できます。 Ansibleを使用すると、キーが使用される前にキーが存在するようになり、異なるホストでプレイブックを実行する際の問題を回避できるという利点もあります。

プレイブックで、以下の `+ 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 * `に一致するすべてのファイルがリストされます。 SSHキーが存在することを示す、「 id_rsa 」と「 id_rsa.pub +」が一覧表示されます。

次に、キーを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 +`モジュールのさまざまなオプションを使用しています。

  • 状態-これは、存在、アクティブ、不在、または削除されます。 この場合、アカウントにSSHキーが存在するようにするため、「+ present +」が必要です。

  • コマンド-これは、dropletまたはsshです。 アカウント内のSSHキーの状態を管理できる「+ ssh +」が必要です。

  • 名前-これはSSHキーを保存するための名前です。これは一意である必要があり、APIおよびWebインターフェイスを介してキーを識別するために使用されます。

  • * ssh_pub_key *-これはSSH公開キーです。これは、ユーザーモジュールを使用して存在を保証したキーになります。

  • * api_token *-これは変数としてアクセス可能なDigitalOcean APIトークンです( + vars +`セクションで定義されている `+ do_token +)。

次に、プレイブックを実行します。

ansible-playbook digitalocean.yml

出力は次のようになります。

出力

. . .

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

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

それが終了したら、コントロールパネルに移動し、設定(ギアメニューから)、セキュリティ(左側の*ユーザー*カテゴリ)の順にクリックして、DigitalOceanアカウントにSSHキーが存在することを手動で確認できます。サイドバー)。 * SSH Keys *の下に新しいキーが表示されます。

ステップ3-新しいドロップレットの作成

このステップでは、新しいドロップレットを作成します。

ステップ2で「+ digital_ocean +」モジュールについて簡単に触れました。 このステップでは、このモジュールに別のオプションセットを使用します。

  • * command *-前の手順で `` + ssh + `を使用してこのオプションを使用しました。今回は、このモジュールでDropletsを管理するために `+ droplet +`で使用します。

  • 状態-前のステップでもこれを使用しました。ここでは、ドロップレットの状態を表します。これは「+ present +」になりたいものです。

  • * image_id *-これは、 `+ ubuntu-16-04-x64 +`のような、新しいドロップレットに使用する画像です。

  • * name *-これは、ドロップレットを作成するときに使用するホスト名です。

  • * region_id *-これは、 `+ NYC3 +`のように、ドロップレットを作成する領域です。

  • * size_id *-これは、作成するドロップレットのサイズです( `+ 512mb +`など)。

  • * sshkeyids *-これは、サーバーの作成時にサーバーに設定されるSSHキーIDです。

このチュートリアルで扱っているオプション以外にも多くのオプションがあります(すべてAnsibleのドキュメントページにあります)が、これらのオプションをガイドとして使用して、新しいタスクを作成できます。

編集用にプレイブックを開きます。

nano digitalocean.yml

下の赤で強調表示されている新しいタスクでPlaybookを更新し、ファイルを保存して閉じます。 サイズ、地域、画像などのオプションをアプリケーションに合わせて変更できます。 以下のオプションは、前のステップで作成したSSHキーを使用して* droplet-one *という名前の512MB Ubuntu 16.04サーバーを作成します。

更新されたdigitalocean.yml

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

`+ {{my_ssh_key.ssh_key.id}} +`を使用して、以前に設定されたSSHキーのIDを取得し、それを新しいドロップレットに渡すことに注意してください。 これは、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は、返信メッセージで新しいDropletのIPアドレスを提供しました。 実行されていることを確認するには、SSHを使用して直接ログインします。

これにより、新しいサーバーに接続されます(手順2でAnsibleサーバーに作成したSSHキーを使用)。 その後、 `+ CTRL + D +`を押して終了してAnsibleサーバーに戻ることができます。

ステップ4-液滴の存在を確認する

このステップでは、べき等の概念と、AnsibleでDropletをプロビジョニングする方法との関係について説明します。

Ansibleは、べき等の概念を使用して動作することを目指しています。 これは、同じタスクを複数回実行できることを意味し、変更は必要な場合にのみ行う必要があります-通常は初めて実行する場合です。 このアイデアは、サーバーのプロビジョニング、パッケージのインストール、およびその他のサーバー管理にうまく対応しています。

プレイブックを再度実行する場合(まだ実行しないでください!)、現在の構成を考慮して、先に進み、「+ droplet-one 」とも呼ばれる2番目のドロップレットをプロビジョニングします。 もう一度実行すると、3番目のドロップレットが作成されます。 これは、DigitalOceanが同じ名前の複数のドロップレットを許可するという事実によるものです。 これを避けるために、 ` unique_name +`パラメーターを使用できます。

`+ unique_name +`パラメーターは、サーバーに一意のホスト名が必要であることをAnsibleとDigitalOceanに伝えます。 つまり、プレイブックを再度実行すると、べき等性が尊重され、既にプロビジョニングされたドロップレットが考慮されるため、同じ名前の2番目のサーバーは作成されません。

編集用にプレイブックを開きます。

nano digitalocean.yml

`+ unique_name +`パラメーターを追加します:

更新されたdigitalocean.yml

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

     size_id=512mb
. . .

プレイブックを保存して実行します。

ansible-playbook digitalocean.yml

出力の結果、タスクは変更されませんが、IPアドレスを含むデバッグ出力が表示されたままになります。 DigitalOceanアカウントを確認すると、プロビジョニングされた* droplet-one *ドロップレットが1つだけであることがわかります。

ステップ5-2番目のドロップレットの作成

この手順では、既存の構成を複製して、個別のドロップレットをプロビジョニングします。

別のドロップレットをプロビジョニングするには、最初のドロップレットから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-16-04-x64
     ssh_key_ids={{ my_ssh_key.ssh_key.id }}
     api_token={{ do_token }}

   register:

 - debug: msg="IP is "

プレイブックを保存して実行します。

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 +`モジュールがデバッグに役立つ追加情報を出力するためです。これは、このモジュールで登録済み変数を使用することの小さな欠点です。

それとは別に、2番目のDropletがプロビジョニングされ、1番目のDropletがすでに実行されていたことがわかります。 Ansibleのみを使用して2つのDigitalOcean Dropletsをプロビジョニングしました!

ドロップレットの削除も同様に簡単です。 タスクの状態パラメーターは、ドロップレットの状態をAnsibleに伝えます。 これを「+ present 」に設定すると、ドロップレットが存在することが保証され、まだ存在しない場合は作成されます。これを「 absent 」に設定すると、指定した名前のドロップレットが存在しないことが保証され、指定した名前に一致するドロップレットが削除されます(「 unique_name +」が設定されている場合)。

このチュートリアルで作成した2つのサンプルドロップレットを削除する場合は、作成タスクの状態を「+ absent +」に変更して、プレイブックを再実行してください。

更新されたdigitalocean.yml

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

プレイブックを再実行する前に、デバッグ行を削除することもできます。 削除しない場合、ドロップレットは削除されますが、debugコマンドからエラーが表示されます(返されるIPアドレスがないため)。

ansible-playbook digitalocean.yml

これで、2つのサンプルドロップレットが削除されます。

結論

Ansibleは、非常に強力で非常に柔軟なプロビジョニングツールです。 標準のAnsibleコンセプトとビルトインモジュールのみを使用して、DigitalOcean APIを使用してドロップレットをプロビジョニング(およびプロビジョニング解除)することがどれほど簡単かを見てきました。

`+ present `に設定された状態パラメーターは、ドロップレットの状態をAnsibleに指示します。 これを「 present 」に設定すると、ドロップレットが確実に存在し、まだ存在しない場合は作成されます。 ` absent `に設定すると、指定した名前のドロップレットが存在しないことを確認するようAnsibleに指示し、指定した名前に一致するドロップレットを削除します( ` unique_name +`が設定されている場合)。

管理するドロップレットの数が増えると、プロセスを自動化できるため、自動プロセスの一部としてドロップレットを作成、設定、および破棄する時間が節約されます。 このチュートリアルの例を調整および拡張して、セットアップに合わせてプロビジョニングスクリプトをカスタマイズできます。

前の投稿:Ubuntu 14.04にビッグデータ対応のApache Accumulo NoSQLデータベースをインストールする方法
次の投稿:本番用の構築:Webアプリケーション—展開