role tries to load any kind of secrets directly into variables you specify in the vars_stored.
Supports loading variable values from secrets stored in local filesystem (secret_store: 'fs') or from the instance of HashiCorp Vault (secret_store: 'vault').
If your secret does not exist at the store, the variable WILL NOT BE SET (remains in original state - undefined or whatever you set it to previously).
Set als_secret_store either to vault or fs. Loading values from both sources is intentionally not supported.
For vault source, specify mount point with als_vault_mount and path with als_vault_path variables.
For fs source, specify als_fs_path. If not specified, '/tmp' will be used as default.
Don't forget to specify VAULT_ADDR and VAULT_TOKEN env vars as you are used to when using Hashicorp Vault.
If you ever run into:
Exception: HTTPSConnectionPool(host='vault.example.com', port=443):
Max retries exceeded with url: /v1/sys/seal-status (Caused by SSLError(
SSLError(\"bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)\",),))"
then define proper certification authority for Python Requests with export REQUESTS_CA_BUNDLE=/etc/ssl/ca-certificates.crt.
- hosts: all
vars:
- secret_store: 'vault'
- als_vault_mount: 'secrets'
# full path will be secrets/someproject/prod
- als_vault_path: 'someproject/prod'
- group: 'somehosts'
- vars_stored:
- var: 'secret1'
key: 'password'
- var: 'secret2'
key: 'someotherkey'
- var: 'secret3'
key: 'someotherkey'
token: '1234-5678-9012-3456'
roles:
- ansible-load-secrets
After this play, {{ secret1 }} will be picked from {{ als_vault_mount }}/{{ als_vault_path }}/{{ group }}/secret1:password and {{ secret2 }} will be picked from {{ als_vault_mount }}/{{ als_vault_path }}/{{ group }}/secret2:someotherkey.
You can specify an empty group, but if you have read the previous paragraph you surely understand this well.
secret3 is loaded with a specific token (good for one-time usage).
- hosts: somehosts
vars:
- secret_store: 'fs'
- group: somehosts
- vars_stored:
- var: 'secret1'
- var: 'secret2'
roles:
- ansible-load-secrets
After this play, {{ secret1 }} will be loaded from {{ als_fs_path }}/somehosts/secret1, and {{ secret2 }} from {{ als_fs_path }}/somehosts/secret2 respectively.
You can use empty group, useful for loading vars for all hosts:
- hosts: all
vars:
- secret_store: 'fs'
- vars_stored:
- var: 'secret1'
- var: 'secret2'
roles:
- ansible-load-secrets
After this play, {{ secret1 }} will be loaded from {{ als_fs_path }}/secret1, and {{ secret2 }} from {{ als_fs_path }}/secret2 respectively.
Role is able to auto-generate pseudo-random {{ password_length }}-chars long (default 10) passwords. To do so, specify password: yes in your item:
- vars_stored:
- var: 'topsecret'
key: 'password'
password: true
After this, if topsecret was not loaded from vault, you will receive 10-char random string.
You can specify item-specific password length as well:
- vars_stored:
- var: 'topsecret'
key: 'password'
password: true
length: 42
It can generate random numbers a.k.a. PINs as well:
- vars_stored:
- var: 'pin'
key: 'pin'
pin: yes
Result: pin would be a number between 1000-9999
or
- vars_stored:
- var: 'pin'
key: 'pin'
pin: yes
range_min: 1234
range_max: 5678
would generate number between 1234 and 5677.
Note: Ansible RNG will generate a number between range_min inclusive and range_max exclusive.
- vars_stored:
- var: 'pin'
password: true
chars: 'asdfgh'
will generate password consisting of chars from asdfgh set only (see chars in https://docs.ansible.com/ansible/2.5/plugins/lookup/password.html)
- vars_stored:
- var: 'topsecret'
key: 'password'
host: 'myhost.mydomain.com'
Will load topsecret variable to myhost.mydomain.com on myhost.mydomain.com ONLY. Overrides group (if you specify both, only host is accepted).
Loading from special path: {{ als_vault_mount }}/{{ als_vault_path }}/hostsecrets/{{ host }}/{{ var }}
Sometimes you might need to load the secret from a path you define yourself. You can specify path parameter per item. In that case, vault_mount and vault_path are ignored. You need to specify full path, including the starting slash and mount point.
vars:
- vars_stored:
- var: "arbitrary"
key: "whatever"
password: false
path: '/secret/absolutely/random/path'
GPL
Michal Medvecky
Diogenes Santos de Jesus