Ansible:Git 模块挂起

27

我正在使用Ansible,但在让git模块工作方面遇到了困难。我已经阅读了几篇有关同样问题的文章,查看了ansible文档,以及尝试了几乎所有方法。

我找到了一个清晰的教程,按照其步骤操作直到使用git时,我在使用自己的仓库时又遇到了问题... :/

git任务无响应...没有错误,就是卡住了!

这里是我的主机文件:

[web]
dev1 ansible_ssh_host=10.0.0.101 ansible_ssh_user=root

这是一个在我的电脑上运行在virtualbox上的vagrant虚拟机。

我参照这个教程使用playbook做了所有步骤,直到第8步:https://github.com/leucos/ansible-tuto/tree/master/step-08

我在我的虚拟机上运行它,它工作得很好,然后我添加了一个任务“部署我的代码”来使用我的存储库...但这个任务不起作用。它是在bitbucket上的私有存储库。这会有所不同吗?

- hosts: web
  tasks:

    - name: Deploy our awesome application
      action: git repo=https://github.com/leucos/ansible-tuto-demosite.git dest=/var/www/awesome-app
      tags: deploy

    - name: Deploy my code
      action: git repo=https://YAmikep@bitbucket.org/YAmikep/djangotutorial.git dest=/var/www/my-app
      tags: deploy

可能是与用户、运行ansible的用户或密钥等有关,但我已经尝试了数小时,现在更加困惑... 我不知道该如何调试,找出问题在哪里以及我缺少了什么。

谢谢。


1
我个人不建议使用HTTPS访问git仓库,除非你在非常严格的防火墙后面(没有22出站端口)。这可能会在推送大量提交时创建问题,这可能严重依赖于HTTP代理设置,并且当然它会将您的密码明文存储在您的仓库旁边。ssh私钥,可以被代理转发到远程主机,是更可取的选择。 - spacediver
5
一般来说,在 Ansible 任务中,语法 https://github.com/account/repo-name.git 使用部署密钥将无法使用。然而,语法 git@github.com:account/repo-name.git 在 Ansible 任务中将可以使用有效的部署密钥。这种语法的区别细微但很重要,需要注意。 - avelis
1
@avelis,你的评论今天真的帮了我很多。我把URL从“https”改为了“git”。 - sankargorthi
8个回答

15

导致 git 模块挂起的原因有几个,但最可能的原因是 git clone 命令正在等待确认是否将主机密钥添加到您的服务器已知主机中。如果要验证这是否是问题,请使用标志:--verbose 执行 ansible,以便以详细模式运行,这将为您提供有关错误的更多信息。

如果您确认已知主机是问题所在,则有两个选择:

解决方法 1:

为了避免 git 模块出现此问题,请使用 accept_hostkey 参数。

- name: ensure jquery repo is available
  git: git@github.com:jquery/jquery.git version=master accept_hostkey=True

解决方法2:

在使用核心的git模块之前,先使用第三方模块ansible-sshknownhosts

- name: ensure github is a known host
  action: sshknownhosts host=github.com state=present 

- name: ensure jquery repo is available
  git: git@github.com:jquery/jquery.git version=master accept_hostkey=True

由于knownhosts不是核心ansible模块,您需要先安装它,请参考github repo docs获取更多有关如何安装的信息。


另一种解决方案是禁用SSH主机密钥检查,但这会带来安全隐患,因此除非您确切地知道自己在做什么,否则最好避免使用此方法。


“action: sshknownhosts” 应该改写为 “sshknowhosts: host=…” 吗? - chicks
“accept_hostkey” 标志对我无效。我在 “ssh_opts” 中添加了 “-o StrictHostKeyChecking=no”,这样就可以了。 - chishaku
@Marcos Abreu 您提到禁用ssh主机密钥检查会带来安全隐患。 但是在您的解决方案1中,accept_hostkey=True 不就是这样做的吗? 参考链接 - Sriman

11

我尝试了几乎所有可能的方法(接受密钥、ssh配置更改、known_hosts文件、ssh-agent传递等等),但都没有成功。

在抓狂之后,我最终确定问题是SSH私钥可能需要输入密码!

我之前没注意到这一点,因为本地ssh代理使用存储的密码保管箱处理了它,所以一切在本地都正常工作。但使用Vagrant虚拟机上的Ansible时,这种机制不可用,git模块卡在等待输入密码的地方。一旦意识到可能的原因,我创建了一个特殊的无密码密钥对(安全方面有所了解,对吧?),并将公钥添加到bitbucket (/github /whichever)上。当使用这个特定的密钥时 - 一切顺畅进行。


这真是救命稻草! - physicalattraction
就是那样^(这节省了我很多时间) - Benz
你如何创建一个无需密码的密钥?我尝试使用空白密码,但它仍然挂起(可能只是在等待有人按回车键)。 - Laurynas Mališauskas
输入 $ ssh-keygen 并在被问到“输入密语(留空表示无密语):”时按回车键,但还有其他可能性会导致类似的症状。请尝试其他建议的选项。 - silverdr
OP指出克隆存储库的协议为https(而不是ssh)。 - Drew

7

如果用户需要密码,在git模块没有提供密码的情况下,git可执行文件后台会提示密码,导致git模块挂起。对于您的仓库参数,请尝试使用https://YAmikep:{yourpassword}@bitbucket.org/YAmikep/djangotutorial.git。或者,尝试使用git/ssh密钥,这样就不需要密码了。


1
我正在使用ssh密钥和ssh代理,但我试图遵循这个教程:http://www.stavros.io/posts/example-provisioning-and-deployment-ansible/,但它与特定创建的用户不兼容...我可以让git工作,但不能使用为项目创建的用户。 - Michael
@YAmikep - 你试过使用 git@bitbucket.org:YAmikep/djangotutorial.git 的仓库地址吗?你上面提供的示例使用的是HTTPS协议,这会导致Bitbucket提示输入密码进行身份验证,而不是使用密钥。Github的那个可以正常工作,因为它是公共仓库,但是Bitbucket需要YAmikep的凭据。 - Jake Kreider
虽然用户名和密码正确,但它却给了我“认证失败”的提示,有任何想法为什么会这样? - Alfonso Embid-Desmet

3
我遇到了这个问题,在我的情况下,git在确认主机(bitbucket.org)的新ssh密钥时挂起。这可以通过运行sshknownhosts模块来解决,在git之前填充主机的.ssh/known_hosts,这样之后git就不需要挂起了。
但是要注意可能存在的安全问题,请阅读模块文档。

1
这个对我解决了Git卡住的问题。sshknownhosts 对我没用,但是这个链接有效:https://github.com/brycebaril/ansible-known_hosts - mahemoff
不错!随意接受答案 ;) 更新。好吧,你不是TS %) - spacediver

3

就我的经验,这个问题有可能是由多个ssh代理程序同时运行(osx客户端)引起的。 可以通过以下步骤解决:

killall ssh-agent && eval `ssh-agent` && ssh-add -K


2
对我来说,问题在于将https路径指定给git而不是ssh路径。
https://gitlab.com/foo/bar.git # Incorrect
git@gitlab.com:foo/bar.git # Correct

0

0
我的问题是,我在一个我有访问权限的仓库中包含了一个子模块,但是没有通过之前有效的私有SSH密钥进行访问。这非常棘手,因为它看起来好像一切都已经克隆成功了!

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