ansible:git模块挂起

时间:2013-11-22 03:14:27

标签: git ansible

我正在使用Ansible,我很难让git模块正常工作。 我看过几个有同样问题的人发帖,我看了一下ansible doc,好吧我几乎尝试了所有的东西。 我找到了一个明确的教程,我跟着他们使用git但是当我使用我的存储库时我又遇到了问题......:/ git任务只是挂起......没有错误,只是卡住了!

这是我的主机文件:

[web]
dev1 ansible_ssh_host=10.0.0.101 ansible_ssh_user=root

这是在我的计算机上的虚拟机上运行的流浪汉。

我从本教程中获取了剧本,并完成了步骤08之前的所有步骤:https://github.com/leucos/ansible-tuto/tree/master/step-08

我在我的VM上运行它,它工作正常,然后我添加一个任务“部署我的代码”来使用我的存储库......但是这个任务不起作用。它是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的用户,或者密钥等,但我来回试了几个小时,我现在更加困惑......我只是不知道该怎么办现在调试,找出错误和错过的内容。

感谢。

7 个答案:

答案 0 :(得分:14)

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

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

- 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不是核心安全模块,因此您需要先安装它,请参阅github repo docs以获取有关如何安装它的更多信息。


另一种解决方案是禁用ssh主机密钥检查,但这有安全隐患,所以除非你真的知道自己在做什么,否则最好避免这种情况。

答案 1 :(得分:10)

我基本上尝试了所有内容(接受密钥,ssh配置更改,known_hosts文件,ssh-agent转发,并忘记了其他内容)但没有成功。

拔掉我所有的头发之后,我最终确定了这个问题,因为SSH 私钥可能需要密码!

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

答案 2 :(得分:7)

如果用户需要密码,如果git可执行文件在后台提示输入密码,则git模块可能会挂起。对于您的repo参数,请尝试使用https://YAmikep:{yourpassword}@bitbucket.org/YAmikep/djangotutorial.git。或者,尝试使用git / ssh密钥,因此不需要密码。

答案 3 :(得分:3)

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

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

答案 4 :(得分:3)

fwiw我也有这个显然是由多个运行的ssh代理(osx客户端)引起的。 由

修正
  

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

答案 5 :(得分:0)

对我来说,问题是指定git的https路径而不是ssh路径。

https://gitlab.com/foo/bar.git # Incorrect
git@gitlab.com:foo/bar.git # Correct

答案 6 :(得分:0)

在terraform中使用ansible时,我遇到了类似的问题。 Terraform安全组不像在AWS控制台中那样默认设置为“允许所有出口”,因此无论客户端导致挂起行为如何,都不会发送git clone请求。

在此处查看terraform文档中的注释:https://www.terraform.io/docs/providers/aws/r/security_group.html#description-2