Ansible中set_fact定义的LAPS密码无法用于WinRM连接问题
问题分析与解决
核心问题
你遇到的两个错误根源都是变量引用方式错误:
- 直接写
ansible_password: lapsPass时,Ansible会把字符串lapsPass当作密码发送,而非你通过set_fact定义的变量值,所以服务器拒绝认证。 - 若写成
ansible_password: '{{ lapsPass }}'却提示变量未定义,大概率是语法格式问题(比如引号嵌套错误),而非变量真的不存在。
修正后的Playbook
--- - name: LAPS Test Playbook hosts: localhost vars: host: myserver kdc: dc01.domain.com tasks: - name: Clear existing Kerberos tokens command: kdestroy ignore_errors: True - name: Get password using simple auth over LDAPS set_fact: lapsPass: "{{ lookup('laps_password', host, domain=kdc, scheme='ldaps', auth='simple', username='user@DOMAIN.COM', password='mypassword') }}" - name: Test output debug: var: lapsPass - name: Get disk facts community.windows.win_disk_facts: delegate_to: myserver vars: ansible_user: localadmin ansible_password: "{{ lapsPass }}" # 关键修正:正确引用变量 ansible_port: 5985 ansible_connection: winrm ansible_winrm_transport: basic # 修正错误参数名:原参数ansible_connection_transport无效 ansible_winrm_server_cert_validation: ignore ansible_winrm_operation_timeout_sec: 600 ansible_winrm_read_timeout_sec: 660 - name: Output disk facts debug: var: ansible_facts.disks[0]
额外注意事项
- 参数名修正:原Playbook中的
ansible_connection_transport是无效参数,WinRM传输方式的正确参数为ansible_winrm_transport,这个错误也可能导致连接异常。 - 特殊字符处理:如果LAPS返回的密码包含特殊字符(如
$、!等),无需额外转义,Ansible模板引擎会自动处理,保持{{ lapsPass }}的引用方式即可。 - 变量作用域验证:若仍提示变量未定义,可在
Get disk facts任务前添加验证步骤,确认变量可正常访问:- name: Verify variable accessibility debug: var: lapsPass delegate_to: myserver
内容的提问来源于stack exchange,提问作者Lagamorph
相关产品推荐
相关产品推荐

