Ansible 2.1.0使用beke/become_user无法设置临时文件的权限



我的服务器上有一个ansible 2.1.0,我通过流浪和PC进行部署。角色"部署"有:

- name: upload code
  become: true
  become_user: www-data
  git: repo=git@bitbucket.org:****.git
     dest=/var/www/main
     key_file=/var/www/.ssh/id_rsa
     accept_hostkey=true
     update=yes
     force=yes
 register: fresh_code
 notify: restart php-fpm
 tags: fresh_code

在这种情况下,ansible 2.1.0我得到一个错误:

fatal: [default]: FAILED! => {"failed": true, "msg": "Failed to set permissions on the temporary files Ansible needs to create when becoming an unprivileged user. For information on working around this, see https://docs.ansible.com/ansible/become.html#becoming-an-unprivileged-user"}

我在电脑上使用的版本是2.0.1.0,通常都是文件夹/var/www/have文件夹主,所有者和组www数据

如果我只使用became_user:www数据,如果我使用become_method:sudo和became_uuser:www数据-我得到了相同的错误

需要做些什么来解决这个问题?

在debian/ubuntu上,您可以通过首先在远程主机上安装acl包来解决此问题,就像下面的任务一样:

- name: install setfacl support
  become: yes
  apt: pkg=acl

与redhat/centros相同——在远程主机上安装acl软件包:

- name: install setfacl support
  become: yes
  yum: name=acl

问题是www-data无法访问默认的非root ansible用户创建的用于连接到机器的相同文件。此外,错误消息清楚地指向ansible的文档,该文档描述了从ansible 2.0或更低版本升级时,您必须使用哪些选项来解决此问题。

他们提出了三种正确解决问题的方法:

  • 使用流水线。当启用流水线时,Ansible不会将模块保存到客户端的临时文件中。相反,它通过管道将模块传输到远程python解释器的stdin。流水线不适用于非python模块
  • 在托管主机上安装文件系统acl支持。如果远程主机上的临时目录安装时启用了文件系统ACL,并且setfacl工具位于远程PATH中,那么Ansible将使用文件系统ACL与第二个无特权用户共享模块文件,而不必让每个人都能读取该文件
  • 不要通过成为无特权用户在远程计算机上执行操作。当您成为root用户或不使用成为时,临时文件受UNIX文件权限的保护。在Ansible 2.1及更高版本中,如果您以root身份连接到受管计算机,然后使用成为无特权帐户,则UNIX文件权限也是安全的

或者,如果你不能进行任何这些修复,那么你可以强制ansible以一种更不安全的方式运行(这似乎是ansible 2及以下版本中的默认方式),这也应该解决你的问题,但不会解决潜在的安全风险:

如果您无法进行上述任何更改来解决问题,并且您决定运行的机器足够安全,您想在其中运行的模块可以在世界范围内读取,则可以在ansible.cfg文件中打开allow_world_readable_tmpfiles。设置allow_world_readable_tmpfiles会将其从错误更改为警告,并允许任务像2.1之前一样运行。

最新更新