Git 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

我正试图用Ansible编写部署规则。其中一些步骤是:

  • 更新和升级服务器
  • 创建一个名为harry的用户
  • 向harry添加公钥和私钥
  • 从bitbucket.org克隆Git存储库
  • 我想在他的主目录中将存储库克隆为
    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