30

我的服务器上有一个 ansible 2.1.0,我也通过vagrant和 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"}

我在我的电脑上使用的 ansible 2.0.1.0 都是正常的 - 文件夹 /var/www/ 有文件夹 main 和所有者和组 www-data

如果我只使用 become_user: www-data 并且如果我使用 become_method: sudo 和 become_user: www-data - 我得到了同样的错误

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

4

2 回答 2

47

在 debian/ubuntu 上,您可以通过首先acl在远程主机上安装软件包来解决这个问题,就像这个 ansible 任务一样:

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

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

- name: install setfacl support
  become: yes
  yum: name=acl
于 2016-05-08T05:26:23.320 回答
21

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

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

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

或者,如果您无法执行任何这些修复,那么您可以强制 ansible 以更不安全的方式运行(这似乎是 ansible 2 及以下版本中的默认设置),这也应该可以解决您的问题,但不会修复底层安全风险:

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

于 2016-04-17T20:07:58.240 回答