2013-11-22 38 views
21

我正在使用Ansible,我很难让git模块工作。 我已经阅读了几个有同样问题的人的帖子,我看了一下这个不可靠的文档,以及我尝试了几乎所有的东西。 我发现一个清晰的教程,我跟着直到他们使用git,但当我使用我的存储库时,我有一个问题...:/ git任务只是挂起...没有错误,它只是卡住了!ansible:git模块挂起

这里是我的主机文件:

[web] 
dev1 ansible_ssh_host=10.0.0.101 ansible_ssh_user=root 

这是一个无业游民在我的电脑上VM VirtualBox上运行。

我从本教程中的剧本,并做了所有的步骤,直到步骤08: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://[email protected]/YAmikep/djangotutorial.git dest=/var/www/my-app 
     tags: deploy 

有可能是一些与用户,或者用户在运行ansible,或按键等,但我试图来回几个小时,我更糊涂了,现在......我只是不知道现在调试该怎么做,并找出哪些是错误的,以及我错过了什么。

谢谢。

+1

我不会亲自推荐使用HTTPS来访问git repos,除非你在非常严格的防火墙后面(没有22出站,yep)。这可能会在推送大型通信时产生问题,这可能严重依赖于HTTP代理设置,当然,除了回购之外,它还会在cleantext中存储您的密码。 ssh私钥,代理转发给远程主机的时间足够长,这是更可取的。 – spacediver

+4

作为一般说明。语法'https:// github.com/account/repo-name.git' **在Ansible任务中无法使用部署密钥。但是,语法'[email protected]:account/repo-name.git' **将在具有有效部署密钥的Ansible任务中工作**。语法很微妙但很重要。 – avelis

+1

@avelis您的评论今天帮了我。将URL从'https'改为'git' – sankargorthi

回答

7

如果用户需要密码,当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/anb它不能与特定的创建用户一起工作......我可以让git工作,但不能和为项目创建的用户一起工作。 – Michael

+0

@YAmikep - 您是否尝试过使用'[email protected]:YAmikep/djangotutorial.git'的回购地址?你上面给出的例子是使用HTTPS协议,这将导致Bitbucket提示输入密码进行验证,而不是使用密钥。 Github的工作正常,因为它是公共回购,但Bitbucket需要YAmikep的凭据。 – mragh

+0

它给我身份验证失败,虽然用户名和密码是正确的,任何想法为什么? –

3

我遇到过这种情况,在我的情况下,git挂断了为主机确认新的ssh密钥(bitbucket.org)。这可以通过sshknownhosts模块解决,该模块在git之前运行,以在主机上填充.ssh/known_hosts,以便后续git不需要挂在它上面。

但是要注意可能的安全问题,请阅读模块文档。

+1

这解决了我悬挂的git问题。 'sshknownhosts'不适合我,但是这样做:https://github.com/brycebaril/ansible-known_hosts – mahemoff

+0

不错!随时接受答案;)UPD。好吧,你不是TS%) – spacediver

+1

我会如果我能! – mahemoff

3

fwiw我也有这显然是由多个SSH代理运行(OSX客户端)造成的。 修正了

killall的ssh-agent & &的eval`SSH-agent` & & SSH-添加-K

11

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

如果确认已知主机的问题,那么你有两种选择:

解决方案1 ​​

要与git模块使用accept_hostkey参数避免这个问题。

- name: ensure jquery repo is available 
    git: [email protected]:jquery/jquery.git version=master accept_hostkey=True 

解决方案2

使用ansible-sshknownhosts第三方模块使用核心git模块:

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

- name: ensure jquery repo is available 
    git: [email protected]:jquery/jquery.git version=master accept_hostkey=True 

由于knownhosts不是核心ansible模块,您需要先安装它,请参阅github repo docs了解更多信息如何安装它。


另一个解决办法是禁用SSH主机密钥检查,但是这带来了安全隐患,所以除非你真的知道你在做什么,最好避免这种情况。

+0

可以/应该将'sshknownhosts'写成'sshknowhosts:host = ...'? – chicks

+0

'accept_hostkey'标志对我不起作用。我将'-o StrictHostKeyChecking = no'添加到'ssh_opts'并且工作正常。 – chishaku

10

我基本上都试过了(接受密钥,ssh config change,known_hosts文件,ssh-agent转发,并忘了还有其他什么)没有成功。

把我所有的头发拉出来后,我最终确定问题是SSH 私钥可能需要密码!

我之前没有注意到,因为本地ssh代理使用密钥环存储密码来处理它,所以一切都在本地工作。在Vagrant虚拟机上使用Ansible,这种机制不可用,并且git模块被卡住,等待输入密码。一旦意识到可能的原因,我创建了一个没有密码的特殊密钥对(安全方面是已知的,对吗?)并将公钥添加到bitbucket(/ github /无论哪一个)。当使用这个特定的键 - 事情顺利通过。

+0

这是一个救星! – physicalattraction

+0

正是那^(这节省了我很多时间) – Benz

+0

你如何创建一个无密钥的密钥?我尝试使用空白密码,但它仍然挂起(可能只是等待某人按Enter键) –