Jenkins pipeline шифрования с помощью AnsibleVault

Такие дела, поменял я таки работу. И как-то так все теперь интересно и весело, даже начал себя ловить на мыслях, что комп мол как будто первый раз вижу, а не 13+ лет админства за плечами. Но речь не за это. Понадобилось нашей «разработке», джоба в Jenkins для шифрования «секретов», ибо светить в пайпе  пароли/явки в открытом виде — как-то некошерно.
У нас далеко не все разрабы сидят на Linux/MacOS машинах, многие работают на Win. А на Win Ansible как известно и не пахло. Лазить на серваки неудобно, попросили пайп. Первое что пришло на ум — запилить sh скрипт типа:

 echo -n 'some_text_to_encrypt' | ansible-vault encrypt_string --vault-password-file anspass.txt

Естественно объявив допустим переменную ‘vault_text’, сделать параметризированную сборку с запросом собственно самого текста.
Получаем абсолютно работоспособный вариант:

 withCredentials([file(credentialsId: 'vault_sbin', variable: 'vault_file')]) {
        sh "echo -n 'vault_text' | ansible-vault encrypt_string --vault-password-file ${vault_file}"
 }

Но есть косяк — в лог джобы падает вывод нашей переменной ‘vault_text’, а этот пайп-то собственно и попросили чтоб подобной истории не было 😉
Чуть-чуть покурил, погуглил и понял что все придумано до нас:
https://plugins.jenkins.io/ansible/
Собственно есть полностью удовлетворяющий потребностям плагин AnsibleVault его и берем.
Потом хочется «рюшек» — делаем запрос ввода интерактивным, в итоге получается как-то так:

pipeline {
    agent {
        node {
            label'jenkins-ansible-agent' //Агент Jenkins (обычно достаточно 'any')
        }
    }
    options {
        skipDefaultCheckout(true) //Пропускаем чекаут ибо не нужен и так быстрее
    }
    stages{
        stage('Input'){
            steps{
                script{
                    env.vault_text = input message: 'Ввести данные которые необходимо зашифровать', //Объявляем переменную которая будет содержать текст который необходимо зашифровать
                        parameters: [string(defaultValue: '',
                            description: '',
                            name: 'vault_text')
                        ]
                }
            }
        }
        stage('Encrypt'){
            steps{
                script{
                    ansibleVault(
                        action:'encrypt_string',
                        content: "${vault_text}",
                        vaultCredentialsId: 'vault_sbin' //Имя сохраненного креда (в данном случае тип 'secret file')
                    )
                }
            }
        }
    }
}

Вполне себе работает, все довольны, а я себе чутка поднял скилл))

Добавить комментарий