问题描述
在使用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时,临时文件权限问题可能会导致文件传输失败。通过调试并修改配置文件,您可以成功解决这个问题。记得在操作前做好备份,并根据需要进行版本适配。
参考链接