序章

Ansible は、リモートサーバーのセットアップと保守のタスクを容易にする最新の構成管理ツールです。

このチートシートスタイルガイドは、Ansibleを操作するときに一般的に使用されるコマンドとプラクティスへのクイックリファレンスを提供します。 Ansibleの概要とインストールおよび構成方法については、 Ubuntu20.04にAnsibleをインストールおよび構成する方法に関するガイドを確認してください。

このガイドの使用方法:

  • このガイドは、自己完結型のコマンドラインスニペットを含むチートシート形式です。
  • 完了しようとしているタスクに関連するセクションにジャンプします。
  • このガイドのコマンドにhighlighted textが表示されている場合、このテキストは独自のインベントリのホスト、ユーザー名、およびIPアドレスを参照している必要があることに注意してください。

Ansible用語集

次のAnsible固有の用語は、このガイド全体で主に使用されています。

  • Control Machine / Node :Ansibleがインストールされ、ノード上でコマンドを接続して実行するように構成されているシステム。
  • ノード:Ansibleによって制御されるサーバー。
  • インベントリファイル:Ansibleが制御するサーバーに関する情報を含むファイル。通常は/etc/ansible/hostsにあります。
  • Playbook :リモートサーバーで実行される一連のタスクを含むファイル。
  • Role :Webサーバーのインストールなどの目標に関連するプレイブックやその他のファイルのコレクション。
  • Play :完全なAnsibleの実行。 play は、エントリポイントとして機能する単一のプレイブックから含まれる複数のプレイブックとロールを持つことができます。

これらのコマンドの実際の例が必要な場合は、 Ubuntu20.04でAnsibleを使用してサーバーの初期設定を自動化する方法に関するガイドを参照してください。 ノードとして使用するには、少なくとも1台のリモートサーバーが必要です。

ノードへの接続のテスト

Ansibleがノードに接続してコマンドとプレイブックを実行できることをテストするには、次のコマンドを使用できます。

  1. ansible all -m ping

pingモジュールは、AnsibleがリモートサーバーでPythonスクリプトを実行できるかどうかのテストに加えて、インベントリファイルで定義されたノードに接続するための有効な資格情報があるかどうかをテストします。 pong の返信は、Ansibleがそのノードでコマンドとプレイブックを実行する準備ができていることを意味します。

別のユーザーとして接続する

デフォルトでは、Ansibleは、対応するSSHキーペアを使用して、現在のシステムユーザーとしてノードに接続しようとします。 別のユーザーとして接続するには、-uフラグと目的のユーザーの名前を指定してコマンドを追加します。

  1. ansible all -m ping -u sammy

同じことがansible-playbookにも当てはまります。

  1. ansible-playbook myplaybook.yml -u sammy

カスタムSSHキーの使用

カスタムSSHキーを使用してリモートサーバーに接続している場合は、実行時に--private-keyオプションを使用して提供できます。

  1. ansible all -m ping --private-key=~/.ssh/custom_id

このオプションは、ansible-playbookにも有効です。

  1. ansible-playbook myplaybook.yml --private-key=~/.ssh/custom_id

パスワードベースの認証の使用

ノードに接続するためにパスワードベースの認証を使用する必要がある場合は、オプション--ask-passをAnsibleコマンドに追加する必要があります。

これにより、Ansibleは、接続しようとしているリモートサーバー上のユーザーのパスワードの入力を求めます。

  1. ansible all -m ping --ask-pass

このオプションは、ansible-playbookにも有効です。

  1. ansible-playbook myplaybook.yml --ask-pass

sudoパスワードの提供

リモートユーザーがsudoコマンドを実行するためにパスワードを提供する必要がある場合は、オプション--ask-become-passをAnsibleコマンドに含めることができます。 これにより、リモートユーザーのsudoパスワードを入力するように求められます。

  1. ansible all -m ping --ask-become-pass

このオプションは、ansible-playbookにも有効です。

  1. ansible-playbook myplaybook.yml --ask-become-pass

カスタムインベントリファイルの使用

デフォルトのインベントリファイルは通常/etc/ansible/hostsにありますが、-iオプションを使用して、Ansibleコマンドとプレイブックを実行するときにカスタムインベントリファイルを指すこともできます。 Ansibleは、動的インベントリファイルを構築するためのインベントリスクリプトもサポートしています。これは、サーバーが頻繁に作成および破棄され、インベントリが変動する場合に使用します。 カスタムインベントリファイルは、Gitなどのバージョン管理システムに含めることができるプロジェクトごとのインベントリを設定するのに役立ちます。

  1. ansible all -m ping -i my_custom_inventory

同じオプションがansible-playbookにも有効です。

  1. ansible-playbook myplaybook.yml -i my_custom_inventory

アドホックコマンドの実行

ノードでコマンドを実行するには、-aオプションに続けて、実行するコマンドを引用符で囲んで使用します。

これにより、インベントリ内のすべてのノードでuname -aが実行されます。

  1. ansible all -a "uname -a"

オプション-mを使用してAnsibleモジュールを実行することもできます。 次のコマンドは、インベントリからserver1にパッケージvimをインストールします。

  1. ansible server1 -m apt -a "name=vim"

ノードに変更を加える前に、ドライランを実行して、サーバーがコマンドによってどのように影響を受けるかを予測できます。 これは、--checkオプションを含めることで実行できます。

  1. ansible server1 -m apt -a "name=vim" --check

プレイブックの実行

プレイブックを実行し、その中で定義されているすべてのタスクを実行するには、ansible-playbookコマンドを使用します。

  1. ansible-playbook myplaybook.yml

プレイブックのデフォルトのhostsオプションを上書きし、実行を特定のグループまたはホストに制限するには、コマンドにオプション-lを含めます。

  1. ansible-playbook -l server1 myplaybook.yml

演劇に関する情報の入手

オプション--list-tasksは、リモートサーバーに変更を加えることなくプレイによって実行されるすべてのタスクを一覧表示するために使用されます。

  1. ansible-playbook myplaybook.yml --list-tasks

同様に、リモートサーバーでタスクを実行せずに、プレイの影響を受けるすべてのホストを一覧表示することができます。

  1. ansible-playbook myplaybook.yml --list-hosts

タグを使用して、プレイの実行を制限できます。 プレイで使用可能なすべてのタグを一覧表示するには、オプション--list-tagsを使用します。

  1. ansible-playbook myplaybook.yml --list-tags

プレイブックの実行の制御

オプション--start-at-taskを使用して、プレイブックの新しいエントリポイントを定義できます。 その後、Ansibleは指定されたタスクの前にあるものをすべてスキップし、その時点から残りのプレイを実行します。 このオプションには、引数として有効なタスク名が必要です。

  1. ansible-playbook myplaybook.yml --start-at-task="Set Up Nginx"

特定のタグに関連付けられたタスクのみを実行するには、オプション--tagsを使用できます。 たとえば、nginxまたはmysqlのタグが付けられたタスクのみを実行する場合は、次を使用できます。

  1. ansible-playbook myplaybook.yml --tags=mysql,nginx

特定のタグの下にあるすべてのタスクをスキップする場合は、--skip-tagsを使用します。 次のコマンドは、myplaybook.ymlを実行し、mysqlとしてタグ付けされたすべてのタスクをスキップします。

  1. ansible-playbook myplaybook.yml --skip-tags=mysql

AnsibleVaultを使用して機密データを保存する

Ansibleプレイブックがパスワード、APIキー、クレデンシャルなどの機密データを扱う場合は、暗号化メカニズムを使用してそのデータを安全に保つことが重要です。 Ansibleは、ファイルと変数を暗号化するためのansible-vaultを提供します。

バイナリファイルだけでなくAnsibleデータファイルも暗号化できますが、機密データを含む可変ファイルの暗号化にはansible-vaultを使用するのが一般的です。 このツールを使用してファイルを暗号化した後は、ファイルを最初に暗号化したときに定義された関連するパスワードを指定することによってのみ、その内容を実行、編集、または表示できます。

新しい暗号化ファイルの作成

次のコマンドを使用して、新しい暗号化されたAnsibleファイルを作成できます。

  1. ansible-vault create credentials.yml

このコマンドは、次のアクションを実行します。

  • まず、新しいパスワードの入力を求められます。 編集、表示、またはこれらの値を使用してプレイブックやコマンドを実行するためだけに使用する場合でも、ファイルの内容にアクセスするときは常にこのパスワードを入力する必要があります。
  • 次に、デフォルトのコマンドラインエディタが開き、ファイルに目的の内容を入力できるようになります。
  • 最後に、編集が完了すると、ansible-vaultはファイルを暗号化されたデータとして保存します。

既存のAnsibleファイルの暗号化

既存のAnsibleファイルを暗号化するには、次の構文を使用できます。

  1. ansible-vault encrypt credentials.yml

これにより、ファイルcredentials.ymlにアクセスするたびに入力する必要のあるパスワードの入力を求められます。

暗号化されたファイルの内容の表示

以前にansible-vaultで暗号化されたファイルの内容を表示する必要があり、その内容を変更する必要がない場合は、次を使用できます。

  1. ansible-vault view credentials.yml

これにより、ansible-vaultでファイルを最初に暗号化したときに選択したパスワードを入力するように求められます。

暗号化されたファイルの編集

以前にAnsibleVaultで暗号化されたファイルの内容を編集するには、次のコマンドを実行します。

  1. ansible-vault edit credentials.yml

これにより、ファイルcredentials.ymlansible-vaultで最初に暗号化するときに選択したパスワードを入力するように求められます。 パスワードの検証後、デフォルトのコマンドラインエディタがファイルの暗号化されていない内容で開き、変更を加えることができます。 終了したら、通常どおりにファイルを保存して閉じることができ、更新されたコンテンツは暗号化されたデータとして保存されます。

暗号化されたファイルの復号化

以前にansible-vaultで暗号化されていたファイルを、暗号化されていないバージョンに永続的に戻す場合は、次の構文を使用して行うことができます。

  1. ansible-vault decrypt credentials.yml

これにより、ファイルcredentials.ymlansible-vaultで最初に暗号化したときに使用したものと同じパスワードを入力するように求められます。 パスワードの検証後、ファイルの内容は暗号化されていないデータとしてディスクに保存されます。

複数のVaultパスワードの使用

Ansibleは、異なるボールトIDでグループ化された複数のボールトパスワードをサポートします。 これは、開発、テスト、本番環境など、さまざまな環境専用のボールトパスワードが必要な場合に役立ちます。

カスタムボールトIDを使用して新しい暗号化ファイルを作成するには、--vault-idオプション、ラベル、およびansible-vaultがそのボールトのパスワードを見つけることができる場所を含めます。 ラベルは任意の識別子にすることができ、場所はpromptのいずれかです。これは、コマンドがパスワードの入力を求めるプロンプトを表示するか、パスワードファイルへの有効なパスを指定する必要があることを意味します。

  1. ansible-vault create --vault-id dev@prompt credentials_dev.yml

これにより、promptをパスワードソースとして使用するdevという名前の新しいボールトIDが作成されます。 この方法をグループ変数ファイルと組み合わせることで、アプリケーション環境ごとに個別のansibleボールトを作成できます。

  1. ansible-vault create --vault-id prod@prompt credentials_prod.yml

devprodをボールトIDとして使用して、環境ごとに個別のボールトを作成する方法を示しましたが、必要な数のボールトを作成でき、任意の識別子を使用できます。ボールトIDとしての選択。

これらのファイルを表示、編集、または復号化するには、ansible-vaultコマンドとともに同じボールトIDとパスワードソースを提供する必要があります。

  1. ansible-vault edit credentials_dev.yml --vault-id dev@prompt

パスワードファイルの使用

サードパーティのツールを使用してAnsibleでサーバーをプロビジョニングするプロセスを自動化する必要がある場合は、ボールトパスワードの入力を求められることなく提供する方法が必要になります。 これは、パスワードファイルansible-vaultを使用して行うことができます。

パスワードファイルは、プレーンテキストファイルまたは実行可能スクリプトにすることができます。 ファイルが実行可能スクリプトの場合、このスクリプトによって生成された出力がボールトパスワードとして使用されます。 それ以外の場合、ファイルの生の内容がボールトパスワードとして使用されます。

ansible-vaultでパスワードファイルを使用するには、vaultコマンドのいずれかを実行するときにパスワードファイルへのパスを指定する必要があります。

  1. ansible-vault create --vault-id dev@path/to/passfile credentials_dev.yml

Ansibleは、入力パスワードが同じである限り、promptまたはパスワードソースとしてパスワードファイルを使用して暗号化されたコンテンツを区別しません。 実際には、これは、promptを使用してファイルを暗号化し、後でパスワードファイルを使用してpromptメソッドで使用したものと同じパスワードを保存しても問題がないことを意味します。 逆もまた真です。パスワードファイルを使用してコンテンツを暗号化し、後でpromptメソッドを使用して、Ansibleによってプロンプトが表示されたときに同じパスワードを提供できます。

柔軟性とセキュリティを拡張するために、ボールトのパスワードをプレーンテキストファイルに保存する代わりに、Pythonスクリプトを使用して他のソースからパスワードを取得できます。 公式のAnsibleリポジトリには、プロジェクトの特定のニーズに合ったカスタムスクリプトを作成するときに参照できるボールトスクリプトのいくつかの例が含まれています。

AnsibleVaultを介して暗号化されたデータを使用してPlaybookを実行する

以前にansible-vaultで暗号化されたデータを使用するプレイブックを実行する場合は常に、プレイブックコマンドにボールトパスワードを指定する必要があります。

このプレイブックで使用されるデータを暗号化するときにデフォルトオプションとpromptパスワードソースを使用した場合は、オプション--ask-vault-passを使用して、Ansibleにパスワードの入力を求めるプロンプトを表示できます。

  1. ansible-playbook myplaybook.yml --ask-vault-pass

パスワードの入力を求める代わりにパスワードファイルを使用した場合は、代わりにオプション--vault-password-fileを使用する必要があります。

  1. ansible-playbook myplaybook.yml --vault-password-file my_vault_password.py

ボールトIDで暗号化されたデータを使用している場合は、最初にデータを暗号化したときに使用したものと同じボールトIDとパスワードソースを提供する必要があります。

  1. ansible-playbook myplaybook.yml --vault-id dev@prompt

ボールトIDでパスワードファイルを使用する場合は、パスワードソースとしてラベルの後にパスワードファイルへのフルパスを指定する必要があります。

  1. ansible-playbook myplaybook.yml --vault-id dev@vault_password.py

プレイで複数のボールトを使用する場合は、それぞれに--vault-idパラメーターを順不同で指定する必要があります。

  1. ansible-playbook myplaybook.yml --vault-id dev@vault_password.py --vault-id test@prompt --vault-id ci@prompt

デバッグ

Ansibleコマンドやプレイブックの実行中にエラーが発生した場合は、問題に関する詳細情報を取得するために、出力の詳細度を上げることをお勧めします。 これを行うには、コマンドに-vオプションを含めます。

  1. ansible-playbook myplaybook.yml -v

詳細が必要な場合は、-vvvを使用できます。これにより、出力の冗長性が向上します。 Ansibleを介してリモートノードに接続できない場合は、-vvvvを使用して接続のデバッグ情報を取得します。

  1. ansible-playbook myplaybook.yml -vvvv

結論

このガイドでは、ノードでリモートコマンドを実行する方法や、さまざまなカスタム設定を使用してプレイブックを実行する方法など、サーバーをプロビジョニングするときに使用する可能性のある最も一般的なAnsibleコマンドのいくつかについて説明します。

Ansibleワークフローに役立つと思われるコマンドのバリエーションとフラグは他にもあります。 使用可能なすべてのオプションの概要を取得するには、helpコマンドを使用できます。

  1. ansible --help

Ansibleとそのすべての使用可能なコマンドおよび機能のより包括的なビューが必要な場合は、公式のAnsibleドキュメントを参照してください。

Ansibleの別の実用的な例をご覧になりたい場合は、Ubuntu20.04にAnsibleを使用してDockerをインストールおよびセットアップする方法に関するガイドをご覧ください。