Используйте Hashicorp Vault с Ansible - настройка плагина

Я хочу использовать Hashicorp Vault с Ansible для получения имени пользователя и пароля, которые я буду использовать в сборнике воспроизведения Ansible.

Хранилище настроено - я создал секрет. Каковы шаги для интеграции обоих? документация по плагинам не так уж хороша. Я пробовал искать файлы из ansible, и это работает, но как использовать сторонние плагины? Может ли кто-нибудь помочь мне с дальнейшими шагами?

  1. Установите плагин, pip install ansible-modules-hashivault
  2. В чем разница с https://github.com/jhaals/ansible-vault
    2.a Переменные окружения (VAULT ADDR & VAULT TOKEN) куда я положил?
  3. Измените ansible.cfg на vault.py, который находится в папке "plugin" моего проекта Ansible.
  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": ""

person RedAnsible    schedule 29.12.2016    source источник
comment
Не могли бы вы сначала исправить синтаксис вашей пьесы? Отступы нарушены, и tasks является ключом, а не другим элементом.   -  person techraf    schedule 29.12.2016
comment
Vault предлагает простой REST API - вы даже можете использовать модуль uri. На удивление существует множество плагинов поиска для Ansible, и хотя он должен быть простым, найти тот, который работает среди всех, на удивление сложно - тот, который вы уже нашли, работает.   -  person techraf    schedule 29.12.2016
comment
И я действительно не понимаю, о чем вы здесь спрашиваете. README для плагина очень понятен и содержит хорошие примеры. Вы спрашиваете, что такое переменные среды?   -  person techraf    schedule 29.12.2016


Ответы (1)


Поскольку вы помещаете в сообщение так много яиц, что я понятия не имею, о чем на самом деле вопрос, вот что поможет вам с помощью встроенного плагина поиска и jhaals/ansible-vault.

  • вы можете создать lookup_plugins в текущем каталоге и сохранить внутри vault.py;

  • переменные среды VAULT_ADDR и VAULT_TOKEN выглядят так, как вы их видите в сценарии;

Сценарий Bash ниже (он использует screen и jq, возможно, вам потребуется установить их) запускает Vault в dev mode, устанавливает секрет и запускает 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 было извлечено из Убежища.

person techraf    schedule 29.12.2016
comment
Спасибо techraf, у меня есть оба плагина и они работают! - person RedAnsible; 01.01.2017