#jenkins #hashicorp-vault
#Дженкинс #хэшкорп-хранилище
Вопрос:
Я попробовал пример конвейера Дженкинса, упомянутый здесь: https://plugins .jenkins.io/hashicorp-vault-plugin
node {
// define the secrets and the env variables
def secrets = [
[$class: 'VaultSecret', path: 'secret/testing', secretValues: [
[$class: 'VaultSecretValue', envVar: 'testing', vaultKey: 'value_one'],
[$class: 'VaultSecretValue', envVar: 'testing_again', vaultKey: 'value_two']]],
[$class: 'VaultSecret', path: 'secret/another_test', secretValues: [
[$class: 'VaultSecretValue', envVar: 'another_test', vaultKey: 'value']]]
]
// optional configuration, if you do not provide this the next higher configuration
// (e.g. folder or global) will be used
def configuration = [$class: 'VaultConfiguration',
vaultUrl: 'http://my-very-other-vault-url.com',
vaultCredentialId: 'my-vault-cred-id']
// inside this block your credentials will be available as env variables
wrap([$class: 'VaultBuildWrapper', configuration: configuration, vaultSecrets: secrets]) {
sh 'echo $testing'
sh 'echo $testing_again'
sh 'echo $another_test'
}
}
Итак, я установил hashicorp-vault-plugin 2.2.0 в Jenkins 2.173 и запустил контейнер-докер Vault (v1.1.1), используя
docker run -d --name vaulttest -p 80:8200 --cap-add=IPC_LOCK -e 'VAULT_DEV_ROOT_TOKEN_ID=myroot' vault
Затем я настроил учетные данные токена в Jenkins, используя токен «myroot»
Я создал секреты внутри Vault (используя WebUI)
testing
value_one
value_two
another_test
value
Прежде всего, в примере есть ошибка: при использовании путей «секрет / тестирование» и «секрет / another_test» плагин завершается с ошибкой 404:
Invalid path for a versioned K/V secrets engine. See the API docs for the appropriate API endpoints to use. If using the Vault CLI, use 'vault kv get' for this operation."
Это можно исправить при использовании путей «секрет / данные / тестирование» и «секрет / данные / another_test» (см. https://issues.jenkins-ci.org/browse/JENKINS-44900 )
При последующем вызове задания переменные кажутся пустыми:
[Pipeline] sh
echo
[Pipeline] sh
echo
[Pipeline] sh
echo
Соединение определенно работает, потому что при предоставлении неверных учетных данных или недопустимых путей я получаю ошибки.
Также извлечение секретов напрямую возвращает действительный ответ:
/ # vault kv get secret/testing
====== Metadata ======
Key Value
--- -----
created_time 2019-04-17T05:31:23.581020191Z
deletion_time n/a
destroyed false
version 3
====== Data ======
Key Value
--- -----
value_one HUGO
value_two BETTY
Чего мне здесь не хватает?
Ответ №1:
Как видно здесь https://issues.jenkins-ci.org/browse/JENKINS-52646 Vault KV V2 возвращает другой Json-резонанс.
Поэтому вы должны использовать
def secrets = [
[$class: 'VaultSecret', path: 'secret/data/testing', secretValues: [
[$class: 'VaultSecretValue', envVar: 'testing', vaultKey: 'data']]]
]
чтобы получить правильный ответ json.
Полученный Json-ответ затем может быть передан в «readJSON»
def result = readJSON text: testing
echo result.value_one
echo result.value_two