通过 python 脚本进行 Ansible Keepass 集成

Ansible Keepass integration via python script

我是 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执行,输出的键值对included/registered作为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 不会抛出异常,但最后一次调试只是 returns 一条 "Hello world" - 消息?所以我的问题是:如何通过任务正确地将 json 键值对包含为可变量?

您可能想使用 facts.d 并将您的 python 脚本放在那里作为事实可用。
或者编写一个 returns json 对象的简单动作插件,以消除 stdout->from_json 转换的需要。

聚会迟到了,但您的用例似乎主要由 keepass-inventory 涵盖。而且它不需要任何剧本 "magic"。免责声明:我为这个非营利组织做出贡献。

export KDB_PATH=example.kdbx
export KDB_PASS=example

ansible all --list-hosts -i keepass-inventory.py

Ansible KeePass Lookup Plugin

ansible_user       : "{{ lookup('keepass', 'path/to/entry', 'username') }}"
ansible_become_pass: "{{ lookup('keepass', 'path/to/entry', 'password') }}"