簡體   English   中英

Ansible:如何以其他用戶身份克隆存儲庫

[英]Ansible: how to clone a repository as other user

我正在嘗試使用 Ansible 編寫部署規則。 其中一些步驟是:

  1. 更新和升級服務器
  2. 創建一個名為 Harry 的用戶
  3. 添加公鑰和私鑰給哈利
  4. 從 bitbucket.org 克隆 Git 存儲庫

我想在他的主目錄中以harry用戶的身份克隆存儲庫(這就是我復制它的公鑰和私鑰的原因)。 問題是無法指定必須作為 g​​it clone 執行的用戶。 所以 Ansible 嘗試以 root 身份克隆存儲庫並失敗,因為他沒有訪問存儲庫的權限。

你如何解決這個問題?

根據 Ansible 關於權限提升的文檔,Ansible 對成為非特權用戶有限制,因為它向 Harry 暴露了一個安全漏洞。

使用 Ansible git模塊,您可以使用key_file參數指定使用來自特權 Ansible 用戶的 Harry 的私鑰,並且使用become_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: yes
  become_user: harry

您可以為劇本中的每個任務指定一個用戶:

- name: Clone bitbucket repo
  git: ...
  become: yes
  become_user: harry

有關更多詳細信息,請參閱Ansible 權限提升

將私鑰放在遠程服務器上的更安全的替代方法是在服務器上的 sshd 配置和本地 ssh 配置中啟用 ssh 密鑰轉發。 鑰匙永遠不會離開您的本地盒子。

是的,你可以讓它與 ssh 轉發一起工作

只要你在 git clone 中成為的用戶是 sudoers 的一部分,所以他不需要使用 sudo 來執行 git

因此,除了密鑰轉發所需的所有配置之外,還有一個技巧甚至在 Ansible 文檔中提到過。 高級流程如下: 在控制機器中啟用代理轉發 在目標機器中啟用接受代理密鑰 創建一個用戶並將他(或她:)添加到 sudoers 組中使用 ansible 的 git 模塊克隆 repo,成為:your-sudoer-user

此外,為了避免在主機上拒絕任何權限,只需將其克隆到 ~/something 您可以隨時復制或符號鏈接到您想要的任何位置

這是顯示將用戶添加到 sudoers 的劇本部分的鏈接,它基本上是復制粘貼: Ansible:創建具有 sudo 權限的用戶

奇跡般有效

另外,請確保在 BitBucket 的常規設置中添加 SSH 公鑰,而不是在每個項目中。 否則,您的 ssh 密鑰將僅適用於一個特定的存儲庫。 但是,如果您在 bitbucket 常規設置中添加 ssh 密鑰,它將適用於您的所有存儲庫

下面是使它工作的代碼,suduer 用戶是“部署者”

# the tasks to CREATE A SUDOER GROUP


- name: Make sure we have a 'wheel' group
    group:
      name: wheel
      state: present
    become: yes

  - name: Allow 'wheel' group to have passwordless sudo
    lineinfile:
      dest: /etc/sudoers
      state: present
      regexp: '^%wheel'
      line: '%wheel ALL=(ALL) NOPASSWD: ALL'
      validate: 'visudo -cf %s'
    become: yes

  - name: Add sudoers users to wheel group
    user: name=deployer groups=wheel append=yes state=present createhome=yes
    become: yes


 # tasks to ADD REPO with Ansible's GIT MODULE
  - name: Add  Git Repo - BitBucket 
    git:
      repo: 'git@bitbucket.org:<your_username>/<your_repo>.git'
      dest: ~/code  # note this destination, you will avoid permissions issues
      accept_hostkey: yes # btw, this is for the ssh key forwarding
      recursive: no
    become: deployer # this guy (or gal) is a sudoer by now

# 額外的“hack”可以一次性更改文件和文件夾的權限,它與大寫 X 以及它適用於什么和不適用什么有關。 也是從另一個 stackoverflow 中提取的

- 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

我們可以簡單地讓用戶harry (在我的示例中為 www-data)使用與root相同的 authorized_keys 由 ssh 訪問。 這不會是安全問題,如果您可以連接到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 轉發它可以工作。 如果您的劇本已全局啟用“become: yes”,請確保為 git 任務將其關閉。 當你有“become: yes”時它不起作用的原因是因為root權限提升破壞了ssh轉發。 我不認為你需要成為一個 sudoer。 因為如果您的 Ansible 控制機器使用 ssh 密鑰通過 Bitbucket 進行身份驗證(您將 ssh 密鑰添加到存儲庫中),那么此身份驗證將通過 ssh 轉發傳遞。 您可以通過 ssh 測試它到您的目標並發出“ssh -T git@bitbucket.org”,您將在輸出中看到目標被 Bitbucket 接受為 Ansible 控制機器的用戶。 因此,只需使用明確的“become: no”來執行任務。 我同意克隆到目標上的 ~/something 。 否則會導致權限問題。 [編輯:讓它工作的另一件事 - ⁃ Repo URL 應該是 ssh 一個而不是 https 一個,沒有 ssh://(盡管 Ansible 手冊示例中寫了什么) ] 就安全性而言,如上所述, ssh 轉發是最好的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM