Docker Jenkins容器,主机密钥验证失败。

4
我正在使用Vagrant、Ansible和Docker创建一个CI流水线和开发环境。我的目标是通过单个命令自动化所有内容,无需手动配置。只需使用单个ansible-playbook命令,我就可以拥有完全功能的持续部署流水线,并将所有服务docker化。
现在问题来了。当我运行官方的Jenkins Docker容器并尝试为git配置身份验证时,会出现以下错误: host key verification failed 我知道我可以登录到Jenkins容器中,手动ssh到git并在第一次登录时接受主机密钥作为受信任的密钥。但这是绝对不可取的,连通性也应该自动处理。
在可用工具为Docker、Ansible和Vagrant的情况下,如何配置Jenkins Docker容器以信任创建时的git服务器?

你是否在jenkins容器中设置了任何ssh身份验证方法,通过生成ssh密钥对?如果是这样,那么jenkins容器可以自动连接git服务器而无需交互密码。此外,主机密钥验证只是客户端验证问题的一个方面,并且可以通过将git服务器的主机密钥添加到jenkins用户的known_hosts文件中来消除。 - Kadir
2个回答

4
我正在构建一个与你类似的项目,我的管道阶段封装在容器中,由Kubernetes编排,并且我能够使用ssh-agent Jenkins插件从我的私有bitbucket服务器获取模块,通过git+ssh无缝地在基于hashicorp/terraform:light镜像的容器中进行操作。当我尝试从同一bitbucket服务器下载我的roles时,我遇到了与ansible/ansible-runner镜像相同的问题。
我尝试做与terraform和ssh-agent相同的事情。
我的相关管道片段如下:
container('ansible') {
   ...
   sshagent([ssh_key]) {
      ...
      stage('get ansible roles') {
         sh 'ansible-galaxy install -r requirements.yaml -p roles/'
         ...
     }
   }
}

它失败了,ansible-galaxy 实际上隐藏了问题:
+ ansible-galaxy install -r requirements.yaml -p roles/
 [WARNING]: - ans_rol_test was NOT installed successfully: - command
 /usr/bin/git clone ssh://git@mybitbucketserver.org/project/ans_rol_test.git
 ans_rol_test failed in directory /root/.ansible/tmp/ansible-local-
 106DvbAa0/tmp09xwe_ (rc=128)
 ERROR! - you can use --ignore-errors to skip failed roles and finish processing the list.

在我看到这只是普通的git clone之后,我尝试从流水线中克隆存储库:

+ /usr/bin/git clone ssh://git@mybitbucketserver.org/project/ans_rol_test.git
Cloning into 'ans_rol_test'...
Host key verification failed.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

然后我尝试直接SSH连接到Bitbucket服务器。

+ ssh git@mybitbucketserver.org
Pseudo-terminal will not be allocated because stdin is not a terminal.
Host key verification failed.

当我通过参数 -oStrictHostKeyChecking=no 进行 SSH 登录时,主机密钥仍然会被保存,但是由于 sshd 的原因,ssh 客户端返回 255 并导致管道失败,所以我在末尾添加了 || true

Pseudo-terminal will not be allocated because stdin is not a terminal.
Warning: Permanently added 'mybitbucketserver.org,10.5.132.51' (RSA) to the list of known hosts.
shell request failed on channel 0
+ true

在此之后,主机密钥将被“验证”,因此 git clone ssh:// 可以正常工作,因此 ansible-galaxy 也可以正常使用。
...
stage('get ansible roles') {
    sh 'ssh -oStrictHostKeyChecking=no git@mybitbucketserver.org || true'
    sh 'ansible-galaxy install -r requirements.yaml -p roles/'
    ...
 }
...

输出:

+ ssh -oStrictHostKeyChecking=no git@mybitbucketserver.org
Pseudo-terminal will not be allocated because stdin is not a terminal.
Warning: Permanently added 'mybitbucketserver.org,10.5.132.51' (RSA) to the list of known hosts.
shell request failed on channel 0
+ true
[Pipeline] sh
+ /usr/bin/git clone ssh://git@mybitbucketserver.org/project/ans_rol_test.git
Cloning into 'ans_rol_test'...
[Pipeline] sh
+ ansible-galaxy install -r requirements.yaml -p roles/
- extracting ans_rol_test to /home/jenkins/agent/workspace/configuration/roles/ans_rol_test
- ans_rol_test (1.0.0) was installed successfully

值得注意的是,通过设置 GIT_SSH_COMMAND 环境变量可以使用自定义的 SSH 命令来与 Git 服务器进行通信。
"ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no"

无法工作。


0

您可以使用Ansible的known_hosts模块来解决这个问题。

该模块将主机密钥添加到服务器的~/.ssh/known_hosts文件中,类似于您描述的手动步骤。

请注意该模块的限制:

如果您需要管理大量主机密钥,则会发现template模块更有用。


1
使用ansible配置运行docker容器感觉有些自相矛盾,因为docker容器旨在完整且独立。是否可以在启动容器时提供密钥,无论是使用纯docker命令还是ansible docker_container模块? - Tuomas Toivonen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接