我对ansible很新,想测试一些东西。 我有几个Amazon EC2实例,并希望在它们上安装不同的软件组件。我不想在ansible脚本或配置文件中拥有技术用户的(明文)凭据。我知道可以加密这些文件,但我想尝试使用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键值对包含为ansible变量?
答案 0 :(得分:1)
您可能希望使用facts.d并将您的python脚本放在那里作为事实可用 或者编写一个简单的动作插件来返回json对象,以消除stdout-> from_json转换的需要。
答案 1 :(得分:1)
请参见Ansible KeePass Lookup Plugin
ansible_user : "{{ lookup('keepass', 'path/to/entry', 'username') }}"
ansible_become_pass: "{{ lookup('keepass', 'path/to/entry', 'password') }}"
答案 2 :(得分:0)
晚了聚会,但看来您的用例主要涵盖在keepass-inventory中。而且不需要任何剧本“魔术”。免责声明:我为这个非营利组织做出了贡献。
export KDB_PATH=example.kdbx
export KDB_PASS=example
ansible all --list-hosts -i keepass-inventory.py