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

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

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

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

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

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

winrm.exceptions.UnauthorizedError: 401 Unauthorized

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

Если нет способа зашифровать WinRM с сервера Linux / Jenkins без AD, каковы мои варианты для 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, к которым проекты захотят подключиться». Что это значит?

0
задан 17 August 2016 в 03:48
1 ответ

Вы можете настроить каждый сервер Windows как узел Jenkins (также известный как "ведомый" или "агент"). Затем используйте задание конвейера для управления потоком, команды которого выполняются на каком узле (используя узел{} блоков)

Это устранит необходимость в 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, соответственно.

.
0
ответ дан 5 December 2019 в 09:42

Теги

Похожие вопросы