Ansible从Linux主机委托任务至Windows主机失败问题排查
问题根源
你遇到的连接失败,是因为Ansible默认沿用了Linux控制节点的SSH连接方式去访问Windows主机,但Windows主机需要通过WinRM协议连接,而非SSH,所以直接使用delegate_to会导致连接方式不匹配。
解决步骤
1. 配置Windows主机的WinRM连接参数
在Ansible的inventory文件(如hosts)中,为windowsVM添加WinRM专属连接变量,明确告诉Ansible用WinRM协议连接它:
[windows] windowsVM ansible_host=你的Windows主机IP ansible_connection=winrm ansible_winrm_transport=ntlm ansible_winrm_server_cert_validation=ignore ansible_user=Windows管理员账号 ansible_password=对应密码
参数说明:
ansible_connection=winrm:指定用WinRM协议连接ansible_winrm_transport=ntlm:常用的Windows认证方式,可根据你的环境调整ansible_winrm_server_cert_validation=ignore:如果Windows用的是自签名证书,关闭证书验证避免报错ansible_user/ansible_password:Windows主机的登录凭据
2. 调整Playbook任务
你的uri任务逻辑没问题,但需要确保委托时使用正确的连接规则。如果inventory已经配置好参数,直接保留delegate_to即可;也可以在任务中临时指定连接变量(适合临时测试场景):
- name: Send a notification to MS Teams uri: url: "https://abcd.webhook.office.com/webhookb2/xyz" method: POST body: title: "Test Title" text: "Test text" body_format: json # Teams WebHook要求JSON格式请求体,必须添加这个参数 delegate_to: windowsVM # 若未在inventory配置,可在此临时指定WinRM参数 vars: ansible_connection: winrm ansible_winrm_transport: ntlm ansible_winrm_server_cert_validation: ignore ansible_user: Windows管理员账号 ansible_password:对应密码
3. 验证WinRM连接有效性
先单独测试Windows主机的连通性,确保WinRM配置正常:
ansible windowsVM -m win_ping
返回pong则说明连接正常,此时再运行Playbook就不会出现SSH连接失败的问题。
提示:明文密码不安全,建议用
ansible-vault加密密码,或通过环境变量、密钥管理工具传递凭据。
内容的提问来源于stack exchange,提问作者suj
相关产品推荐
相关产品推荐

