Интеграция с Ansible Keepass через скрипт Python
Я очень плохо знаком с ansible и хотел бы проверить несколько вещей. У меня есть пара экземпляров Amazon EC2, и я хотел бы установить на них различные программные компоненты. Я не хочу, чтобы (незашифрованные) учетные данные технических пользователей содержались в скриптах или конфигурационных файлах. Я знаю, что эти файлы можно зашифровать, но я хочу попробовать keepass для централизованного управления паролями. Поэтому мои сценарии установки должны читать учетные данные из файла базы данных.kdbx (Keepass 2) перед началом фактической установки.
До сих пор я написал базовый скрипт на python для чтения файла.kdbx. Скрипт выводит объект json через:
print json.dumps(inventory, sort_keys=False)
Выход выглядит следующим образом:
{"cdc":
{"cdc_test_server":
{"cdc_test_user":
{"username": "cdc_test_user",
"password": "password"}
}
}
}
Теперь я хочу добиться того, чтобы скрипт python выполнялся ansible, а пары ключ-значение на выходе включались / регистрировались как ANSIBLE переменные. Пока что моя пьеса выглядит следующим образом:
- hosts: 127.0.0.1
connection: local
tasks:
- name: "Test Playboook Functionality"
command: python /usr/local/test.py
register: pass
- debug: var=pass.stdout
- name: "Include json user output"
set_fact: passwords="{{pass.stdout | from_json}}"
- debug: " {{passwords.cdc.cdc_test_server.cdc_test_user.password}} "
Первая отладка генерирует правильный вывод json, но я не могу включить переменные в ansible, так что я могу использовать их через нотацию jinja2. set_fact не выдает исключение, но последняя отладка просто возвращает сообщение "Hello world"? Итак, мой вопрос: как правильно включить пары ключ-значение JSON в качестве заданных переменных через задачу?
2 ответа
Вы можете использовать facts.d и разместить там свой скрипт на python, чтобы быть доступными как факт.
Или напишите простой плагин действия, который возвращает объект json, чтобы исключить необходимость преобразования stdout->from_json.
Посмотрите плагин Ansible KeePass Lookup
ansible_user : "{{ lookup('keepass', 'path/to/entry', 'username') }}"
ansible_become_pass: "{{ lookup('keepass', 'path/to/entry', 'password') }}"
Опоздал на вечеринку, но, похоже, ваш случай использования в основном покрыт keepass-инвентарем. И это не требует никакой книги "магия". Отказ от ответственности: я способствую этой некоммерческой.
export KDB_PATH=example.kdbx
export KDB_PASS=example
ansible all --list-hosts -i keepass-inventory.py