Ansibleの使用方法:リファレンスガイド
序章
Ansible は、リモートサーバーのセットアップと保守のタスクを容易にする最新の構成管理ツールです。
このチートシートスタイルガイドは、Ansibleを操作するときに一般的に使用されるコマンドとプラクティスへのクイックリファレンスを提供します。 Ansibleの概要とインストールおよび構成方法については、 Ubuntu20.04にAnsibleをインストールおよび構成する方法に関するガイドを確認してください。
このガイドの使用方法:
- このガイドは、自己完結型のコマンドラインスニペットを含むチートシート形式です。
- 完了しようとしているタスクに関連するセクションにジャンプします。
- このガイドのコマンドに
highlighted text
が表示されている場合、このテキストは独自のインベントリのホスト、ユーザー名、およびIPアドレスを参照している必要があることに注意してください。
Ansible用語集
次のAnsible固有の用語は、このガイド全体で主に使用されています。
- Control Machine / Node :Ansibleがインストールされ、ノード上でコマンドを接続して実行するように構成されているシステム。
- Node :Ansibleによって制御されるサーバー。
- インベントリファイル:Ansibleが制御するサーバーに関する情報を含むファイル。通常は
/etc/ansible/hosts
にあります。 - Playbook :リモートサーバーで実行される一連のタスクを含むファイル。
- Role :Webサーバーのインストールなどの目標に関連するプレイブックやその他のファイルのコレクション。
- Play :完全なAnsibleの実行。 play は、エントリポイントとして機能する単一のプレイブックから含まれる複数のプレイブックとロールを持つことができます。
これらのコマンドの実際の例が必要な場合は、 Ubuntu20.04でAnsibleを使用してサーバーの初期設定を自動化する方法に関するガイドを参照してください。 ノードとして使用するには、少なくとも1台のリモートサーバーが必要です。
ノードへの接続のテスト
Ansibleがノードに接続してコマンドとプレイブックを実行できることをテストするには、次のコマンドを使用できます。
ansible all -m ping
ping
モジュールは、AnsibleがリモートサーバーでPythonスクリプトを実行できるかどうかのテストに加えて、インベントリファイルで定義されたノードに接続するための有効な資格情報があるかどうかをテストします。 pong の返信は、Ansibleがそのノードでコマンドとプレイブックを実行する準備ができていることを意味します。
別のユーザーとして接続する
デフォルトでは、Ansibleは、対応するSSHキーペアを使用して、現在のシステムユーザーとしてノードに接続しようとします。 別のユーザーとして接続するには、-u
フラグと目的のユーザーの名前を指定してコマンドを追加します。
ansible all -m ping -u sammy
同じことがansible-playbook
にも当てはまります。
ansible-playbook myplaybook.yml -u sammy
カスタムSSHキーの使用
カスタムSSHキーを使用してリモートサーバーに接続している場合は、実行時に--private-key
オプションを使用して提供できます。
ansible all -m ping --private-key=~/.ssh/custom_id
このオプションは、ansible-playbook
にも有効です。
ansible-playbook myplaybook.yml --private-key=~/.ssh/custom_id
パスワードベースの認証の使用
ノードに接続するためにパスワードベースの認証を使用する必要がある場合は、オプション--ask-pass
をAnsibleコマンドに追加する必要があります。
これにより、Ansibleは、接続しようとしているリモートサーバー上のユーザーのパスワードの入力を求めます。
ansible all -m ping --ask-pass
このオプションは、ansible-playbook
にも有効です。
ansible-playbook myplaybook.yml --ask-pass
sudo
パスワードの提供
リモートユーザーがsudo
コマンドを実行するためにパスワードを提供する必要がある場合は、オプション--ask-become-pass
をAnsibleコマンドに含めることができます。 これにより、リモートユーザーのsudoパスワードを入力するように求められます。
ansible all -m ping --ask-become-pass
このオプションは、ansible-playbook
にも有効です。
ansible-playbook myplaybook.yml --ask-become-pass
カスタムインベントリファイルの使用
デフォルトのインベントリファイルは通常/etc/ansible/hosts
にありますが、-i
オプションを使用して、Ansibleコマンドとプレイブックを実行するときにカスタムインベントリファイルを指すこともできます。 Ansibleは、動的インベントリファイルを構築するためのインベントリスクリプトもサポートしています。これは、サーバーが頻繁に作成および破棄され、インベントリが変動する場合に使用します。 カスタムインベントリファイルは、Gitなどのバージョン管理システムに含めることができるプロジェクトごとのインベントリを設定するのに役立ちます。
ansible all -m ping -i my_custom_inventory
同じオプションがansible-playbook
にも有効です。
ansible-playbook myplaybook.yml -i my_custom_inventory
ad-hocコマンドの実行
ノードでコマンドを実行するには、-a
オプションに続けて、実行するコマンドを引用符で囲んで使用します。
これにより、インベントリ内のすべてのノードでuname -a
が実行されます。
ansible all -a "uname -a"
オプション-m
を使用してAnsibleモジュールを実行することもできます。 次のコマンドは、インベントリからserver1
にパッケージvim
をインストールします。
ansible server1 -m apt -a "name=vim"
ノードに変更を加える前に、ドライランを実行して、サーバーがコマンドによってどのように影響を受けるかを予測できます。 これは、--check
オプションを含めることで実行できます。
ansible server1 -m apt -a "name=vim" --check
プレイブックの実行
プレイブックを実行し、その中で定義されているすべてのタスクを実行するには、ansible-playbook
コマンドを使用します。
ansible-playbook myplaybook.yml
プレイブックのデフォルトのhosts
オプションを上書きし、実行を特定のグループまたはホストに制限するには、コマンドにオプション-l
を含めます。
ansible-playbook -l server1 myplaybook.yml
演劇に関する情報の入手
オプション--list-tasks
は、リモートサーバーに変更を加えることなくプレイによって実行されるすべてのタスクを一覧表示するために使用されます。
ansible-playbook myplaybook.yml --list-tasks
同様に、リモートサーバーでタスクを実行せずに、プレイの影響を受けるすべてのホストを一覧表示することができます。
ansible-playbook myplaybook.yml --list-hosts
タグを使用して、プレイの実行を制限できます。 プレイで使用可能なすべてのタグを一覧表示するには、オプション--list-tags
を使用します。
ansible-playbook myplaybook.yml --list-tags
プレイブックの実行の制御
オプション--start-at-task
を使用して、プレイブックの新しいエントリポイントを定義できます。 その後、Ansibleは指定されたタスクの前にあるものをすべてスキップし、その時点から残りのプレイを実行します。 このオプションには、引数として有効なタスク名が必要です。
ansible-playbook myplaybook.yml --start-at-task="Set Up Nginx"
特定のタグに関連付けられたタスクのみを実行するには、オプション--tags
を使用できます。 たとえば、nginx
またはmysql
のタグが付けられたタスクのみを実行する場合は、次を使用できます。
ansible-playbook myplaybook.yml --tags=mysql,nginx
特定のタグの下にあるすべてのタスクをスキップする場合は、--skip-tags
を使用します。 次のコマンドは、myplaybook.yml
を実行し、mysql
としてタグ付けされたすべてのタスクをスキップします。
ansible-playbook myplaybook.yml --skip-tags=mysql
AnsibleVaultを使用して機密データを保存する
Ansibleプレイブックがパスワード、APIキー、クレデンシャルなどの機密データを扱う場合は、暗号化メカニズムを使用してそのデータを安全に保つことが重要です。 Ansibleは、ファイルと変数を暗号化するためのansible-vault
を提供します。
バイナリファイルだけでなくAnsibleデータファイルも暗号化できますが、機密データを含む可変ファイルの暗号化にはansible-vault
を使用するのが一般的です。 このツールを使用してファイルを暗号化した後は、ファイルを最初に暗号化したときに定義された関連するパスワードを指定することによってのみ、その内容を実行、編集、または表示できます。
新しい暗号化ファイルの作成
次のコマンドを使用して、新しい暗号化されたAnsibleファイルを作成できます。
ansible-vault create credentials.yml
このコマンドは、次のアクションを実行します。
- まず、新しいパスワードの入力を求められます。 編集、表示、またはこれらの値を使用してプレイブックやコマンドを実行するためだけに使用する場合でも、ファイルの内容にアクセスするときは常にこのパスワードを入力する必要があります。
- 次に、デフォルトのコマンドラインエディタが開き、ファイルに目的の内容を入力できます。
- 最後に、編集が完了すると、
ansible-vault
はファイルを暗号化されたデータとして保存します。
既存のAnsibleファイルの暗号化
既存のAnsibleファイルを暗号化するには、次の構文を使用できます。
ansible-vault encrypt credentials.yml
これにより、ファイルcredentials.yml
にアクセスするたびに入力する必要のあるパスワードの入力を求められます。
暗号化されたファイルの内容の表示
以前にansible-vault
で暗号化されたファイルの内容を表示する必要があり、その内容を変更する必要がない場合は、次を使用できます。
ansible-vault view credentials.yml
これにより、ansible-vault
でファイルを最初に暗号化したときに選択したパスワードを入力するように求められます。
暗号化されたファイルの編集
以前にAnsibleVaultで暗号化されたファイルの内容を編集するには、次のコマンドを実行します。
ansible-vault edit credentials.yml
これにより、ファイルcredentials.yml
をansible-vault
で最初に暗号化するときに選択したパスワードを入力するように求められます。 パスワードの検証後、デフォルトのコマンドラインエディタがファイルの暗号化されていない内容で開き、変更を加えることができます。 終了したら、通常どおりにファイルを保存して閉じることができ、更新されたコンテンツは暗号化されたデータとして保存されます。
暗号化されたファイルの復号化
以前にansible-vault
で暗号化されていたファイルを、暗号化されていないバージョンに永続的に戻す場合は、次の構文を使用して行うことができます。
ansible-vault decrypt credentials.yml
これにより、ファイルcredentials.yml
をansible-vault
で最初に暗号化したときに使用したものと同じパスワードを入力するように求められます。 パスワードの検証後、ファイルの内容は暗号化されていないデータとしてディスクに保存されます。
複数のVaultパスワードの使用
Ansibleは、異なるボールトIDでグループ化された複数のボールトパスワードをサポートします。 これは、開発、テスト、実稼働環境など、さまざまな環境専用のボールトパスワードが必要な場合に役立ちます。
カスタムボールトIDを使用して新しい暗号化ファイルを作成するには、--vault-id
オプション、ラベル、およびansible-vault
がそのボールトのパスワードを見つけることができる場所を含めます。 ラベルは任意の識別子にすることができ、場所はprompt
のいずれかです。これは、コマンドがパスワードの入力を求めるプロンプトを表示するか、パスワードファイルへの有効なパスを指定する必要があることを意味します。
ansible-vault create --vault-id dev@prompt credentials_dev.yml
これにより、prompt
をパスワードソースとして使用するdevという名前の新しいボールトIDが作成されます。 この方法をグループ変数ファイルと組み合わせることで、アプリケーション環境ごとに個別のansibleボールトを作成できます。
ansible-vault create --vault-id prod@prompt credentials_prod.yml
devとprodをボールトIDとして使用して、環境ごとに個別のボールトを作成する方法を示しましたが、必要な数のボールトを作成でき、任意の識別子を使用できます。ボールトIDとしての選択。
これらのファイルを表示、編集、または復号化するには、ansible-vault
コマンドとともに同じボールトIDとパスワードソースを提供する必要があります。
ansible-vault edit credentials_dev.yml --vault-id dev@prompt
パスワードファイルの使用
サードパーティのツールを使用してAnsibleでサーバーをプロビジョニングするプロセスを自動化する必要がある場合は、ボールトパスワードの入力を求められることなく提供する方法が必要になります。 これは、パスワードファイルとansible-vault
を使用して行うことができます。
パスワードファイルは、プレーンテキストファイルまたは実行可能スクリプトにすることができます。 ファイルが実行可能スクリプトの場合、このスクリプトによって生成された出力がボールトパスワードとして使用されます。 それ以外の場合、ファイルの生の内容がボールトパスワードとして使用されます。
ansible-vault
でパスワードファイルを使用するには、vaultコマンドのいずれかを実行するときにパスワードファイルへのパスを指定する必要があります。
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にパスワードの入力を求めるプロンプトを表示できます。
ansible-playbook myplaybook.yml --ask-vault-pass
パスワードの入力を求める代わりにパスワードファイルを使用した場合は、代わりにオプション--vault-password-file
を使用する必要があります。
ansible-playbook myplaybook.yml --vault-password-file my_vault_password.py
ボールトIDで暗号化されたデータを使用している場合は、最初にデータを暗号化したときに使用したものと同じボールトIDとパスワードソースを提供する必要があります。
ansible-playbook myplaybook.yml --vault-id dev@prompt
ボールトIDでパスワードファイルを使用する場合は、パスワードソースとしてラベルの後にパスワードファイルへのフルパスを指定する必要があります。
ansible-playbook myplaybook.yml --vault-id dev@vault_password.py
プレイで複数のボールトを使用する場合は、それぞれに--vault-id
パラメーターを順不同で指定する必要があります。
ansible-playbook myplaybook.yml --vault-id dev@vault_password.py --vault-id test@prompt --vault-id ci@prompt
デバッグ
Ansibleコマンドやプレイブックの実行中にエラーが発生した場合は、問題に関する詳細情報を取得するために、出力の詳細度を上げることをお勧めします。 これを行うには、コマンドに-v
オプションを含めます。
ansible-playbook myplaybook.yml -v
詳細が必要な場合は、-vvv
を使用できます。これにより、出力の冗長性が向上します。 Ansibleを介してリモートノードに接続できない場合は、-vvvv
を使用して接続のデバッグ情報を取得します。
ansible-playbook myplaybook.yml -vvvv
結論
このガイドでは、サーバーのプロビジョニング時に使用する可能性のある最も一般的なAnsibleコマンドのいくつかについて説明します。たとえば、ノードでリモートコマンドを実行する方法や、さまざまなカスタム設定を使用してプレイブックを実行する方法などです。
Ansibleワークフローに役立つと思われるコマンドのバリエーションとフラグは他にもあります。 使用可能なすべてのオプションの概要を取得するには、helpコマンドを使用できます。
ansible --help
Ansibleとそのすべての利用可能なコマンドおよび機能のより包括的なビューが必要な場合は、公式のAnsibleドキュメントを参照してください。
Ansibleの別の実用的な例をご覧になりたい場合は、Ubuntu20.04にAnsibleを使用してDockerをインストールおよびセットアップする方法に関するガイドをご覧ください。