Ansible

在 Ansible 連接上以網路伺服器使用者身份執行 NextCloud PHP 腳本“occ”

  • July 10, 2021

如何編寫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 連接的使用者 (the remote_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

我很樂意這樣做。Ansiblebecome將是一種比這種shell: suhack 更優雅的方式。

但是在使用 時become,會出現 Ansible 文件中描述的問題:通過連接發送的用於執行該命令的任務模組,無法獲得創建其臨時文件的權限。

Ansible 文件建議:

  • “使用流水線”:這失去了預設任務模組系統的優勢。
  • “避免成為非特權使用者”:不是一個選項,因為正確執行此命令需要非特權網路伺服器使用者。

我應該如何製作一個以非特權第三使用者身份執行的 Ansible 任務php "{{ apache_nextcloud_dir }}/occ" {{ web_process_user }}

更新:該become功能現在似乎可以正常工作。

我知道有兩種方法可以處理這個問題。您已經知道的第一個,但似乎被文件嚇跑了。但是,文件會準確地告訴您需要做什麼才能使其正常工作,因此如果第一次沒有成功,您應該仔細閱讀。

所以你需要做兩件事:

  1. 設置become_user為非特權使用者(此處為www-data)。這將導致ansible sudo 到該使用者而不是root。
  2. 配置sudoers為允許您的remote_userto 。例如,如果您是:sudo``www-data``remote_user``ansible
ansible ALL=(www-data) NOPASSWD:ALL

請注意,這可能是可選的,因為通常已經配置 sudo 以允許 ansible 使用者對任何使用者進行 sudo,例如:

ansible ALL=(ALL) NOPASSWD:ALL

或者把它放在一個已經可以做到這一點的組中。


第二種方法是讓 Ansible 作為所需使用者(此處為www-data)而不是sudo 直接連接到遠端系統。您可以按如下方式執行此操作:

  1. 將 Ansible 的 ssh 公鑰添加到遠端使用者的.ssh/authorized_keys.
  2. 為需要以該使用者身份執行的任務、塊、劇本、角色等設置remote_user=www-data和。become=no

引用自:https://serverfault.com/questions/1068972