Назад | Перейти на главную страницу

Как Jenkins в Linux может безопасно создавать сборки для серверов Windows без A.D.?

Я использую Jenkins 1.6 на CentOS 7.2. У меня есть несколько серверов Windows 2012 без A.D. Я подключаюсь к машинам Windows с локальными учетными данными. Я настроил среду разработки с Python и WinRM на сервере Linux. Для производства моя конфигурация не будет работать, потому что WinRM не зашифрован.

Как мне безопасно инициировать сборку Jenkins на машинах с Windows без A.D.? Я думаю, что мое требование не иметь A.D. исключает Kerberos. (Это ссылка на сайт говорит, что серверы Linux и Windows должны быть частью домена. В другом месте я читал, что нецелесообразно присоединять сервер Linux к домену A.D.) Я думаю, что единственное решение - использовать шифрование. Но как мне это сделать?

На сервере Windows, который я настроил с помощью Jenkins, я попытался усилить его, чтобы имитировать производственные требования: я использовал эту команду (из командной строки, открытой от имени администратора):

winrm set winrm/config/service @{AllowUnencrypted="false"}

Но это заставило мои сборки Jenkins тормозить с такой ошибкой:

winrm.exceptions.UnauthorizedError: 401 Unauthorized

Мои сборки Jenkins используют сценарии Python с жестко запрограммированной аутентификацией. Я не могу использовать пароли в виде открытого текста.

Если нет способа зашифровать WinRM с сервера Linux / Jenkins без A.D., каковы мои варианты для Jenkins, обеспечивающих безопасную отправку сборок (выполнение команд PowerShell) в производственной среде?

Изменить 16.08.16: Я пробовал другой метод без winrm. Я установил SSH между сервером Linux с Jenkins и серверами Windows.

Как мне ввести учетные данные SSH в Jenkins, чтобы делать сборки на других серверах? Аспекты подключения должны быть примерно такими же, как и на сервере Linux с Jenkins, управляющим сборками на других серверах Linux, поскольку на моих серверах Windows есть OpenSSH. Я действительно хочу вызвать сценарий PowerShell на сервере Windows. Вот что я пробовал.

В пользовательском интерфейсе Jenkins я перехожу на домашнюю страницу, затем в раздел «Управление учетными данными» -> «Настроить систему» ​​-> «Удаленные узлы SSH». Я нажимаю Добавить сервер и ввожу IP-адрес в качестве имени хоста. Для порта я использую 22. В качестве имени пользователя я использую gooduser. На внутренней стороне Linux этого сервера Jenkins я могу использовать gooduser для входа через SSH на сервер Windows, который я ввел в Jenkins. Итак, я знаю, что учетные данные работают. Я знаю, что порт 22 не заблокирован. Но в веб-интерфейсе Jenkins я получаю сообщение «Не удается подключиться к серверу» под полем имени пользователя.

Я попытался не использовать парольную фразу, а указать в ключевом файле место на сервере Linux. Я пробовал это с паролем и без него. Я все время получал «Не могу подключиться к серверу». Почему я получаю это?

Я пробовал добавить дополнительные серверы внизу. Я ввел как минимум имя хоста, имя пользователя и пароль. Нажимаю применить или сохранить. Затем я щелкаю где-нибудь еще в веб-интерфейсе. Но когда я возвращаюсь к SSH-хостам, все последующие учетные данные сервера исчезают. Остались только настройки верхнего, первого SSH-сервера. Почему они уходят? Кнопка позволяет появиться новым полям. На кнопке написано «Сайты SSH, к которым проекты захотят подключиться». Что это значит?

Вы можете настроить каждый сервер Windows как Узел Дженкинса (он же «раб» или «агент»). Затем используйте задание конвейера, чтобы контролировать поток команд, выполняемых на каком узле (с помощью блоков node {}).

Это устранит необходимость в WinRM, SSH или других методах удаленного выполнения.

Обеспечение безопасности обмена данными между узлами Jenkins может быть выполнено с использованием секрета для каждого узла, которым управляет Jenkins. Я делаю это с ~ 20 различными машинами, большинство из которых основаны на Windows, некоторые на базе Linux, включая сложные задачи сборки, для которых требуются части, которые собираются под Windows, и другие части, которые строятся под Linux.

Пример кода конвейера:

node("LinuxBuild") {
    sh """
        ls -l
        echo "Running under Linux!"
    """
}

node("WinBuild") {
    bat """
        dir
        echo Running under Windows!
    """
}

В приведенном выше коде LinuxBuild и WinBuild - это метки, присвоенные одному или нескольким узлам Linux или Windows соответственно.