TL;DR
Ansible tried every vault secret you provided and none could unlock the file. Three culprits cover 90% of cases: wrong password, missing --vault-password-file flag, or a vault ID label mismatch. Run these commands first to narrow it down fast.
# Interactive check โ rules out password typos immediately
ansible-vault view /path/to/vars/vault.yml --ask-vault-pass
# With a password file
ansible-vault view /path/to/vars/vault.yml --vault-password-file ~/.vault_pass
# With a labeled vault ID
ansible-vault view /path/to/vars/vault.yml --vault-id prod@~/.vault_pass_prod
What's Happening
During playbook execution, Ansible cycles through every vault secret you've supplied and tries each one against the encrypted file. When none of them work, you get:
ERROR! Decryption failed (no vault secrets would decrypt) on /path/to/vars/vault.yml
The file stays locked. The playbook stops. This is by design โ Ansible won't silently skip encrypted variables and expose half-configured infrastructure.
Root Causes
- Wrong password โ typo, or using a password from a different environment
- No vault secret provided โ forgot
--ask-vault-passor--vault-password-file - Vault ID mismatch โ file encrypted with label
prodbut you're passing labeldev - Malformed password file โ trailing whitespace, Windows line endings (CRLF), or wrong file path
- File encrypted by someone else โ a teammate used their own key that you don't have
Fix 1: Provide the Correct Vault Password
Start with the interactive prompt. It cuts out automation variables and tells you immediately whether the password is right:
ansible-playbook site.yml --ask-vault-pass
Works here but fails in your normal run? The password is fine. The problem is how it's being supplied โ jump to Fix 2 or Fix 3.
Fix 2: Check Your Vault Password File
Password files fail silently. A stray carriage return or trailing space is invisible to the eye but breaks decryption completely. Inspect yours:
# Show non-printable characters โ look for trailing spaces or Windows line endings
cat -A ~/.vault_pass
# Good: "mypassword$"
# Bad: "mypassword ^M$" (Windows CRLF)
# Bad: "mypassword $" (trailing spaces)
Write the password cleanly to fix it:
echo -n "yourpassword" > ~/.vault_pass
chmod 600 ~/.vault_pass
Pass it explicitly, or set a default in ansible.cfg so you never forget the flag:
ansible-playbook site.yml --vault-password-file ~/.vault_pass
# Or in ansible.cfg:
# [defaults]
# vault_password_file = ~/.vault_pass
Fix 3: Match the Vault ID Label
Labeled vault IDs landed in Ansible 2.4. They're useful for multi-environment setups, but they're also a common source of this exact error โ if the file was encrypted with a label, you have to use that same label to decrypt it. Check the file header first:
head -1 /path/to/vars/vault.yml
# Example outputs:
# $ANSIBLE_VAULT;1.1;AES256 โ no label (classic format)
# $ANSIBLE_VAULT;1.2;AES256;prod โ vault ID label is "prod"
Header shows prod? Pass the matching ID:
# File was encrypted with:
ansible-vault encrypt --vault-id prod@prompt vault.yml
# So decrypt/run with:
ansible-playbook site.yml --vault-id prod@~/.vault_pass_prod
# Multiple environments in one run:
ansible-playbook site.yml \
--vault-id dev@~/.vault_pass_dev \
--vault-id prod@~/.vault_pass_prod
Remove the vault ID label (optional)
Labels adding more friction than value? Strip them out:
# Decrypt with the original labeled password
ansible-vault decrypt vault.yml --vault-id prod@~/.vault_pass_prod
# Re-encrypt without a label
ansible-vault encrypt vault.yml --ask-vault-pass
Fix 4: Rekey the Vault File
Rotating the password โ say, a teammate left, or you're standardizing secrets across environments โ is a one-command operation:
ansible-vault rekey /path/to/vars/vault.yml
# Prompts for the current password, then the new password
Fix 5: Check ansible.cfg for Conflicting Settings
There may be a vault_password_file path buried in one of your config files. If it points to a stale or wrong file, it silently overrides your command-line flags โ and you'll never see why:
grep -r vault /etc/ansible/ansible.cfg ~/.ansible.cfg ./ansible.cfg 2>/dev/null
Update or remove any stale paths you find. The project-level ./ansible.cfg takes priority over ~/.ansible.cfg, so check both.
Verification
Before running the full playbook, confirm decryption works in isolation:
# View decrypted content without modifying the file
ansible-vault view /path/to/vars/vault.yml --vault-password-file ~/.vault_pass
# Dry run the playbook
ansible-playbook site.yml --vault-password-file ~/.vault_pass --check
If ansible-vault view outputs the file contents without errors, you're good. Run the playbook.
Tips: Managing Vault Passwords
Most teams hit this error more than once. Here's what keeps it from coming back:
For generating strong vault passwords, I use the Password Generator on ToolCraft. It runs entirely in the browser โ nothing gets sent to a server, which matters when you're setting up secrets management infrastructure.
- Store vault passwords in a team secrets manager (HashiCorp Vault, AWS Secrets Manager, 1Password Teams) โ not in plaintext files committed to repos
- Pick a consistent vault ID naming scheme โ
dev,staging,prodโ and document which ID encrypted which file - Add
vault_password_file = ~/.vault_passto your personal~/.ansible.cfgso the flag is never accidentally omitted - Onboard teammates through the secrets manager, not Slack DMs

