2016-12-29 1 views
2

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

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

  1. Установите плагин, pip install ansible-modules-hashivault
  2. Какая разница с https://github.com/jhaals/ansible-vault
    2.a Переменные среды (VAULT ADDR & VAULT ЗНАК) я ставлю где?
  3. Изменение ansible.cfg, чтобы указать на 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": "" 
+1

Не могли бы вы сначала подгонять синтаксис вашей пьесы? Отступ сломан, а 'tasks' - это ключ, а не другой элемент. – techraf

+0

Vault предлагает простой API REST - вы даже можете использовать модуль [uri] (https://docs.ansible.com/ansible/uri_module.html). На удивление много удивительных плагинов для Ansible, и хотя это должно быть просто, найти один из них, который работает среди всех из них, на удивление сложно - [тот, который вы уже нашли] (https://github.com/jhaals/ansible-vault) работает. – techraf

+0

И я не совсем понимаю, о чем вы здесь спрашиваете. README для плагина является сверхчистым и дает хорошие примеры.Вы спрашиваете, что [переменные среды] (https://en.wikipedia.org/wiki/Environment_variablehttps://en.wikipedia.org/wiki/Environment_variable)? – techraf

ответ

4

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

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

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

скрипт Bash ниже (он использует screen и jq, возможно, потребуется установить их) работает Vault в режиме разработчика, устанавливает тайну, и запускает анзибль пьесы, которые запрашивают секрет с двумя подстановками плагин:

#!/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» было получено из Убежища.

+0

Thx techraf, у меня теперь есть оба плагина и работа! – RedAnsible

Смежные вопросы