![在没有 AD 的情况下,Linux 上的 Jenkins 怎样安全地在 Windows 服务器上进行构建?](https://linux22.com/image/687815/%E5%9C%A8%E6%B2%A1%E6%9C%89%20AD%20%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%EF%BC%8CLinux%20%E4%B8%8A%E7%9A%84%20Jenkins%20%E6%80%8E%E6%A0%B7%E5%AE%89%E5%85%A8%E5%9C%B0%E5%9C%A8%20Windows%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E8%BF%9B%E8%A1%8C%E6%9E%84%E5%BB%BA%EF%BC%9F.png)
我在 CentOS 7.2 上运行 Jenkins 1.6。我有几台没有 AD 的 Windows 2012 服务器,我使用本地凭据连接到 Windows 计算机。我在 Linux 服务器上使用 Python 和 WinRM 配置了一个开发环境。对于生产环境,我的配置不起作用,因为 WinRM 未加密。
如何安全地让 Jenkins 在没有 AD 的 Windows 机器上启动构建?我认为我的无 AD 要求排除了 Kerberos。(这关联说 Linux 和 Windows 服务器都必须是域的一部分。我在其他地方读到,不建议将 Linux 服务器加入 AD 域。)我认为唯一的解决方案是使用加密。但我该怎么做呢?
在我使用 Jenkins 设置的 Windows 服务器上,我尝试对其进行强化以模拟生产要求:我使用了此命令(从以管理员身份打开的命令提示符中):
winrm set winrm/config/service @{AllowUnencrypted="false"}
但是这使得我的 Jenkins 构建出现如下错误:
winrm.exceptions.UnauthorizedError:401 未授权
我的 Jenkins 构建使用 Python 脚本,其中硬编码了身份验证。我无法在生产中使用纯文本密码。
如果没有办法从没有 AD 的 Linux/Jenkins 服务器加密 WinRM,那么我该如何以安全的方式在生产中推动 Jenkins 构建(运行 PowerShell 命令)?
编辑于 2016 年 8 月 16 日:我尝试了一种不使用 winrm 的不同方法。我在安装了 Jenkins 的 Linux 服务器和 Windows 服务器之间设置了 SSH。
如何在 Jenkins 中输入 SSH 凭据以在其他服务器上进行构建?连接方面应该与 Linux 服务器大致相同,Jenkins 管理其他 Linux 服务器上的构建,因为我的 Windows 服务器有 OpenSSH。我确实想在 Windows 服务器上调用 PowerShell 脚本。这是我尝试过的。
在 Jenkins UI 中,我转到主页,然后转到“管理凭据”->“配置系统”->“SSH 远程主机”。我单击“添加服务器”并输入主机名的 IP 地址。对于端口,我使用 22。对于用户名,我使用 gooduser。从此 Jenkins 服务器的 Linux 后端,我可以使用 gooduser 通过 SSH 登录到我在 Jenkins 中输入的 Windows 服务器。所以我知道凭据有效。我知道端口 22 没有被阻止。但在 Jenkins Web UI 中,我在用户名字段下方看到“无法连接到服务器”。
我尝试不使用密码,而是将密钥文件指向 Linux 服务器上的某个位置。我尝试过使用和不使用密码。我一直收到“无法连接到服务器”的消息。为什么我会收到此消息?
我尝试在下面添加其他服务器。我至少输入了一个主机名、一个用户名和一个密码。我单击“应用”或“保存”。然后单击 Web UI 中的其他位置。但是当我返回 SSH 主机时,所有后续服务器凭据都消失了。只有最上面的第一个 SSH 服务器的设置保留了下来。为什么它们消失了?该按钮允许显示新字段。按钮上写着“项目将要连接的 SSH 站点”。这是什么意思?
答案1
您可以将每个 Windows 服务器配置为Jenkins 节点(又名“从属”或“代理”)。然后使用管道作业来控制哪些命令在哪个节点上运行(使用 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 节点的标签。