我的服务器上有一个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之前一样运行。