使用Ansible的vmware_vm_shell模块执行Windows退域加工作组命令失败求助
问题原因分析
- PowerShell命令行语法错误:直接拼接多行命令时未正确使用
-Command参数,嵌套引号导致命令被截断(从错误日志可见,命令仅执行到创建Credential的步骤,说明前序命令解析失败)。 - 进程等待逻辑冲突:
Remove-Computer -Restart会立即重启虚拟机,但wait_for_process: true会强制等待命令进程正常退出,这必然导致超时或执行失败。 - 变量引用嵌套问题:
vm_shell_args中混合使用双引号与单引号,导致Ansible变量解析异常,PowerShell无法正确获取密码值。
解决方案
1. 修正PowerShell命令格式
用PowerShell的-Command参数包裹完整脚本,同时处理引号转义,确保Ansible变量能正确传递到PowerShell环境。
2. 调整进程等待策略
将wait_for_process设为false,因为重启操作会直接终止当前进程,无法等待正常退出;后续可通过专门模块等待虚拟机重启完成。
3. 规避执行策略限制
添加-ExecutionPolicy Bypass参数,避免PowerShell默认执行策略阻止脚本运行。
修正后的Ansible任务
- name: Unjoin domain and join WORKGROUP for {{ vm_cloned_name }} community.vmware.vmware_vm_shell: datacenter: "{{ datacenter_name }}" folder: "/{{ datacenter_name }}/vm/" vm_id: "{{ vm_cloned_name }}" vm_username: "{{ localusername }}" vm_password: "{{ password }}" vm_shell: 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe' vm_shell_args: >- -ExecutionPolicy Bypass -Command "$Pass = '{{ ansible_password }}' | ConvertTo-SecureString -AsPlainText -Force; $cred = New-Object System.Management.Automation.PSCredential('{{ ansible_user }}', $Pass); Remove-Computer -UnJoinDomainCredential $cred -WorkgroupName 'LOCAL' -Force -Restart" vm_shell_cwd: 'C:\Users\administrator\Desktop' wait_for_process: false timeout: 60 register: workgroup_res tags: join-workgroup
额外验证步骤(可选)
若需要确认操作结果,可在后续添加任务等待虚拟机重启,并验证WORKGROUP成员身份:
- name: Wait for VM to restart and power on community.vmware.vmware_guest_wait_for: datacenter: "{{ datacenter_name }}" name: "{{ vm_cloned_name }}" state: poweredon timeout: 300 tags: join-workgroup - name: Verify WORKGROUP membership ansible.windows.win_command: net config workstation register: workstation_config delegate_to: "{{ vm_cloned_name }}" tags: join-workgroup
内容的提问来源于stack exchange,提问作者Kavisha Abeynayaka
相关产品推荐
相关产品推荐

