TL;DR
Ansible が提供されたすべてのvaultシークレットを試みましたが、ファイルをアンロックできませんでした。原因の90%は次の3つに絞られます:パスワードの誤り、--vault-password-fileフラグの指定漏れ、またはvault IDラベルのミスマッチです。まず以下のコマンドを実行して原因を素早く特定しましょう。
# 対話型チェック — パスワードの入力ミスをすぐに確認できる
ansible-vault view /path/to/vars/vault.yml --ask-vault-pass
# パスワードファイルを使用する場合
ansible-vault view /path/to/vars/vault.yml --vault-password-file ~/.vault_pass
# ラベル付きvault IDを使用する場合
ansible-vault view /path/to/vars/vault.yml --vault-id prod@~/.vault_pass_prod
何が起きているのか
プレイブックの実行中、Ansible は提供されたすべてのvaultシークレットを順に試し、暗号化されたファイルに対して照合します。どれも一致しない場合、以下のエラーが発生します:
ERROR! Decryption failed (no vault secrets would decrypt) on /path/to/vars/vault.yml
ファイルはロックされたまま、プレイブックは停止します。これは意図的な動作です — Ansible は暗号化された変数をサイレントにスキップして半端な状態でインフラを構成するようなことはしません。
原因
- パスワードの誤り — タイプミス、または別の環境のパスワードを使用している
- vaultシークレットが指定されていない —
--ask-vault-passまたは--vault-password-fileを忘れている - vault IDのミスマッチ — ファイルがラベル
prodで暗号化されているのにdevラベルを渡している - パスワードファイルの形式の問題 — 末尾の余分なスペース、Windowsの改行コード(CRLF)、またはファイルパスの誤り
- 別の人が暗号化したファイル — チームメンバーが自分の鍵で暗号化したファイルにアクセス権がない
修正1:正しいvaultパスワードを指定する
まず対話型プロンプトを試してみましょう。自動化の変数を排除し、パスワードが正しいかどうかをすぐに確認できます:
ansible-playbook site.yml --ask-vault-pass
ここでは通るのに通常の実行で失敗する場合、パスワード自体は正しいです。問題はパスワードの渡し方にあります — 修正2または修正3に進みましょう。
修正2:vaultパスワードファイルを確認する
パスワードファイルの問題はサイレントに発生します。余分な改行コードや末尾のスペースは目に見えませんが、復号化を完全に壊します。ファイルを確認しましょう:
# 非印字文字を表示 — 末尾のスペースやWindowsの改行コードを確認する
cat -A ~/.vault_pass
# 正常: "mypassword$"
# 異常: "mypassword ^M$" (Windows CRLF)
# 異常: "mypassword $" (末尾のスペース)
パスワードをきれいに書き直して修正します:
echo -n "yourpassword" > ~/.vault_pass
chmod 600 ~/.vault_pass
明示的に指定するか、ansible.cfg にデフォルト設定を追加してフラグの指定漏れを防ぎましょう:
ansible-playbook site.yml --vault-password-file ~/.vault_pass
# または ansible.cfg に記述する:
# [defaults]
# vault_password_file = ~/.vault_pass
修正3:vault IDラベルを合わせる
ラベル付きvault IDはAnsible 2.4で追加されました。マルチ環境構成に便利ですが、このエラーの一般的な原因でもあります — ファイルがラベル付きで暗号化されている場合、同じラベルを使って復号化する必要があります。まずファイルのヘッダーを確認しましょう:
head -1 /path/to/vars/vault.yml
# 出力例:
# $ANSIBLE_VAULT;1.1;AES256 ← ラベルなし(クラシック形式)
# $ANSIBLE_VAULT;1.2;AES256;prod ← vault IDラベルは「prod」
ヘッダーに prod が表示されている場合、対応するIDを指定します:
# 暗号化時のコマンド:
ansible-vault encrypt --vault-id prod@prompt vault.yml
# 復号化/実行時は同じラベルを使用:
ansible-playbook site.yml --vault-id prod@~/.vault_pass_prod
# 1回の実行で複数環境を扱う場合:
ansible-playbook site.yml \
--vault-id dev@~/.vault_pass_dev \
--vault-id prod@~/.vault_pass_prod
vault IDラベルを削除する(任意)
ラベルが手間になっている場合は取り除くことができます:
# 元のラベル付きパスワードで復号化
ansible-vault decrypt vault.yml --vault-id prod@~/.vault_pass_prod
# ラベルなしで再暗号化
ansible-vault encrypt vault.yml --ask-vault-pass
修正4:vaultファイルをrekeyする
パスワードをローテーション(例:チームメンバーが退職した場合や環境間でシークレットを統一する場合)するには、コマンド1つで実行できます:
ansible-vault rekey /path/to/vars/vault.yml
# 現在のパスワードと新しいパスワードを順番に入力するよう求められます
修正5:ansible.cfg の競合する設定を確認する
設定ファイルのどこかに vault_password_file のパスが埋まっている可能性があります。古いファイルや誤ったファイルを指している場合、コマンドラインのフラグをサイレントに上書きしてしまい、原因が分かりにくくなります:
grep -r vault /etc/ansible/ansible.cfg ~/.ansible.cfg ./ansible.cfg 2>/dev/null
見つかった古いパスは更新または削除してください。プロジェクトレベルの ./ansible.cfg が ~/.ansible.cfg より優先されるため、両方を確認しましょう。
動作確認
プレイブック全体を実行する前に、復号化が単体で機能することを確認しましょう:
# ファイルを変更せずに復号化された内容を表示
ansible-vault view /path/to/vars/vault.yml --vault-password-file ~/.vault_pass
# プレイブックのドライラン
ansible-playbook site.yml --vault-password-file ~/.vault_pass --check
ansible-vault view がエラーなしでファイルの内容を表示できれば、問題ありません。プレイブックを実行しましょう。
ヒント:vaultパスワードの管理
多くのチームがこのエラーに繰り返し遭遇します。再発を防ぐためのベストプラクティスを紹介します:
強力なvaultパスワードの生成には、ToolCraft のパスワードジェネレーターを活用しています。完全にブラウザ内で動作し、サーバーには何も送信されないため、シークレット管理インフラを構築する際に安心して使えます。
- vaultパスワードはチームのシークレットマネージャー(HashiCorp Vault、AWS Secrets Manager、1Password Teams)に保存する — リポジトリにコミットされたプレーンテキストファイルには保存しない
- vault IDの命名規則(
dev、staging、prod)を統一し、どのIDがどのファイルを暗号化したかを文書化する - 個人の
~/.ansible.cfgにvault_password_file = ~/.vault_passを追加し、フラグの指定漏れを防ぐ - チームメンバーへのオンボーディングはSlackのDMではなくシークレットマネージャーを通じて行う

