Ansible.builtin.wait_for模块结合Kerberos认证出现异常问题
看起来你遇到的问题是全局WinRM连接参数被错误地应用到了localhost导致的,我来帮你拆解下:
问题根源
你在vars.yml里定义的所有Ansible连接参数(比如ansible_connection: winrm、ansible_winrm_transport: kerberos)是全局生效的,当你把wait_for和uri任务delegate_to: localhost时,Ansible会尝试用这些Windows专属的连接参数去连接你的Debian控制节点(localhost)——而Linux主机根本不支持WinRM+Kerberos的连接方式,自然就抛出了Kerberos数据库找不到服务器的错误。
而之前的win_ping和收集facts任务能正常工作,是因为它们直接针对Windows目标主机,这些参数刚好适配。
解决方案
这里有两种简洁的修复方式,你可以根据自己的场景选择:
方案1:把Windows连接参数限定到目标主机组
把vars.yml里的WinRM相关参数移到你的inventory文件中,只给Windows主机组设置这些变量,这样localhost就不会继承到这些参数了。
比如你的inventory可以改成这样:
[windows_servers] my-server.ansible.com 10.10.10.10 [windows_servers:vars] ansible_user="{{ vault.ansible_account }}" ansible_password="{{ vault.ansible_password }}" ansible_connection=winrm ansible_port=5985 ansible_winrm_transport=kerberos
然后vars.yml里只保留必要的非全局变量即可。
方案2:在delegate任务中显式覆盖连接参数
如果你不想调整inventory结构,可以在每个delegate_to: localhost的任务里,临时覆盖连接参数,告诉Ansible用本地连接方式:
修改你的任务代码:
- name: Test Sleep 10 sec ansible.builtin.wait_for: timeout: 10 delegate_to: localhost vars: ansible_connection: local ansible_winrm_transport: '' - name: Test check webrequest ansible.builtin.uri: url: http://{{inventory_hostname}}:6666/ return_content: yes delegate_to: localhost vars: ansible_connection: local ansible_winrm_transport: ''
这样Ansible连接localhost时会用本地模式,不会再尝试Kerberos认证。
额外验证建议
你可以先单独测试一个只delegate到localhost的小任务,比如:
- name: Test local connection ansible.builtin.command: echo "Hello Local" delegate_to: localhost vars: ansible_connection: local
确认这个任务能正常执行后,再把同样的变量覆盖逻辑用到wait_for和uri任务上,就能解决问题了。
备注:内容来源于stack exchange,提问作者motorbass

