【问题标题】:Use Hashicorp Vault with Ansible - plugin setup将 Hashicorp Vault 与 Ansible 一起使用 - 插件设置
【发布时间】:2017-05-13 14:44:50
【问题描述】:

我想使用 Hashicorp Vault 和 Ansible 来检索我将在 Ansible playbook 中使用的用户名/密码。

保险柜已设置 - 我创建了一个秘密。整合两者的步骤是什么?关于插件的文档不是很好。我尝试了从 ansible 查找文件,这可行,但是如何使用 3rd 方插件?有人可以帮助我执行以下步骤吗?

  1. 安装插件,pip install ansible-modules-hashivault
  2. https://github.com/jhaals/ansible-vault有什么区别
    2.a 环境变量(VAULT ADDR & VAULT TOKEN)我放在哪里?
  3. ansible.cfg 更改为指向位于我的Ansible 项目的“插件”文件夹中的vault.py
  4. 要测试基本集成,我可以使用以下剧本吗? https://pypi.python.org/pypi/ansible-modules-hashivault

    - hosts: localhost
        -tasks:
           - hashivault_status:
             register: 'vault_status'
    

试过了,但我得到了:

An exception occurred during task execution. The full traceback is:
Traceback (most recent call last):
  File "/usr/lib/python2.7/site-packages/ansible/executor/task_executor.py", line 119, in run
    res = self._execute()
  File "/usr/lib/python2.7/site-packages/ansible/executor/task_executor.py", line 431, in _execute
    self._task.post_validate(templar=templar)
  File "/usr/lib/python2.7/site-packages/ansible/playbook/task.py", line 248, in post_validate
    super(Task, self).post_validate(templar)
  File "/usr/lib/python2.7/site-packages/ansible/playbook/base.py", line 371, in post_validate
    value = templar.template(getattr(self, name))
  File "/usr/lib/python2.7/site-packages/ansible/template/__init__.py", line 359, in template
    d[k] = self.template(variable[k], preserve_trailing_newlines=preserve_trailing_newlines, fail_on_undefined=fail_on_undefined, overrides=overrides)
  File "/usr/lib/python2.7/site-packages/ansible/template/__init__.py", line 331, in template
    result = self._do_template(variable, preserve_trailing_newlines=preserve_trailing_newlines, escape_backslashes=escape_backslashes, fail_on_undefined=fail_on_undefined, overrides=overrides)
  File "/usr/lib/python2.7/site-packages/ansible/template/__init__.py", line 507, in _do_template
    res = j2_concat(rf)
  File "<template>", line 8, in root
  File "/usr/lib/python2.7/site-packages/jinja2/runtime.py", line 193, in call
    return __obj(*args, **kwargs)
  File "/usr/lib/python2.7/site-packages/ansible/template/__init__.py", line 420, in _lookup
    instance = self._lookup_loader.get(name.lower(), loader=self._loader, templar=self)
  File "/usr/lib/python2.7/site-packages/ansible/plugins/__init__.py", line 339, in get
    self._module_cache[path] = self._load_module_source('.'.join([self.package, name]), path)
  File "/usr/lib/python2.7/site-packages/ansible/plugins/__init__.py", line 324, in _load_module_source
    module = imp.load_source(name, path, module_file)
  File "/etc/ansible/ProjectA/lookup_plugins/vault.py", line 5
    <!DOCTYPE html>
    ^
SyntaxError: invalid syntax

fatal: [win01]: FAILED! => {
    "failed": true,
    "msg": "Unexpected failure during module execution.",
    "stdout": ""

【问题讨论】:

  • 您介意先修正剧本的语法吗?缩进被破坏,tasks 是一个键,而不是另一个项目。
  • Vault 提供了一个简单的 REST API - 你甚至可以使用uri 模块。 Ansible 的查找插件出奇的多,尽管它应该很简单,但要在所有这些插件中找到一个可以工作的插件却非常困难 - the one you already found 有效。
  • 我真的不明白你在这里问什么。该插件的 README 非常清晰,并提供了很好的示例。你在问environment variables 是什么?

标签: ansible hashicorp-vault


【解决方案1】:

既然你在帖子里放了这么多鸡蛋,我不知道问题的真正含义是什么,这里有一些东西可以让你使用原生查找插件和jhaals/ansible-vault

  • 可以在当前目录下创建lookup_plugins,在里面保存vault.py

  • VAULT_ADDRVAULT_TOKEN 环境变量与您在脚本中看到的一样;

下面的 Bash 脚本(它使用 screenjq,您可能需要安装它们)在开发模式下运行 Vault,设置密码,然后运行 ​​Ansible playbook,使用两个查找插件查询密码:

#!/bin/bash
set -euo pipefail

export VAULT_ADDR=http://127.0.0.1:8200

if [[ ! $(pgrep -f "vault server -dev") ]]; then
    echo \"vault server -dev\" not running, starting...
    screen -S vault -d -m vault server -dev
    printf "sleeping for 3 seconds\n"
    sleep 3
else
    echo \"vault server -dev\" already running, leaving as is...
fi

vault write secret/hello value=world excited=yes
export VAULT_TOKEN=$(vault token-create -format=json | jq -r .auth.client_token)
ansible-playbook playbook.yml --extra-vars="vault_token=${VAULT_TOKEN}"

playbook.yml:

---
- hosts: localhost
  connection: local
  tasks:
    - name: Retrieve secret/hello using native hashi_vault plugin
      debug: msg="{{ lookup('hashi_vault', 'secret=secret/hello token={{ vault_token }} url=http://127.0.0.1:8200') }}"

    - name: Retrieve secret/hello using jhaals vault lookup
      debug: msg="{{ lookup('vault', 'secret/hello') }}"

最后你应该得到:

TASK [Retrieve secret/hello using native hashi_vault plugin] *******************
ok: [localhost] => {
    "msg": "world"
}

TASK [Retrieve secret/hello using jhaals vault lookup] *************************
ok: [localhost] => {
    "msg": {
        "excited": "yes",
        "value": "world"
    }
}

world 这个词是从 Vault 中提取的。

【讨论】:

  • 感谢 techraf,我已经启动并运行了两个插件!
猜你喜欢
  • 2019-06-10
  • 1970-01-01
  • 2022-08-11
  • 2017-01-20
  • 2019-05-15
  • 2022-10-24
  • 2019-05-03
  • 2020-06-22
  • 2021-12-12
相关资源
最近更新 更多