Настраиваем SSH ключи на Node-ах Jenkins без ssh-доступа к ним

в 15:26, , рубрики: Git, github, groovy, Jenkins, ssh, Серверное администрирование, метки: , , , ,

Настраиваем SSH ключи на Node ах Jenkins без ssh доступа к ним

Всем привет! Думаю у каждого, кто когда-либо настраивал Jenkins для работы с Git-ом возникала проблема генерации ключей на Node-ах.

В очередной раз когда мне этим пришлось заняться я оказался в нелёгкой ситуации — ssh доступа к серверу с Jenkins-ом и к его слейвам у меня не было и, соответственно, ключи я сгенерировать не мог. Но всё оказалось не так плохо.

Добираемся до shell-а

Порывшись в недрах Jenkins-а была найдена Script Console, которая позволяет выполнять Groovy-код на нодах. Что нам это даёт? Возможность выполнять команды shell-а благодаря .execute() на строках. Только есть одно «но» — нельзя использовать перенаправление потоков и другие прелести bash, поэтому для начала надо придумать как исполнять код в интерпретаторе bash. Для этого были придуманы эти незамысловатые строки (буду благодарен советам по улучшению кода ибо на Groovy пишу впервые):

def file = new File(System.getenv("HOME") + "/testGroovyShell.sh")
  
file << "#!/bin/bashn
echo hello, world!"
  
def builder = new AntBuilder()
builder.chmod(file:file.getAbsolutePath(), perm:'+x')

println file.getAbsolutePath().execute().text
  
file.delete()

Теперь мы можем исполнять любой bash-код от имени пользователя, под которым запущен Jenkins!

Генерация SSH-ключей

Но тут меня ждал облом — для генерации ssh-ключей требуется жать Enter каждый раз когда он нас спросит о чем-нибудь. Это нас, мягко говоря, не устраивает, поэтому погуглив было найдено тупое, но зато работающее решение:

#!/bin/bash
echo -e "nnn" | ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub

Тем самым мы говорим, что надо послать 3 раза перенос строки в поток ввода ssh-keygen. После выполнения этих команд скрипт выведет публичный ключ сервера. Осталось только добавить его в свой аккаунт (например, на GitHub), запустить Job и… опять обломаться.

Добавляем наш сервер в known_hosts на примере GitHub

Казалось бы, ключ у нас есть, что ещё для счастья надо? Не тут то было! SSH устроен так, что при первом обращении к неизвестному ему хосту он запросит потверждение, мол, запомнить ли его? На этот раз обойдёмся без хаков, просто выполнив команду:

ssh-keyscan -H github.com >> ~/.ssh/known_hosts

, где github.com — хост, который вы хотите добавить.

После добавления хоста вы можете попробовать запустить вашу задачу и обрадоваться рабочему Git-у.

Заключение

Прошу тех, для кого полезность статьи стремится к нулю, не пинать сильно, т.к. задокументированного процесса как это сделать я в интернете не нашёл, а вопрос крайне актуальный.

О найденных ошибках и недочётах предпочитаю читать в ЛС, а не среди заминусованных комментов;)

Да прибудет с Вами дух Continuous Integration!

Автор: bsideup

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js