ADD ansible vault pass client script
This commit is contained in:
parent
dba487994c
commit
cc9d4c582d
|
@ -0,0 +1,89 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf8 -*-
|
||||||
|
|
||||||
|
"""
|
||||||
|
A script that allows to keep Ansible Vault passwords in a gpg encrypted files
|
||||||
|
managed by pass (https://www.passwordstore.org) or compatible password managers
|
||||||
|
like gopass (https://www.gopass.pw).
|
||||||
|
"""
|
||||||
|
|
||||||
|
from argparse import ArgumentParser as AP
|
||||||
|
from configparser import ConfigParser, NoOptionError, NoSectionError
|
||||||
|
from os import environ, getcwd, path
|
||||||
|
from subprocess import PIPE, Popen
|
||||||
|
from sys import exit, stderr, stdout
|
||||||
|
|
||||||
|
# Password manager to use (pass or gopass)
|
||||||
|
pass_command = 'pass'
|
||||||
|
|
||||||
|
# Get Ansible config file
|
||||||
|
try:
|
||||||
|
import ansible.constants as C
|
||||||
|
ansible_config_file = C.CONFIG_FILE
|
||||||
|
except ImportError:
|
||||||
|
try:
|
||||||
|
ansible_config_file = environ['ANSIBLE_CONFIG']
|
||||||
|
except KeyError:
|
||||||
|
cfg = getcwd() + '/' + 'ansible.cfg'
|
||||||
|
if path.isfile(cfg):
|
||||||
|
ansible_config_file = cfg
|
||||||
|
else:
|
||||||
|
ansible_config_file = path.expanduser('~/.ansible.cfg')
|
||||||
|
|
||||||
|
|
||||||
|
def get_vault_id():
|
||||||
|
# Get passwordstore name from '--vault-id' CLI option
|
||||||
|
parser = AP(description='Get a vault password from passwordstore',
|
||||||
|
epilog='Please read the README.md file for more info.',
|
||||||
|
allow_abbrev=False)
|
||||||
|
|
||||||
|
parser.add_argument('--vault-id', action='store', default='default',
|
||||||
|
dest='vault_id',
|
||||||
|
help='passwordstore containing the vault password')
|
||||||
|
|
||||||
|
vault_id = parser.parse_args().vault_id.strip()
|
||||||
|
|
||||||
|
return vault_id
|
||||||
|
|
||||||
|
|
||||||
|
def get_config_passwordstore():
|
||||||
|
# Get passwordstore name from Ansible config file
|
||||||
|
if ansible_config_file:
|
||||||
|
try:
|
||||||
|
# Raad Ansible config
|
||||||
|
config = ConfigParser()
|
||||||
|
config.read(ansible_config_file)
|
||||||
|
# Get passwordstore name from Ansible config
|
||||||
|
passwordstore = config.get('vault', 'passwordstore',
|
||||||
|
fallback='').strip()
|
||||||
|
except NoOptionError:
|
||||||
|
pass
|
||||||
|
except NoSectionError:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
pass
|
||||||
|
return passwordstore
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
vault_id = get_vault_id()
|
||||||
|
if (vault_id != 'default' and vault_id != ""):
|
||||||
|
passwordstore = vault_id
|
||||||
|
else:
|
||||||
|
passwordstore = get_config_passwordstore()
|
||||||
|
|
||||||
|
if passwordstore:
|
||||||
|
# Get vault password from passwordstore
|
||||||
|
proc = Popen([pass_command, passwordstore], stdout=PIPE, stderr=PIPE)
|
||||||
|
output = proc.communicate()[0].decode('utf-8').strip().split("\n")[0]
|
||||||
|
stdout.write(output)
|
||||||
|
exit(0)
|
||||||
|
else:
|
||||||
|
stderr.write("Couldn't get passwordstore settings from Ansible config "
|
||||||
|
"file or --vault-id option!\nPlease read the README.md "
|
||||||
|
"file for more info about script settings.\n")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
Loading…
Reference in New Issue