How to use Ansible Vault to keep sensitive data in your playbooks hidden and protected.

Ansible Vault is a feature of Ansible that allows users to encrypt sensitive data such as passwords, API keys, and other confidential information.

Vault file

Define sensitive key value pairs for usage in your playbook, in a dedicated yaml file, (e.g. vars/vault.yaml) for encryption using ansible-vault tool.

# vars/vault.yaml
---
vault_my_database_root_password: rootPassword123
vault_my_secret_api_key: api-key-123

This file can be encrypted using the ansible-vault tool in the terminal as follows:

ansible-vault encrypt vars/vault.yaml

The contents of the file will now be encrypted and when viewed will look something like:

$ANSIBLE_VAULT;1.1;AES256
63643633356133633136643833316532363065346461326330643634306564646138306334613961
6333323134333432663831623737376338613233623239310a303461666537313064663130373738
36396362363163656163373061353234353966306533663131633433643132643466396264663636
6634353932626435650a613561626133616139386166376539633633343939393162386535306464
38323336336536376166353835636531616435356132323030666566393565613065333666336463
33333434343531613764333336353965666430636431303863613464373935363565306237393666
62663638396364383034343331613361656235373164396363346338663335366538656236343435
35643839656630616631

You will be asked to provide a vault password at this stage, be sure to remember it as it will be required anytime you run a playbook that requires access to the encrypted variables. To view the unencrypted contents use:

ansible-vault view vars/vault.yaml

If you want to change your vault password, you can do so by running:

ansible-vault rekey var/vault.yaml

Playbook

To make use of the encrypted variables in your playbook, follow these steps:

  • create a new vars file to set new key value pairs:
# vars/vars.yaml
---
my_database_root_password: "{{ vault_my_database_root_password }}"
my_secret_api_key: "{{ vault_my_secret_api_key  }}"
  • reference these files in playbook:
# playbook.yaml
---
- name: Configure server

  vars_files:
    - ./vars/vault.yaml
    - ./vars/vars.yaml

    tasks:
      - name: debug the vault vars
        ansible.builtin.debug:
          msg: "rootPassword: {{ my_database_root_password }} apiKey: {{ my_secret_api_key }}"
        tags:
          - debug

When the playbook is ran the unencrypted values will be shown in output.

ansible-playbook -i hosts.ini -t debug --ask-vault-password playbook.yaml

output contains:

"msg": "rootPassword: rootPassword123 apiKey: api-key-123"

Providing the vault password each time is a bit of a nuisance, so you can store the password in a file, the content of which should only contain the actual vault password. Then use a modified command to run the playbook:

ansible-playbook -i hosts.ini -t debug --vault-password-file vaultpswd playbook.yaml

Obviously, don’t commit that file.