Что решаем?
Здесь собраны примеры использования Vault Plugin в Jenkins.
Примеры:
1. Недекларативный вариант
Недекларативный вариант с использованием плагина hashicorp-vault-plugin
(без дополнения для Pipeline Declarative). Приемуществом данного варианта является сокрытие паролей в Jenkins Console Output
timestamps {
node {
def VAULT_SECRETS = [[
path: 'stage/google-recaptcha',
secretValues: [
[envVar: 'SECRET_GOOGLE_RECAPTHCA_PRIVATE_KEY', vaultKey: 'SECRET_GOOGLE_RECAPTHCA_PRIVATE_KEY'],
[envVar: 'SECRET_GOOGLE_RECAPTHCA_PUBLIC_KEY', vaultKey: 'SECRET_GOOGLE_RECAPTHCA_PUBLIC_KEY']
]
]]
def VAULT_CONFIG = [engineVersion: 2, timeout: 60, vaultCredentialId: 'Vault-App-Role-Credential', vaultNamespace: 'namespace.name', vaultUrl: 'https://vault.yourdomain.com']
def ALL_SECRETS = [:]
stage('pull secrets') {
sh 'env'
withVault(configuration: VAULT_CONFIG, vaultSecrets: VAULT_SECRETS) {
sh "echo -e \"<?php\n\\\$VAULT_SECRETS = [];\" > secrets.php"
VAULT_SECRETS.each{ settings ->
settings.secretValues.each{ item ->
ALL_SECRETS["$item.envVar"] = env."$item.envVar"
// просто сгенерируем файл PHP (как вариант)
sh "echo -e \"\\\$VAULT_SECRETS[\\\"$item.envVar\\\"] = \\\""+env."$item.envVar"+"\\\";\" >> secrets.php"
// или создаем файл .env
sh "echo \"$item.envVar="+env."$item.envVar"+"\" >> .env"
}
}
}
}
// Таким образом всё-таки можно раскрыть пароли, не рекомендую использовать. Разве что для отладки:
// stage('Saving secrets to secrets.php as local file'){
// ALL_SECRETS.each{key, value->
// sh "echo -e \"\\\$VAULT_SECRETS[\\\"$key\\\"] = \\\"$value\\\";\" >> secrets.php"
// }
// }
// Один из вариантов доставки секретов на сервер
stage('push secrets) {
sshagent (credentials: ['stage-rsa']) {
sh 'scp secrets.php stage@192.168.1.65:/application/configs/'
sh 'scp .env stage@192.168.1.65:/application/'
}
}
}
}
2. Декларативный вариант
def getSecretsConfig(){
return [[path: 'stage/google-recaptcha', secretValues: [[envVar: 'SECRET_GOOGLE_RECAPTHCA_PRIVATE_KEY', vaultKey: 'SECRET_GOOGLE_RECAPTHCA_PRIVATE_KEY'], [envVar: 'SECRET_GOOGLE_RECAPTHCA_PUBLIC_KEY', vaultKey: 'SECRET_GOOGLE_RECAPTHCA_PUBLIC_KEY']]]]
}
pipeline {
agent any
stages {
stage ("pull & push secrets"){
steps {
withVault(configuration: [engineVersion: 2, timeout: 60, vaultCredentialId: 'Vault-App-Role-Credential', vaultNamespace: 'namespace.name', vaultUrl: 'https://vault.yourdomain.com'], vaultSecrets: getSecretsConfig()) {
sshPublisher(publishers: [sshPublisherDesc(configName: 'stage', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'echo $SECRET_GOOGLE_RECAPTHCA_PUBLIC_KEY > /home/secret.txt', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/home/', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '*')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
}
}
}
}
}
Was this helpful?
0 / 0