使用Ansible Provisioning的Vagrant - 如何git clone private repo

时间:2016-08-04 15:20:28

标签: git ssh vagrant ansible ansible-playbook

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

我们的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代理有我的密钥)

  

权限被拒绝(publickey)。\ r \ n克隆到   '惊人的回购'... \ n许可被拒绝(公钥)。\ r   从远程存储库中读取。\ n \ n请确保您具有正确的   访问权限\ n和存储库存在。“

我读过thisthis等文章(以及其他许多文章),但我无法让它发挥作用。

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

更新

它似乎与this issue有关但我目前看不到任何解决方案。 @LukášLalinský的建议适用于OSX但不适用于Windows。在Windows上,git clone步骤在配置期间失败,但如果我然后ssh进入计算机,则ssh密钥将转发到VM并且SSH_AUTH_SOCK存在。我可以在这个阶段克隆,而不是在配置期间。

2 个答案:

答案 0 :(得分:1)

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

例如,将其添加到/etc/sudoers作为游戏手册中的第一个任务之一:

Defaults env_keep += "SSH_AUTH_SOCK"

答案 1 :(得分:0)

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

  • Vagrant 2.0.1
  • Ansible 2.4.1.0
  • Box <style> #fullWidthDiv{ width: 100% } #halfWidthDiv{ width: 50% } </style> - Ubuntu 16.04.3
  • VirtualBox 5.1.30可能无关紧要
  • macOS 10.13

ubuntu/xenial64中,配置Ansible配置程序以使用SSH代理转发:

Vagrantfile

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

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

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

# 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'

在我的情况下,这导致了权限问题,因为一旦我没有以root身份运行- 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 ,我就不再拥有创建目标目录的权限。所以我添加了一个先前的git clone任务,以root身份创建具有可编辑权限的目录。