Playbook での Vault の使用¶
トピック
「Vault」は Ansible の機能で、Playbook またはロールで平文テキストとしてではなく、パスワードやキーの保護などの機密データを静止させて維持できます。この vault ファイルは、ソース制御に配布または配置することができます。
vault の内容は 2 種類あり、それぞれに使用法と制限があります。
Vault で暗号化が行われたファイル: | |
---|---|
|
|
Single で暗号化された変数: | |
|
Warning
- vault は、データを「静止させて」保護します。 復号すると、プレイおよびプラグインの作成者はシークレットの公開を防ぐことができます。 出力を非表示にする詳細は、「no_log」を参照してください。
この機能を有効にするには、コマンドラインツール ansible-vault を使用してファイルを編集し、コマンドラインフラグ --ask-vault-pass
、--vault-password-file
、または --vault-id
を使用します。ansible.cfg
ファイルを変更してパスワードファイルの場所を指定するか、常にパスワードを入力するように Ansible を設定することもできます。このオプションには、コマンドラインフラグの使用は必要ありません。
ベストプラクティスに関するアドバイスは、変数および Vault を参照してください。
vault を使用した Playbook の実行¶
vault で暗号化されたデータファイルが含まれる Playbook を実行するには、vault パスワードを指定する必要があります。
vault-password をインタラクティブに指定するには、以下を実行します。
ansible-playbook site.yml –ask-vault-pass
このプロンプトは、アクセスされる、vault で暗号化されたファイルを復号する (インメモリーのみ) ために使用されます。
または、パスワードはファイルまたはスクリプトで指定できます (スクリプトバージョンには Ansible 1.7 以降が必要です)。 このフラグを使用する場合は、ファイルのパーミッションで、他のユーザーが鍵にアクセスできないことを確認し、キーをソースコントロールに追加しないようにします。
ansible-playbook site.yml –vault-password-file ~/.vault_pass.txt
ansible-playbook site.yml –vault-password-file ~/.vault_pass.py
パスワードは、ファイル内に単一行として保存される文字列である必要があります。
フラットファイルの代わりにスクリプトを使用している場合は、そのスクリプトを実行ファイルとするマークが付いていて、パスワードが標準出力に出力されていることを確認します。 スクリプトでデータの入力を要求する必要がある場合は、プロンプトを標準エラーに送信できます。
Note
ANSIBLE_VAULT_PASSWORD_FILE
環境変数 (ANSIBLE_VAULT_PASSWORD_FILE=~/.vault_pass.txt
など) を設定することもできます。Ansible は、このファイル内のパスワードを自動的に検索します。
これは、Jenkins などの継続的な統合システムから Ansible を使用する場合に行うことができます。
--vault-password-file
オプションは、必要に応じて ansible-pull コマンドと併用することもできます。ただし、ノードにキーを配布する必要があるため、意図を理解してください。プッシュモードの場合は vault を使用することが意図されています。
複数の vault パスワード¶
Ansible 2.4 以降では、異なるパスワードで暗号化される複数の vault の概念に対応します。 異なる vault には、それを区別するためのラベルを指定できます (通常は dev、prod などの値)。
--ask-vault-pass
オプションおよび
--vault-password-file
オプションは、
任意の実行には、パスワードは 1 つだけ必要になる場合に限り使用できます。
または、--vault-id
オプションを使用してパスワードを入力し、
使用する vault ラベルを示します。これは、
複数の vault が 1 つのインベントリー内で使用される場合により明確になります。例:
「dev」パスワードの入力が求められるようにするには、以下を実行します。
ansible-playbook site.yml --vault-id dev@prompt
ファイルまたはスクリプトから「dev」パスワードを取得するには、以下を実行します。
ansible-playbook site.yml --vault-id dev@~/.vault_pass.txt
ansible-playbook site.yml --vault-id dev@~/.vault_pass.py
複数の vault パスワードが一回の実行に必要となる場合は、--vault-id
が、
複数回指定して、複数のパスワードを提供する場合に使用されます。 例:
ファイルから「dev」パスワードを読み取り、「prod」パスワードの入力を求められます。
ansible-playbook site.yml --vault-id dev@~/.vault_pass.txt --vault-id prod@prompt
--ask-vault-pass
オプションまたは
--vault-password-file
オプションを使用すると、パスワードのいずれかを指定できます。
これらを --vault-id
と混在させないようにする方が一般的には適切です。
Note
デフォルトでは、vault ラベル (dev、prod など)は単なるヒントです。Ansible は、 指定されたすべてのパスワードで各 vault を復号しようとします。
設定オプション DEFAULT_VAULT_ID_MATCH を設定すると、 この動作に変更なり、各パスワードは同じラベルで暗号化されたデータの復号にのみ使用されます。詳細は、「ボールトのラベル付け」 を参照してください。
Vault パスワードクライアントスクリプト¶
Ansible 2.5以降では、1 つの実行スクリプトを使用して、
vault ラベルに応じて異なるパスワードを取得できます。これらのクライアントスクリプトには、-client
で終わるファイル名が必要です。例:
contrib/vault/vault-keyring-client.py
スクリプトを使用してシステムキーリングから dev パスワードを取得するには、以下を実行します。
ansible-playbook --vault-id dev@contrib/vault/vault-keyring-client.py
このトピックの詳細は、Vault パスワードクライアントスクリプト を参照してください。
単一の暗号化変数¶
バージョン 2.3 以降、Ansible は、それ以外の「平文」の YAML ファイルにある vault 処理された変数を使用できるようになりました。
notsecret: myvalue mysecret: !vault |
$ANSIBLE_VAULT;1.1;AES256 66386439653236336462626566653063336164663966303231363934653561363964363833313662 6431626536303530376336343832656537303632313433360a626438346336353331386135323734 62656361653630373231613662633962316233633936396165386439616533353965373339616234 3430613539666330390a313736323265656432366236633330313963326365653937323833366536 34623731376664623134383463316265643436343438623266623965636363326136other_plain_text: othervalue
vault 処理された変数を作成するには、ansible-vault encrypt_string コマンドを使用します。詳細は「encrypt_string の使用」を参照してください。
vault 処理された変数は、提供された vault シークレットで復号化され、通常の変数として使用されます。ansible-vault
コマンドラインは、オンザフライでデータの暗号化用に stdin および stdout をサポートします。これは、エディターから使用して、このような vault 処理された変数を作成できます。Ansible と YAML の両方を復号する必要があることを認識できるように、必ず !vault
タグを追加する必要があります。vault の暗号化により複数行の文字列になるため、|
も必要になります。
Note
インライン vault は変数でのみ機能し、タスクのオプションで直接使用することはできません。
encrypt_string の使用¶
このコマンドは、YAML ファイルに含めるために上記の形式の文字列を出力します。 暗号化する文字列は、stdin、コマンドライン引数、または対話式プロンプトで指定できます。
「encrypt_string を使用して、yaml に埋め込む暗号化変数を作成」を参照してください。