我的服务器上有一个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"}
我在我的电脑上使用它的2.0.1.0,通常都是 - 文件夹/ var / www /有文件夹主要与所有者和组www-data
如果我只使用become_user:www-data,如果我使用become_method:sudo with become_user:www-data - 我得到同样的错误
解决此问题需要做什么?
答案 0 :(得分:43)
在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
答案 1 :(得分:16)
问题是www-data
无法访问您用来连接到计算机的默认非root ansible用户创建的相同文件。此外,错误消息明确指向ansible's documentation,其中描述了从ansible 2.0或更低版本升级时需要解决此问题的选项。
他们提出了三种正确解决问题的方法:
- 使用流水线。启用流水线操作时,Ansible不会将模块保存到客户端上的临时文件中。相反,它将模块传递给远程python解释器的stdin。流水线操作不适用于非python模块。
- 在托管主机上安装filesystem acl支持。如果远程主机上的临时目录安装时启用了文件系统acls并且setfacl工具位于远程PATH中,那么Ansible将使用filesystem acls与第二个非特权组件共享模块文件,而不必让所有人都可以读取文件。 / LI>
- 不要通过成为非特权用户在远程计算机上执行操作。当您成为root或不使用成员时,临时文件受UNIX文件权限保护。在Ansible 2.1及更高版本中,如果以root用户身份连接到受管计算机,然后使用变为非特权帐户,则UNIX文件权限也是安全的。
或者如果你不能做任何这些修复,那么你可以强制ansible以更不安全的方式运行(这似乎是ansible 2及以下的默认方式),这也应该解决你的问题,但不会修复潜在的安全风险:
如果您无法进行上述任何更改来解决问题,并且您认为正在运行的计算机足够安全,您希望在那里运行的模块具有全局可读性,则可以打开{{ 1 {}在
allow_world_readable_tmpfiles
文件中。设置ansible.cfg
会将此错误更改为警告,并允许任务按2.1之前的速度运行。