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

Dea*_*nMV 29 git sudo vagrant ansible 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
Run Code Online (Sandbox Code Playgroud)

在这种情况下使用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"}
Run Code Online (Sandbox Code Playgroud)

我在我的电脑上使用它的2.0.1.0,通常都是 - 文件夹/ var/www /有文件夹主要与所有者和组www-data

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

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

Jus*_*wig 45

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

- name: install setfacl support
  become: yes
  apt: pkg=acl
Run Code Online (Sandbox Code Playgroud)

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

- name: install setfacl support
  become: yes
  yum: name=acl
Run Code Online (Sandbox Code Playgroud)


Szt*_*upY 18

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

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

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

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

如果您无法进行上述任何更改来解决问题,并且您认为正在运行的计算机足够安全,您希望在那里运行的模块具有全局可读性,则可以allow_world_readable_tmpfilesansible.cfg文件中打开.设置allow_world_readable_tmpfiles会将此错误从错误更改为警告,并允许任务像2.1之前一样运行.

  • 谢谢你的重播.对我来说帮助第二个答案.我安装了acl-tools并解决了问题.在剧本中,我使用`become:true become_user:www-data`,一切顺利 (3认同)
  • 在Debian服务器上安装`acl`模块(选项2)对我来说是最简单的选择,如果你已经"在服务器上保留临时文件"进行调试,这也有效.我放弃了让Ansible流水线工作(OS X 10.11客户端,Debian 7服务器,尝试了各种配置文件更改,但没有任何工作).我还发现使用"以root身份连接"选项遇到了一个无关的错误,其中大部分的剧本都是默默跳过的. (3认同)