Ansible执行PowerShell脚本时变量语言不一致导致故障转移集群配置失败问题求助
解决Ansible执行PowerShell时俄文集群磁盘名称转英文导致的故障
我之前碰到过类似的Windows区域编码+Ansible交互的问题,结合你的环境和报错信息,核心问题应该是控制台代码页不匹配——虽然Get-Culture显示区域是ru-RU,但Ansible通过runas提权执行PowerShell时,控制台默认代码页还是英文(437),导致俄文命名的磁盘名称被自动转换成了英文别名(比如Диск кластера 1变成Cluster Disk 1),最终Set-ClusterQuorum找不到对应资源。
下面是几个针对性的解决方案,按优先级排序:
方案1:直接通过磁盘对象传递(最稳健)
跳过磁盘名称的字符串编码问题,直接用PowerShell对象传递给后续命令。修改你的win_shell代码:
## 添加仲裁磁盘 $Quorum_disk = (Get-Volume | Where-Object {$_.FileSystemLabel -eq "Quorum"} | Get-Partition | Get-Disk).Number # 直接获取磁盘对象,不提取Name属性 $ClusterQuorumDisk = Get-ClusterAvailableDisk | Where-Object {$_.Number -eq $Quorum_disk} $ClusterQuorumDisk >> C:\1.txt Get-Culture >> C:\1.txt $ClusterQuorumDisk | Add-ClusterDisk Start-Sleep -Milliseconds 1500 # 直接传入磁盘对象,而非字符串名称 Set-ClusterQuorum -DiskWitness $ClusterQuorumDisk
这种方式完全避免了名称字符串的编码转换问题,PowerShell会直接识别对象对应的集群资源。
方案2:强制设置控制台代码页为俄文
在PowerShell代码开头添加代码页切换命令,确保后续命令的输出和变量获取都使用俄文编码(1251):
- name: 创建故障转移集群 become: yes become_user: "{{ domain.domain_admin }}" become_flags: logon_type=interactive logon_flags=with_profile become_method: runas vars: ansible_become_pass: "{{ domain.password }}" ansible_win_shell_encoding: cp1251 # 让Ansible和PowerShell编码对齐 win_shell: | chcp 1251 > $null # 切换到俄文控制台代码页,屏蔽输出 ## 添加仲裁磁盘 $Quorum_disk = (Get-Volume | Where-Object {$_.FileSystemLabel -eq "Quorum"} | Get-Partition | Get-Disk).Number $CLuster_Quorum = (Get-ClusterAvailableDisk | Where-Object {$_.Number -eq $Quorum_disk}).Name $CLuster_Quorum >> C:\1.txt Get-Culture >> C:\1.txt Get-ClusterAvailableDisk | Where {$_.Number -eq $Quorum_disk} | Add-ClusterDisk Start-Sleep -Milliseconds 1500 Set-ClusterQuorum -DiskWitness $CLuster_Quorum
这里的chcp 1251会强制控制台使用俄文编码,配合ansible_win_shell_encoding: cp1251确保Ansible接收输出时不会乱码或转换字符。
方案3:检查域用户的区域设置
虽然你用了logon_flags=with_profile,但还是可以确认一下域管理员账号的默认区域设置:
- 登录到目标Windows服务器,切换到
{{ domain.domain_admin }}账号 - 打开「控制面板→区域→管理」,确认「非Unicode程序的语言」设置为「俄语(俄罗斯)」
- 如果不是,修改后重启服务器再测试
这个操作能确保该账号登录时,所有控制台程序默认使用俄文编码。
测试时可以查看C:\1.txt的内容,如果$CLuster_Quorum能正确显示俄文名称,说明编码问题已经解决,Set-ClusterQuorum也能正常找到资源了。
内容的提问来源于stack exchange,提问作者Artem31
相关产品推荐
相关产品推荐

