[英]Ansible: how to clone a repository as other user
我正在嘗試使用 Ansible 編寫部署規則。 其中一些步驟是:
我想在他的主目錄中以harry
用戶的身份克隆存儲庫(這就是我復制它的公鑰和私鑰的原因)。 問題是無法指定必須作為 git 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.