我如何写以第三个用户身份运行 PHP 脚本的 Ansible 任务;不是 root 用户也不是连接用户,而是“webserver”用户?
occ
根据文档,NextCloud 管理程序必须以 Web 服务器用户身份运行:
sudo -u www-data php occ
要成为运行命令的不同用户,Ansible 提供了该become
功能。Ansible 文档严厉地建议不要尝试以其他非 root 用户身份运行命令:
如果不使用 执行模块文件
become
,当become_user
是 root 时,或者当以 root 身份连接到远程计算机时,一切都会正常。在这些情况下,Ansible 会创建具有权限的模块文件,这些权限仅允许用户和 root 读取,或者仅允许切换到的非特权用户读取。然而,当连接用户和 都
become_user
为非特权时,模块文件会以 Ansible 连接的用户(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 抱怨:
[警告]:请考虑使用“become”、“become_method”和“become_user”,而不是运行 su
我很乐意这么做。Ansible 的become
方法比这个 hack 要优雅得多shell: su
。
但是在使用时become
,出现了 Ansible 文档中描述的问题:通过连接发送的用于运行该命令的任务模块无法获得创建其临时文件的权限。
Ansible 文档建议:
- “使用流水线”:这失去了默认任务模块系统的优势。
- “避免成为非特权用户”:不是一个选项,因为需要非特权的 Web 服务器用户才能正确运行此命令。
我该如何创建一个 Ansible 任务运行php "{{ apache_nextcloud_dir }}/occ"
作为非特权的第三用户 {{ web_process_user }}
?
更新:该become
功能现在似乎可以正常工作。
答案1
我知道有两种方法可以解决这个问题。第一种方法你已经知道了,但似乎被文档吓跑了。然而,文档准确地告诉你需要做什么才能让它工作,所以如果第一次没有成功,你应该仔细阅读一下。
因此你需要做两件事:
设置
become_user
为非特权用户(此处为www-data
)。这将导致 ansible 以 sudo 方式使用该用户,而不是 root 用户。配置
sudoers
以允许您的。remote_user
例如,如果您的是: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