解决Ansible临时文件权限问题

47次阅读
没有评论

问题描述

在使用Ansible playbook时遇到了一个问题。他的playbook可以简化为以下内容:

- name: Provision server
  hosts: all_hosts
  become: yes
  roles:
    - { role: foo }

ansible.cfg中的以下设置可能也与问题相关:

[defaults]
allow_world_readable_tmpfiles = True
host_key_checking = False
log_path=./ansible.log
remote_user = ubuntu

尽管这个playbook可以成功配置10个服务器,但其中一个服务器却失败了,显示类似以下的错误信息:

[WARNING]: sftp transfer mechanism failed on [xx.xx.xxx.xxx]. Use ANSIBLE_DEBUG=1 to see detailed information [WARNING]: scp transfer mechanism failed on [xx.xx.xxx.xxx]. Use ANSIBLE_DEBUG=1 to see detailed information fatal: [host_1]: FAILED! => {"failed": true, "msg": "failed to transfer file to /home/ubuntu/.ansible/tmp/ansible-tmp-1500318083.01-204857088854554/stat.py:\n\nscp: /home/ubuntu/.ansible/tmp/ansible-tmp-1500318083.01-204857088854554/stat.py: Permission denied"}

用户通过SSH连接到出现问题的服务器和正常的服务器,并分别查看了最新的临时文件夹内容。正常的服务器文件权限为rwx --- ---,而出现问题的服务器文件权限却如下所示:

---x------ 1 ubuntu ubuntu 58378 Jul 17 14:09 file.py
---x------ 1 ubuntu ubuntu 56779 Jul 17 14:09 stat.py

问题出现在临时文件权限上。这可能是问题的根本原因,因为scp尝试写入这些文件时遇到权限问题。然而,错误消息似乎在暗示scp失败了,这一点与情况不太相符。
用户希望了解如何调试以及其他可能导致问题的地方。

解决方案

请注意以下操作可能涉及版本差异及风险,操作前请做好备份。

调试问题

为了调试此问题,您可以尝试以下步骤:
1. 设置ANSIBLE_DEBUG=1环境变量,以便查看详细信息。这将允许您更好地了解哪里出现了问题,以及错误消息的背后原因。
2. 检查服务器是否禁用了sftp,可能会影响文件传输机制。您可以尝试启用sftp并重新运行playbook,看是否能够解决问题。

修复权限问题

您的分析是正确的,权限问题可能导致scp无法写入临时文件。为了修复这个问题,您可以尝试以下方法:
1. 在[ssh_connection]部分中添加scp_if_ssh=True配置。这将强制Ansible在尝试scp传输之前,使用SSH协议进行连接,从而避免了权限问题。

下面是一个修改后的ansible.cfg示例:

[defaults]
allow_world_readable_tmpfiles = True
host_key_checking = False
log_path=./ansible.log
remote_user = ubuntu

[ssh_connection]
scp_if_ssh=True

这将确保使用SSH协议来进行传输,而不会受到权限问题的干扰。

验证解决方案

在应用了上述解决方案之后,您可以重新运行playbook,并确保服务器能够成功配置。如果问题得到解决,那么您已经成功修复了临时文件权限问题。

总结

在使用Ansible时,临时文件权限问题可能会导致文件传输失败。通过调试并修改配置文件,您可以成功解决这个问题。记得在操作前做好备份,并根据需要进行版本适配。

参考链接

正文完