如何编写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 抱怨:
[警告]:考虑使用 'become'、'become_method' 和 'become_user' 而不是运行 su
我很乐意这样做。Ansiblebecome
将是一种比这种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
请注意,这可能是可选的,因为通常已经配置 sudo 以允许 ansible 用户对任何用户进行 sudo,例如:
或者把它放在一个已经可以做到这一点的组中。
第二种方法是让 Ansible 作为所需用户(此处为
www-data
)而不是sudo 直接连接到远程系统。您可以按如下方式执行此操作:将 Ansible 的 ssh 公钥添加到远程用户的
.ssh/authorized_keys
.为需要以该用户身份运行的任务、块、剧本、角色等设置
remote_user=www-data
和。become=no