我正在尝试使用 mac M1 通过 VM 设置 Windows 主机,但遇到了以下问题:
UNREACHABLE! => {"changed": false, "msg": "Failed to create temporary directory. In some cases, you may have been able to authenticate and did not have permissions on the target directory. Consider changing the remote tmp path in ansible.cfg to a path rooted in "/tmp", for more error information use -vvv. Failed command was: ( umask 77 && mkdir -p "echo \~/.ansible/tmp"&& mkdir "echo \~/.ansible/tmp/ansible-tmp-1673021425.449706-14817-109103252041296" && echo ansible-tmp-1673021425.449706-14817-109103252041296="echo \~/.ansible/tmp/ansible-tmp-1673021425.449706-14817-109103252041296" ), exited with result 1", "unreachable": true}
我尝试通过清单、环境变量设置远程 tmp,但问题仍然存在。我还尝试通过 SSH 和 WinRM 进行设置,但问题仍然存在。
我之前用过其他一些主机(包括 Windows),它们运行良好,但这次我搞不清楚为什么它们不工作了。我宁愿找到解决方案,也不愿创建新的虚拟机。
答案1
在主机文件(不是配置文件)中添加以下行。
[windows:vars]
remote_tmp = C:\Users\ans_user\Tmp
become_method = runas
ansible_shell_type = powershell
shell_type = powershell
答案2
连接到远程主机后、运行所需命令之前,Ansible 所做的第一件事就是创建一些临时文件夹。
正如你在错误消息中看到的那样,Ansible 尝试创建这些临时文件夹但使用 Linux 命令(umask、mkdir 等)。这就是问题所在!这些命令在 Windows 主机上不存在。
为什么 Ansible 认为主机“无法访问”,而实际上它能够连接、验证并运行命令(尽管这些命令不是目标平台的正确命令)?不知道,但这绝对具有误导性(即:该问题与网络完全无关)
无论如何,你必须明确地告诉 Ansible 您的远程主机是 Windows,这样它就不会错误地假设 Linux shell。控制使用哪个 shell 的 Ansible 变量是ansible_shell_type
,您可以在临时命令和清单文件中使用它。
ansible_shell_type
在 Windows 世界中,两个可能的值是命令或者电源外壳。使用哪一个取决于您如何设置 Windows 主机。如果您安装了 Windows内置 SSH 服务器它默认为命令除非你创建了一个特定注册表项启用电源外壳。
Ansible文档涵盖了这一主题。
以下是运行默认 SSHd 的 Windows 主机的临时示例(即:命令) 使用密码验证(主机名后的逗号很重要!):
ansible all -i winhost, -u winuser -k -e ansible_shell_type=cmd -m win_ping
等效库存示例:
[windows]
winhost
[windows:vars]
ansible_connection=ssh
ansible_user=winuser
ansible_password=winuserpassword
ansible_shell_type=cmd