資格情報をファイルに保存しないで、Ansible Azureプレイブックを実行するにはどうすればよいですか?


12

バックグラウンド

  1. Azureインフラストラクチャのプロビジョニングと管理には、Ansibleを使用しています。現時点では、Ansibleを「手動」で実行しています。つまり、さまざまな自動化タスクのプレイブック手動で実行しています。CIインフラストラクチャはありません。
  2. おそらく関係ありませんが、動的スクリプトを使用して在庫を管理していますazure_rm.py
  3. 可能な限り安全であることをお勧めします。
    1. Vaultのパスワードを~/.vault_passローカルファイルに保存しないでください。
    2. Azureシークレットを格納しないでください ~/.azure/credentials
    3. 安全なものをに保管しないでください.bashrc

このようなシナリオでは、上記のガイドラインに従いながら、プレイブックがAzureシークレットに確実にアクセスできるようにするための一貫した戦略を思い付くことができません。

質問

プレイブックがアクセスできるようにしながら、Ansible VaultとAzureの資格情報をファイルに保存しないようにするにはどうすればよいですか?

私が試したこと

これまでのところ、次のようなラッパースクリプトを考え出しました。

  1. ユーザーにVaultパスワードを要求する
  2. これを使用して、保管されたシェルスクリプトを復号化します
  3. Azure環境変数を環境にロードするスクリプトを評価します。
  4. このように設定された環境でプレイブックを実行します。

そこにもっと良い(よりエレガントで、より複雑でなく、より「Ansible」)ソリューションはありますか?


このワークフローで何が一番気になりますか?
Konstantin Suvorov

@KonstantinSuvorovは、主に、コンプライアンスを重視する企業で(少なくとも私には)かなり一般的な要件と思われるものを達成するためにジャンプする必要があるフープの数です。
Vish

回答:


8

ボールトのパスワード

まず、ボールトのパスワードファイルが実行可能なスクリプトである可能性があることを理解する必要があります。この場合、Ansibleはそれを実行し、パスワードを出力として受け取ることを期待します。

たとえば、gpg-agentまたはkeychainを使用して実際のパスワードを保存し、必要に応じてロックを解除できます。詳しくは、このブログ投稿をご覧くださいhttps : //benincosa.com/?p=3235

少し偏執狂の場合は、次のように、パスワードスクリプトが呼び出されたときに通知を追加できます。

#!/bin/bash
PARENT_PROCESS=$(ps -p $PPID -o args | tail -n 1)
osascript -e "display notification \"Vault password used by ${PARENT_PROCESS}\" with title \"Ansible\" sound name \"default\""
gpg --batch --use-agent --no-tty --decrypt key.gpg 2>/dev/null

このボールトパスワードスクリプトはkey.gpg、実際のボールトキーとして使用され、スクリプトが使用されると親プロセス名とともにポップアップ通知(MacOSの場合)も表示します。Gpg-agentは一定期間ロック解除パスワードをキャッシュするため、プレイブックを起動するたびにパスワードを入力する必要はありません。

に設定vault_password_file = ./vault_pass.shするだけansible.cfgです。

環境

あなたはazure_rm.py動的在庫スクリプトとして使用すると述べました。つまり、環境変数を使用できるようにするには、ansible-playbookを開始する前に、環境変数に認証情報を設定する必要があります。

次の2つのファイルを作成できます。

secure_env (ボールトで暗号化):

export AZURE_SECRET=xxx;export AZURE_SUBSCRIPTION_ID=xxx;

set_env (プレーンテキスト):

echo -n "Setting secure vars... "
eval $(ansible-vault view secure_env)
echo "done."

新しいターミナルを開いて自動化タスクを実行するときは、以下を実行する必要があります。

source set_env

この時点で、bashが評価されset_envsecure_env(Ansible Vaultを介して復号化されます)。このコマンドの後、現在のシェルにAzure資格情報が定義されているため、通常どおりにプレイブックを実行できます。

ansible-playbook provision-my-azure-instances.yml

したがって、この2つのアプローチを使用するkey.gpgsecure_env、リポジトリにを格納できます。次に、新しい端末呼び出しでsource set_env1回、gpgパスワードを1回入力します(key.gpgの将来の使用をロック解除するため)。その後ansible-playbook、パスワードなしで何回でも電話をかけます。


返信してくれてありがとう。これを1週間試してみましょう。
Vish

したがって、私の元のアプローチに対する主な利点は、GPGを使用していることです。環境への取り組みは、私が思いついたものと似ています。
Vish

1
OPから、プレイブックを実行するたびにラッパーを使用することを理解しています。ではsourceアプローチあなたはターミナルセッションごとに一度環境を設定し、個別のツールのすべての範囲を使用することができます任意のラッパーなしで、紺碧のCLI ansible-プレイブック、在庫スクリプトを、。
Konstantin Suvorov

ああ、わかった。これを私のチームに売り込みます。より便利な解決策として返信を受け入れる。研究と説明をありがとう!また、私はあなたのブログが好きでした:)
Vish

GPG(またはmacOSまたはLinuxのキーチェーン)を使用する主な利点は、各チームメンバーが独自の認証を取得して、固有の秘密鍵をロック解除できることです。このキーは、共有シークレットであるAnsible Vaultパスワードのロックを解除するために使用されます。誰かがAnsible Vaultパスワードを含めてチームを離れる場合は、すべての秘密をローテーションする必要がありますが、少なくともGPG /キーチェーンパスワードを変更する必要はありません。
RichVel

2

https://docs.ansible.com/ansible/2.4/vault.htmlを読んでください 。Ansible2.4から使用できます--vault-id @prompt

ansible-vaultを使用してファイルを暗号化する:

ansible-vault encrypt /path/to/encrypted/file

プレイブックを実行すると、次の結果になります。

fatal: [localhost]: FAILED! => {"msg": "A vault password or secret must be
specified to decrypt /path/to/encrypted/file"}

ファイルを復号化するには、次のような複数のオプションがあります@prompt

ansible-playbook some-playbook --vault-id @prompt

プロンプトが表示されます:

Vault password (default):

ボールトのパスワードが入力されると、プレイブックは成功します。


1
ページを読むと、そこに解決策があるように見えますが、リンクだけを使用して理解することはできません。詳しく説明してもらえますか?
Vish

詳しく説明していただきありがとうございます。実際、ユーザーにボールトのパスワードを要求する必要があります-古い--ask-vault-passオプションを使用します。そして、それをどのように置き換えると--vault-id、より良いワークフローというより大きな問題にどのように答えるのか理解できません。
Vish

あなたがリンクに私を呼ばれたとき、私はやった 1つの魅力的なオプションを参照してくださいansible-playbook --vault-id my-vault-password.py。多分あなたはpythonスクリプトを使用することに関する解決策を持っていると思いました:)私もこれについていくつか考えています。
Vish 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.