在 Ansible 連接上以網路伺服器使用者身份執行 NextCloud PHP 腳本“occ”
如何編寫Ansible 任務以作為第三使用者執行 PHP 腳本;不是root使用者也不是連接使用者,而是“webserver”使用者?
occ
根據文件,NextCloud 管理程序必須以網路伺服器使用者身份執行:
sudo -u www-data php occ
為了成為執行命令的不同使用者,Ansible 提供了該
become
功能。Ansible 文件強烈建議不要嘗試以不同的非 root 使用者身份執行命令:如果模組文件在不使用的情況下執行,則一切都很好
become
,當become_user
是 root 時,或者當與遠端電腦的連接以 root 身份建立時。在這些情況下,Ansible 創建的模組文件的權限只允許使用者和 root 讀取,或者只允許切換到的非特權使用者讀取。但是,當連接使用者和
become_user
都是非特權使用者時,模組文件被寫入為 Ansible 連接的使用者 (theremote_user
),但該文件需要被 Ansible 設置為的使用者可讀。用於
become_user
該使用者連接使用者
sudo
有權作為第三個使用者執行命令:$ sudo -u www-data whoami www-data
當我
become_user
在任務上使用時,以該使用者身份執行命令:- name: "NextCloud: Instance configuration" become_user: "{{ web_process_user }}" command: cmd: >- php "{{ apache_nextcloud_dir }}/occ" maintenance:install --no-interaction …
更新:嗯,它有效。我不知道發生了什麼變化,但在嘗試重現問題時,它停止了。
作為該使用者使用
shell
顯式sudo
呼叫當我使用命令配置 Ansible 任務時
shell
:shell: >- su '{{ web_process_user }}' --shell '/bin/bash' -c ' \ php "{{ apache_nextcloud_dir }}/occ" …
Ansible 抱怨:
$$ WARNING $$: 考慮使用 ‘become’、‘become_method’ 和 ‘become_user’ 而不是執行 su
我很樂意這樣做。Ansible
become
將是一種比這種shell: su
hack 更優雅的方式。但是在使用 時
become
,會出現 Ansible 文件中描述的問題:通過連接發送的用於執行該命令的任務模組,無法獲得創建其臨時文件的權限。Ansible 文件建議:
- “使用流水線”:這失去了預設任務模組系統的優勢。
- “避免成為非特權使用者”:不是一個選項,因為正確執行此命令需要非特權網路伺服器使用者。
我應該如何製作一個以非特權第三使用者身份執行的 Ansible 任務?
php "{{ apache_nextcloud_dir }}/occ"
{{ web_process_user }}
更新:該
become
功能現在似乎可以正常工作。
我知道有兩種方法可以處理這個問題。您已經知道的第一個,但似乎被文件嚇跑了。但是,文件會準確地告訴您需要做什麼才能使其正常工作,因此如果第一次沒有成功,您應該仔細閱讀。
所以你需要做兩件事:
- 設置
become_user
為非特權使用者(此處為www-data
)。這將導致ansible sudo 到該使用者而不是root。- 配置
sudoers
為允許您的remote_user
to 。例如,如果您是:sudo``www-data``remote_user``ansible
ansible ALL=(www-data) NOPASSWD:ALL
請注意,這可能是可選的,因為通常已經配置 sudo 以允許 ansible 使用者對任何使用者進行 sudo,例如:
ansible ALL=(ALL) NOPASSWD:ALL
或者把它放在一個已經可以做到這一點的組中。
第二種方法是讓 Ansible 作為所需使用者(此處為
www-data
)而不是sudo 直接連接到遠端系統。您可以按如下方式執行此操作:
- 將 Ansible 的 ssh 公鑰添加到遠端使用者的
.ssh/authorized_keys
.- 為需要以該使用者身份執行的任務、塊、劇本、角色等設置
remote_user=www-data
和。become=no