Git Ansible:如何将存储库克隆为其他用户
我正试图用Ansible编写部署规则。其中一些步骤是:Git Ansible:如何将存储库克隆为其他用户,git,ansible,ansible-playbook,Git,Ansible,Ansible Playbook,我正试图用Ansible编写部署规则。其中一些步骤是: 更新和升级服务器 创建一个名为harry的用户 向harry添加公钥和私钥 从bitbucket.org克隆Git存储库 我想在他的主目录中将存储库克隆为harry用户(这就是为什么我要复制它的公钥和私钥)。问题是无法指定git克隆必须作为用户执行。因此Ansible尝试将存储库克隆为root,但失败了,因为他没有访问存储库的权限 如何解决此问题?您可以为playbook中的每个任务指定一个用户: - name: Clone bitbuck
harry
用户(这就是为什么我要复制它的公钥和私钥)。问题是无法指定git克隆必须作为用户执行。因此Ansible尝试将存储库克隆为root,但失败了,因为他没有访问存储库的权限
如何解决此问题?您可以为playbook中的每个任务指定一个用户:
- name: Clone bitbucket repo
git: ...
become: yes
become_user: harry
有关更多详细信息,请参阅
将私钥放置在远程服务器上更安全的替代方法是在服务器上的sshd配置和本地ssh配置中启用ssh密钥转发。钥匙永远不会离开您的本地邮箱。根据Ansible在上的文档,Ansible在成为非特权用户方面有限制,因为它会向Harry暴露一个安全漏洞 使用Ansible模块,您可以使用
key\u file
参数指定使用特权Ansible用户提供的Harry私钥,使用been\u user
允许将克隆文件的所有权授予Harry。例如:
- name: Clone bitbucket repo
git:
repo: git@bitbucket.org:your-repo.git
dest: /var/www/
version: master
accept_hostkey: yes
key_file: /home/harry/.ssh/id_rsa
become_user: harry
是的,您可以使用ssh转发 只要您在git克隆中成为的用户是sudoers的一部分,那么他就不需要使用sudo来执行git 因此,除了密钥转发所需的所有配置之外,Ansible文档中甚至提到了一个技巧。 高级流程如下所示: 在控制计算机中启用代理转发 在目标计算机中启用接受代理密钥 创建一个用户并将他(或她:)添加到sudoers组中 使用ansible的git模块克隆repo,成为:您的sudoer用户 另外,为了避免在主机上被拒绝任何权限,只需将其克隆到~/something中即可 您可以随时复制或符号链接到任何您想要的位置 下面是显示将用户添加到sudoers的playbook部分的链接,它基本上是一个复制粘贴: 很有魅力 另外,确保在BitBucket的常规设置中添加SSH公钥,而不是在每个项目中。否则,您的ssh密钥将只在一个特定的repo上工作。但是,如果您在bitbucket常规设置中添加ssh密钥,它将在所有repo上工作 下面是使它工作的代码,suduer用户是“deployer”
是的,通过ssh转发,它可以工作。 如果您的playbook已在全局范围内启用“Been:yes”,请确保在git任务中禁用该选项。 当您“变成:是”时,它不起作用的原因是根权限提升会破坏ssh转发。 我不认为你需要成为sudoer。因为如果您的Ansible控制机器使用ssh密钥通过Bitbucket进行身份验证(您将ssh密钥添加到repo中),那么此身份验证将通过ssh转发传递。 您可以通过ssh将其测试到目标中并发出“ssh-T”命令git@bitbucket.org“您将在输出中看到,Bitbucket接受目标作为Ansible控制机器的用户。因此,只需使用显式的“been:no”执行任务即可。 我同意把目标克隆成某物。否则将导致权限问题。 [编辑:还有一件事可以让它工作-————Repo URL应该是ssh URL而不是https URL,没有ssh://(不管Ansible手册示例中写了什么)]
就安全性而言,如上所述,ssh转发是最好的 我们只需使用与root相同的授权密钥,让ssh访问用户harry(在我的示例中是www-data)。这不会是安全问题,如果您可以连接到root,那么如果您以harry身份连接,您可以做更多的事情
remote_user: root
tasks:
- name: Create /var/www/.ssh
file:
state: directory
owner: www-data
group: www-data
path: /var/www/.ssh
mode: 0700
- name: Copy authorized_keys to www-data
copy:
remote_src: yes
src: ~/.ssh/authorized_keys
dest: /var/www/.ssh/
mode: 0400
owner: www-data
- name: Ensure www-data has shell
lineinfile:
path: /etc/passwd
regexp: '^www-data:'
line: 'www-data:x:33:33:www-data:/var/www:/bin/bash'
- name: chown -R www-data /var/www
file:
owner: www-data
path: /var/www
recurse: yes
- name: Git checkout application
git:
repo: git@gitlab.com:harry/project.git
dest: "/var/www/project_root_dir"
accept_hostkey: yes
remote_user: www-data
我有ssh转发,它与root一起工作。但它似乎无法与Been_userSSH_AUTH_SOCK一起使用Been_Users。除非保留密钥,否则密钥转发无法工作。也许你可以用been_flags添加它。正如@BenAtkin提到的,SSH_AUTH_SOCK会丢失,但是即使你将它保存在/etc/sudoers文件中,你也需要授予
harry
访问套接字文件的权限。添加been:yes
很重要,因为如果您是root,那么克隆的目录也将是root,即使您been\u user:harry
SSH\u AUTH\u SOCK我们需要授予部署人员访问套接字文件的权限
- name: Set perms on new Code repo to deployer:deployer dirs-0755 and files-0644
file:
path: ~/code
state: directory
owner: deployer
group: deployer
mode: u=rwX,g=rX,o=rX
recurse: yes
become: yes
remote_user: root
tasks:
- name: Create /var/www/.ssh
file:
state: directory
owner: www-data
group: www-data
path: /var/www/.ssh
mode: 0700
- name: Copy authorized_keys to www-data
copy:
remote_src: yes
src: ~/.ssh/authorized_keys
dest: /var/www/.ssh/
mode: 0400
owner: www-data
- name: Ensure www-data has shell
lineinfile:
path: /etc/passwd
regexp: '^www-data:'
line: 'www-data:x:33:33:www-data:/var/www:/bin/bash'
- name: chown -R www-data /var/www
file:
owner: www-data
path: /var/www
recurse: yes
- name: Git checkout application
git:
repo: git@gitlab.com:harry/project.git
dest: "/var/www/project_root_dir"
accept_hostkey: yes
remote_user: www-data