Ansible任务 - 克隆私有Git仓库而不需要SSH转发

12

我正在尝试创建一个Ansible playbook,可以从我们的开发团队计算机和CI/CD服务器上运行。

playbook中的任务之一是从私有git存储库获取我们项目的源代码。因为playbook必须从CI/CD服务器上运行,所以我们不能使用SSH转发。

我想到的方法是将必要的SSH私钥复制到远程主机,并使用该密钥从私有git存储库克隆代码。

然而,在尝试此操作时,克隆任务会挂起。手动执行命令时,需要为SSH私钥输入密码短语。 SSH密钥不使用密码短语(为空)。

请问是否有人可以分享他们解决这个(可能非常常见的)问题的方案?

如果有人需要,这是我的当前playbook:

- name: Create SSH directory
  file: path=/root/.ssh state=directory

- name: Copy SHH key for Git access
  copy:
    content: "{{ git_ssh_key }}"
    dest: /root/.ssh/id_rsa
    owner: root
    group: root
    mode: 0600

# Also tried this, but it also hangs
#- name: Start SSH agent and add SSH key
#  shell: eval `ssh-agent -s` && ssh-add

- name: Get new source from GIT
  git: 
    key_file: /root/.ssh/id_rsa
    repo: "git@gitlab.com:user/repo.git"
    dest: "{{ staging_dir }}"
    depth: 1
    accept_hostkey: yes
    clone: yes

我正在使用 ansible 2.3.1.0,Python 版本 = 2.7.12


使用没有密码短语的密钥。 - techraf
@techraf 我已经尝试过了,进程仍然卡住。我该如何进行调试? - Laurynas Mališauskas
我假设运行playbook的用户是root用户?运行ssh-keygen -yf时需要输入密码吗?/root/.ssh/id_rsa文件的第二行是否包含单词ENCRYPTED - damienfrancois
@damien 是的,我以 root 用户身份运行playbook。ssh-keygen -yf需要密码。不,没有ENCRYPTED。 - Laurynas Mališauskas
在您输入空白密码短语后,连接是否成功?您尝试过使用 ssh-keygen -p 命令删除(空)密码短语或考虑生成新密钥吗? - damienfrancois
显示剩余4条评论
2个回答

8
以下是使其工作的步骤(在MacOS、Ubuntu LTS上使用Ansible 2.3.1和Python 2.7.10进行了测试):
1. 生成新的没有密语的SSH密钥对ssh-keygen -f my_ssh_key -N''。 2. 将my_ssh_key.pub添加到您的存储库服务器用户资料中 - GitLab - https://gitlab.com/profile/keys - Github - https://github.com/settings/keys。 3. 使用以下playbook进行测试。
---
- hosts: localhost
  gather_facts: no
  vars:
    git_ssh_public_key: "Your public ssh key"
    git_ssh_key: |
              -----BEGIN RSA PRIVATE KEY-----
              .... actual key here ....
              -----END RSA PRIVATE KEY-----
  tasks:
  - name: Copy SSH public key file
    copy: 
      content: "{{ git_ssh_public_key }}"
      dest: /root/.ssh/id_rsa.pub
      mode: 0644

  - name: Copy SSH private key file
    copy: 
      content: "{{ git_ssh_key }}"
      #src: id_rsa
      dest: /root/.ssh/id_rsa
      mode: 0600

  - name: Get new source from GIT
    git: 
      repo: "git@gitlab.com:user/repo.git"
      dest: "/var/www/"
      depth: 1
      accept_hostkey: yes
      clone: yes

重要安全通知

如果您想在真实环境中使用此示例,请勿以明文形式保存您的私钥 - 请使用Ansible Vault

您也不应该使用root作为您的ansible用户。创建一个没有sudo权限的新用户将更加安全。


2
这对我仍然不起作用.. 尝试 git fetch 时仍然会要求输入通行证短语 Enter passphrase for key '/root/.ssh/id_rsa':。也许有些 SSH 配置参数可以在它为空时绕过询问通行证短语的要求? - Laurynas Mališauskas
为什么要执行 git fetch 呢?可以使用 Ansible 的 git 模块来检查。同时,请确保提供的密钥文件对于您的存储库服务器是有效的。 - Konstantin Suvorov
1
在ansible脚本中,我正在使用您提供的默认命令。但是它卡住了,什么也没做。这就是为什么我手动连接到目标机器并测试git命令,该命令将连接到我的私有repo。即使密钥没有设置密码,它仍然要求输入密码(只需按回车键)。 - Laurynas Mališauskas
当我也复制了公钥时,一切都正常工作了。我编辑了你的答案并接受了它。谢谢! - Laurynas Mališauskas

0
我猜问题在于对于自动化任务,git没有使用ssh密钥。我查了一下(大概花了几分钟),发现在git 2.10中,你可以在调用git时提供ssh相关内容...所以我想你可以尝试这样做:
git -c core.sshCommand='ssh -i /path/to/private/key' fetch origin

或者您想使用的其他命令。您也可以在配置中进行修复:

git config core.sshCommand 'ssh -i /path/to/private/key'

无论如何,希望这有点帮助。

指定私人SSH密钥在执行带或不带Ruby的shell命令时使用?


我正在使用Git v.1.7.1,所以这对我不起作用。 - Laurynas Mališauskas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接