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

时间:2016-04-15 12:14:40

标签: git vagrant ansible sudo ansible-2.x

我的服务器上有一个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 - 我得到同样的错误

解决此问题需要做什么?

2 个答案:

答案 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之前的速度运行。