Ansibleの使用方法:参考ガイド

はじめに

Ansibleは、リモートサーバーのセットアップとメンテナンスを容易にする現代の構成管理ツールです。

このチートシート形式のガイドでは、Ansibleを使用する際によく使用されるコマンドやプラクティスについてのクイックリファレンスを提供しています。Ansibleの概要やインストール、設定方法については、当社のガイド「Ubuntu 20.04にAnsibleをインストールおよび構成する方法」をご覧ください。

このガイドの使用方法:

  • このガイドはチートシート形式で、独立したコマンドラインスニペットが含まれています。
  • 完了したいタスクに関連するセクションに移動してください。
  • このガイドのコマンドで強調表示されたテキストを見た場合、このテキストはあなた自身のインベントリからホスト、ユーザー名、IPアドレスを参照する必要があることに注意してください。

Ansible用語集

このガイド全体で広く使用されている以下のAnsible固有の用語があります:

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

これらのコマンドの実践例が必要な場合は、Ubuntu 20.04で初期サーバー設定を自動化する方法のガイドを参照してください。少なくとも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

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

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

これにより、Ansibleがリモートサーバーのユーザーのパスワードを要求します。

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

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

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

sudoパスワードの提供

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

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

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

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

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

デフォルトのインベントリファイルは通常/etc/ansible/hostsにありますが、Ansibleコマンドやプレイブックを実行する際にカスタムインベントリファイルを指定するために-iオプションを使用することもできます。 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"

また、Ansibleモジュールを-mオプションとともに実行することも可能です。次のコマンドは、インベントリ内の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

機密データを保存するためのAnsible Vaultの使用

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

Ansibleのデータファイルやバイナリファイルを暗号化することは可能ですが、機密データを含む変数ファイルを暗号化することが一般的です。このツールでファイルを暗号化した後は、ファイルを最初に暗号化したときに定義した関連するパスワードを提供することで、そのコンテンツを実行、編集、表示することができます。

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

次のコマンドを使用して、新しい暗号化された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 で暗号化したときに選択したパスワードを入力するように求められます。

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

以前に Ansible Vault で暗号化されたファイルの内容を編集するには、次のコマンドを実行してください:

  1. ansible-vault edit credentials.yml

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

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

以前に ansible-vault で暗号化されたファイルを永久に復号化したい場合は、次の構文を使用してください:

  1. ansible-vault decrypt credentials.yml

これにより、ファイル credentials.yml を最初に ansible-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として任意の識別子を使用することができます。

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

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

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

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

A password file can be a plain text file or an executable script. If the file is an executable script, the output produced by this script will be used as the vault password. Otherwise, the raw contents of the file will be used as vault password.

ansible-vaultとパスワードファイルを使用するには、ボールトコマンドを実行する際にパスワードファイルへのパスを提供する必要があります:

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

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

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

Ansible Vaultで暗号化されたデータを使用してPlaybookを実行する

Playbookを実行する際に、以前にansible-vaultで暗号化されたデータを使用する場合、Playbookコマンドにボールトパスワードを提供する必要があります。

このPlaybookで使用されるデータを暗号化する際にデフォルトのオプションと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のさらなる実践的な例をご覧になりたい場合は、Ubuntu 20.04にDockerをインストールして設定するためのAnsibleの使用方法ガイドをご覧ください。

Source:
https://www.digitalocean.com/community/tutorials/how-to-use-ansible-cheat-sheet-guide