【问题标题】:ansible: git module is hangingansible:git模块挂起
【发布时间】:2013-11-22 03:14:27
【问题描述】:

我正在使用 Ansible,但我很难让 git 模块正常工作。 我已经阅读了几篇有同样问题的人的帖子,我查看了 ansible 文档,我几乎尝试了所有内容。 我找到了一个清晰的教程,直到他们使用 git,但是当我使用我的存储库时我又遇到了问题......:/ git任务只是挂了...没有错误,只是卡住了!

这是我的主机文件:

[web]
dev1 ansible_ssh_host=10.0.0.101 ansible_ssh_user=root

这是一个在我电脑上的 virtualbox 上运行的 vagrant VM。

我从本教程中获取了剧本并完成了所有步骤,直到第 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://YAmikep@bitbucket.org/YAmikep/djangotutorial.git dest=/var/www/my-app
      tags: deploy

用户可能有问题,或者用户正在运行 ansible,或者密钥等,但我来回尝试了几个小时,现在我更加困惑......我只是不知道该怎么做现在调试它并找出问题所在以及我缺少什么。

谢谢。

【问题讨论】:

  • 我个人不建议使用 HTTPS 来访问 git repos,除非你在非常严格的防火墙后面(没有 22 个出站,是的)。这可能会在推送大型提交时产生问题,这可能严重依赖于 HTTP 代理设置,当然,它会将您的密码存储在除了您的存储库之外的 cleantext 中。 ssh 私钥,在足够长的时间内代理转发到远程主机是更可取的。
  • 作为一般说明。语法 https://github.com/account/repo-name.git 将无法使用 Ansible 任务中的部署密钥。但是,语法git@github.com:account/repo-name.git 将在具有有效部署密钥的 Ansible 任务中工作。语法很微妙,但需要注意。
  • @avelis 你的评论今天帮助了我。将网址从https 更改为git

标签: git ansible


【解决方案1】:

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

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

解决方案 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= ...吗?
  • accept_hostkey 标志对我不起作用。我将-o StrictHostKeyChecking=no 添加到ssh_opts 并且有效。
【解决方案2】:

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

在拔掉我所有的头发之后,我最终确定问题是 SSH 私钥可能需要密码!

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

【讨论】:

  • 这是救命稻草!
  • 正是 ^(这为我节省了很多时间)
  • 如何创建无密码密钥?我尝试使用空白密码,但它仍然挂起(可能只是在等待某人按 Enter)
  • $ ssh-keygen 并在询问“输入密码(没有密码时为空):”时按 RETURN,但还有其他可能性,可能会导致类似的症状。尝试其他建议的选项。
【解决方案3】:

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

【讨论】:

  • 我正在使用 ssh 密钥和 ssh 代理,但我正在尝试遵循本教程:stavros.io/posts/example-provisioning-and-deployment-ansible anb 它不适用于特定创建的用户...我可以让 git 工作但不能为项目创建的用户。
  • @YAmikep - 你试过git@bitbucket.org:YAmikep/djangotutorial.git的repo地址吗?您在上面给出的示例是使用 HTTPS 协议,这将导致 Bitbucket 提示输入密码以进行身份​​验证,而不是使用密钥。 Github 运行良好,因为它是一个公共存储库,但 Bitbucket 需要 YAmikep 的凭据。
  • 它给了我身份验证失败,虽然用户名和密码是正确的,知道为什么吗?
【解决方案4】:

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

但要小心可能的安全问题,请阅读模块文档。

【讨论】:

  • 这为我解决了挂起的 git 问题。 sshknownhosts 对我不起作用,但这个对我有用:github.com/brycebaril/ansible-known_hosts
  • 不错!随时接受答案;)UPD。好吧,你不是 TS %)
【解决方案5】:

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

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

【讨论】:

    【解决方案6】:

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

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

    【讨论】:

      【解决方案7】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-12-06
        • 2019-06-29
        • 2023-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-24
        • 2017-05-11
        • 1970-01-01
        相关资源
        最近更新 更多