在具有共享 NFS 挂载的服务器上运行 playbook

Posted

技术标签:

【中文标题】在具有共享 NFS 挂载的服务器上运行 playbook【英文标题】:Run playbook on servers with shared NFS mount 【发布时间】:2016-04-21 20:24:57 【问题描述】:

我有以下 Ansible playbook 可以跨集群进行包更新:

- hosts: cluster
  become: true
  become_user: root
  tasks:
   - name: updates a server
     apt: update_cache=yes
   - name: upgrade a server
     apt: upgrade=full

当我运行它时,作为 NFS 控制器的节点执行得很好,但是在主目录上具有 NFS 挂载的两个节点失败并出现以下错误:

$ansible-playbook upgrade-servers.yml  -K
SUDO password:

PLAY ***************************************************************************

TASK [setup] *******************************************************************
fatal: [nej-worker2]: FAILED! => "changed": false, "failed": true, "module_stderr": "", "module_stdout": "\r\n/usr/bin/python: can't open file '/home/gms/.ansible/tmp/ansible-tmp-1461269057.4-144211747884693/setup': [Errno 13] Permission denied\r\n", "msg": "MODULE FAILURE", "parsed": false
ok: [iznej]
fatal: [nej-worker1]: FAILED! => "changed": false, "failed": true, "module_stderr": "", "module_stdout": "\r\n/usr/bin/python: can't open file '/home/gms/.ansible/tmp/ansible-tmp-1461269057.4-16590584976890/setup': [Errno 13] Permission denied\r\n", "msg": "MODULE FAILURE", "parsed": false

TASK [updates a server] ********************************************************
ok: [iznej]

TASK [upgrade a server] ********************************************************
changed: [iznej]

NO MORE HOSTS LEFT *************************************************************

PLAY RECAP *********************************************************************
iznej                      : ok=3    changed=1    unreachable=0    failed=0
nej-worker1                : ok=0    changed=0    unreachable=0    failed=1
nej-worker2                : ok=0    changed=0    unreachable=0    failed=1

我在共享上运行 pip 时遇到了类似的问题,修复是使用 --set-build 重定向构建目录...我假设这是 Ansible 的问题,因为它正在 NFS 上运行控制器,而不是带有共享/安装驱动器的服务器的控制器。

【问题讨论】:

【参考方案1】:

知道了。需要将 remote_tmp = /tmp/.ansible 添加到我的 ansible.cfg 文件中。见这里Ansible config parameters 瞧!

问题是当 Ansible 执行 sudo 时,root 帐户不是 NFS 挂载共享上的用户帐户。

【讨论】:

【参考方案2】:

引用 RHEL 6 安全指南:

"默认情况下,NFS 共享将 root 用户更改为 nfsnobody 用户, 非特权用户帐户。这将更改所有根创建的所有者 文件到 nfsnobody,这会阻止使用 setuid 位设置。如果使用 no_root_squash [option],则远程 root 用户 能够更改共享文件系统上的任何文件并离开 其他用户无意中被木马感染的应用程序 执行。”

换句话说,这是一种默认且安全的 NFS 行为。

【讨论】:

以上是关于在具有共享 NFS 挂载的服务器上运行 playbook的主要内容,如果未能解决你的问题,请参考以下文章

linux下nfs客户机挂载服务器上的共享目录时,出现权限不够的错误,怎么解决?

使用用户名/密码使用 nfs 挂载网络共享

NFS共享存储服务的部署

如何使用 autofs 在 IPA 服务器上挂载 NFS 共享

如何为具有共享 NFS 挂载的 2 个节点设置 Jackrabbit Repository.xml?

无法在 Windows 客户端上挂载 NFS 共享