Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git Docker jenkins容器,主机密钥验证失败_Git_Jenkins_Docker_Ssh_Configuration - Fatal编程技术网

Git Docker jenkins容器,主机密钥验证失败

Git Docker jenkins容器,主机密钥验证失败,git,jenkins,docker,ssh,configuration,Git,Jenkins,Docker,Ssh,Configuration,我正在用Vagrant、Ansible和Docker创建CI管道和开发环境。我的目标是用一个命令实现一切自动化,而不需要手动配置。使用单个ansible playbook命令,我应该拥有功能齐全的连续部署管道,所有服务都已停靠 现在问题来了。当我运行官方的Jenkins docker容器并尝试为git配置身份验证时,我得到以下错误 主机密钥验证失败 我知道我可以登录到Jenkins容器,手动ssh到git,并在第一次登录时接受主机密钥作为受信任的。但这绝对不是,连接也应该自动处理 当可用的工具是

我正在用Vagrant、Ansible和Docker创建CI管道和开发环境。我的目标是用一个命令实现一切自动化,而不需要手动配置。使用单个ansible playbook命令,我应该拥有功能齐全的连续部署管道,所有服务都已停靠

现在问题来了。当我运行官方的Jenkins docker容器并尝试为git配置身份验证时,我得到以下错误

主机密钥验证失败

我知道我可以登录到Jenkins容器,手动ssh到git,并在第一次登录时接受主机密钥作为受信任的。但这绝对不是,连接也应该自动处理

当可用的工具是docker、ansible和vagrant时,如何配置Jenkins docker容器以信任git服务器?您可以使用模块解决此问题

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

请注意本模块的局限性:

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


我正在构建类似的东西,我的管道阶段封装在Kubernetes编排的容器中,我能够通过git+ssh无缝地使用ssh代理Jenkins插件inside
hashicorp/terraform:light
基于图像的容器从我的私有bitbucket服务器中获取模块。当我试图从同一个bitbucket服务器通过
ansible galaxy
下载我的角色时,我在
ansible/ansible runner
图像中遇到了与您相同的问题

我试着用terraform和ssh代理做同样的事情

我的相关管道代码段如下所示:

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克隆之后,我尝试从管道中克隆一个存储库:

+ /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
值得注意的是,使用

"ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no"

无法工作。

您是否通过生成ssh密钥对在jenkins容器中设置了任何ssh身份验证方法?如果是这样的话,jenkins容器可以自动连接git服务器,而无需使用密码。此外,主机密钥验证只是一个客户端验证问题,可以通过将git server的主机密钥添加到jenkins用户已知的_hosts文件中来消除。使用ansible配置正在运行的docker容器感觉很矛盾,因为docker容器旨在完整和独立。是否可以在启动容器时使用纯docker命令或ansible docker_容器模块提供密钥?