【问题标题】:Vagrant with Ansible Provisioning - How to git clone private repoVagrant with Ansible Provisioning - 如何 git clone 私有仓库
【发布时间】:2016-08-04 15:20:28
【问题描述】:

我正在使用Vagrant 设置共享开发服务器。我正在尝试使用 Ansible 进行配置(以前使用过 bash 脚本)。我似乎无法正确配置事物,因此 Ansible 可以在配置阶段自动克隆我们的私有 gitlab 存储库。

我们的 Vagrantfile 是

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/trusty64"
  config.vm.synced_folder /my/local/dir/, "/home/vagrant/repos"
  config.vm.synced_folder ".",   "/vagrant"
  config.ssh.forward_agent = true
  config.vm.provision "ansible_local" do |ansible|
    ansible.playbook = "playbook.yml"
  end
end

我们的基本剧本看起来像

---

- hosts: all
  sudo: true
  tasks:
    - name: update apt cache
      apt: update_cache=yes

    - name: install git
      apt:  name=git state=present

    - name: clone test repo
      shell: ssh-keyscan -H our.private.gitlab.server >> ~/.ssh/known_hosts; ssh -T git@our.private.gitlab.server; git clone git@our.private.gitlab.server:me/amazing-repo.git

我有一个ansible.cfg 文件,其中包含以下内容

[ssh_connection]
ssh_args = -o ForwardAgent=yes

我在配置阶段收到以下错误(尽管在主机上使用ssh-add -L 验证代理拥有我的密钥)

权限被拒绝(公钥)。\r\n克隆到 'amazing-repo'...\n权限被拒绝(公钥)。\r\n致命:不能 从远程存储库中读取。\n\n请确保您拥有正确的 访问权限\n并且存储库存在。”

我已经阅读了诸如 thisthis 之类的文章(以及更多其他文章),但我无法让它发挥作用。

我只希望提供步骤来处理克隆存储库。然后我会将它们同步到我的本地计算机,因此任何提交/推送都将使用我本地存储的 ssh 密钥。


更新

它似乎与this issue 有关,但我目前看不到任何分辨率。 @Lukáš Lalinský 的建议适用于 OSX,但不适用于 Windows。在 Windows 上,配置期间 git clone 步骤失败,但如果我随后 ssh 进入机器,则 ssh 密钥被转发到 VM 并且存在 SSH_AUTH_SOCK。我可以在这个阶段进行克隆,但不能在配置期间进行。

【问题讨论】:

    标签: git ssh vagrant ansible ansible-playbook


    【解决方案1】:

    问题是当您运行sudo 时,您将无法访问 SSH 代理套接字。解决此问题的唯一方法是更改​​服务器上的/etc/sudoers 以保留SSH_AUTH_SOCK 环境变量。

    例如,将此添加到/etc/sudoers,作为您剧本中的首要任务之一:

    Defaults env_keep += "SSH_AUTH_SOCK"
    

    【讨论】:

    • 这在 OSX 上完美运行,但由于某种原因不能在 Windows 上运行
    【解决方案2】:

    以下是我在 Ansible 配置的 Vagrant 框中 git 克隆私有仓库所需的所有设置,具有以下版本:

    • 流浪者 2.0.1
    • Ansible 2.4.1.0
    • Box ubuntu/xenial64 — Ubuntu 16.04.3
    • VirtualBox 5.1.30 可能无关紧要
    • macOS 10.13

    在您的 Vagrantfile 中,配置您的 Ansible 供应商以使用 SSH 代理转发:

    Vagrant.configure('2') do |config|
      # ...
      config.ssh.forward_agent = true
      # ...
    end
    

    现在,将您的 git 服务器添加到 guest 上的已知主机:

    # todo: better to add to the file instead of overwrite, but only if not already present
    - name: set up bitbucket.org as a known host
      shell: 'ssh-keyscan -H bitbucket.org > /home/ubuntu/.ssh/known_hosts'
    

    接下来,添加任务以克隆 repo。我们需要指定任务应该以 root 身份运行,以便 SSH 代理转发工作:

    - name: clone repo
      become: no # to use ssh agent forwarding, must not be root
      git:
        repo: 'git@bitbucket.org:myuser/myrepo.git'
        dest: /path/to/myrepo
    

    就我而言,这导致了权限问题,因为一旦我没有以 root 身份运行 git clone,我就不再有创建目标目录的权限。所以我添加了一个之前的file 任务来创建具有可编辑权限的root 目录。

    【讨论】:

      猜你喜欢
      • 2015-04-08
      • 2016-06-29
      • 2015-10-17
      • 2023-01-21
      • 1970-01-01
      • 2020-05-01
      • 2022-08-20
      • 2022-01-02
      • 2018-06-16
      相关资源
      最近更新 更多