使用Ansible自动化SSH本地密钥的Git部署

30

我正在使用Vagrant和Ansible进行工作。我想自动化Ansible的部署角色(您可以在这里检查我的代码库)。

为此,我正在尝试将我的本地ssh密钥部署到我的VPS和Vagrant虚拟机中(我正在尝试使用SSH代理转发)。

目标:

使用Ansible自动化使用Git进行部署过程。 我已经完成了这个过程:

---

- name: read-write git checkout from github
  git: repo={{ repository }} dest=/home/site

地点:

---
# Variables here are applicable to all host groups

repository: git@bitbucket.org:dgnest/dgnest.git

问题

当我执行 "vagrant provision" 命令时,控制台会卡在这里:

TASK: [deployment | read-write git checkout from github] ********************** 

那是因为我还没有设置ssh密钥。

我尝试了

我想使用ansible的git模块具有的key_file选项。但它也失败了。

---                                                                             

- name: read-write git checkout from github                                     
  git: repo={{ repository }} dest=/home/site key_file=/home/oscar/.ssh/id_rsa.pub
另一个选择是将我的~/ssh/id_rsa.pub复制到每个VPS和vagrant中,但在这种情况下,我的问题是处理所有不同的用户。Vagrant使用“vagrant”用户,而我的VPS使用其他用户,因此我不得不将我的ssh本地密钥放入每个这些用户中吗?
希望你能帮助我。谢谢。
更新:
我刚刚自动化了@leucos的回答(感谢)。复制私有和公共rsa密钥。我分享这个链接与实现。

复制私有RSA密钥是一个非常糟糕的想法。共享私有密钥也是一个非常糟糕的想法。例如,你信任你的团队成员(以及所有其他有权访问远程服务器的员工)与他们分享访问你的私有存储库吗?如果不信任,请保持你的私有密钥“私有”。 - Ihor Pomaranskyy
2个回答

35

无需将本地SSH密钥复制到远程服务器。相反,您只需在运行部署脚本的目录中创建名为ansible.cfg的文件,并放置下列设置:

[ssh_connection]
ssh_args = -o ForwardAgent=yes

就是这样,现在你的本地身份已经转发到你使用Ansible管理的远程服务器上了。


谢谢您提供的解决方案。但是在我的实践中,您需要在根目录上设置服务器并使用其他用户进行部署。SSH转发仅适用于连接到ssh的用户。如果您想将其与其他非root用户一起使用,则应拆分ansible playbook。一个由root连接并安装所有内容,另一个由其他用户进行部署。在此配置中,您可以使用普通用户从私有存储库进行部署而无需任何ssh密钥。在Django + Ansible中运行得很好。 - Denis Savenko
1
SSH代理转发是不安全的,如果您的远程服务器被攻击者入侵,攻击者可能会使用它来访问代理密钥所允许的服务器。从man ssh关于-A选项的说明:“应谨慎启用代理转发。具有绕过远程主机上文件权限(用于代理UNIX域套接字)的能力的用户可以通过转发的连接访问本地代理。攻击者无法从代理获取密钥材料,但他们可以执行使他们能够使用加载到代理中的身份验证的密钥的操作。” - agorf

31
如果你选择使用key_file的方式,我的猜测是密钥必须在VPS/vagrant机器上。所以您可能需要先复制它。请注意,这里需要的是私钥而不是公钥。
对于您的第二个选项,您可以根据实例类型将密钥推送给特定用户。假设VPS中的用户为vpsuser,并且您主要在这些VPS上部署,则可以执行以下操作:
group_vars/all :
deploy_user=vpsuser

group_vars/vagrant

deploy_user=vagrant

那么,你可以有一个像这样的playbook:

- name: send key to remote deploy user
  copy: src=files/private_key dest=~/{{deploy_user}}/.ssh/priv_key

- name: read-write git checkout from github                                     
  git: repo={{ repository }} dest=/home/site key_file=~/{{deploy_user}}/.ssh/priv_key

然而,我不知道如何询问远程私钥的密码(我认为ansible默认不允许身份验证代理转发(检查-vvvv输出),您可能需要调整 ~/.ansible.cfg )。

我建议您为部署目的使用特定的密钥(在您的git存储库上具有只读权限)。这样,您的私钥将不会离开您的计算机。使此特殊密钥无需密码。我认为安全的权衡是可以接受的,因为 - 它只会保护您的代码, - 您的代码已经在私钥所在的计算机上检出,所以游戏已经结束。

另一个选项是使用ansible从本地检出分发应用程序:制作tarball,复制文件,解压缩,就可以了。这样,您不需要在VPS上留下安全凭据。

祝好运。


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