You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,但还是可以确认一下域管理员账号的默认区域设置:

  1. 登录到目标Windows服务器,切换到{{ domain.domain_admin }}账号
  2. 打开「控制面板→区域→管理」,确认「非Unicode程序的语言」设置为「俄语(俄罗斯)」
  3. 如果不是,修改后重启服务器再测试

这个操作能确保该账号登录时,所有控制台程序默认使用俄文编码。


测试时可以查看C:\1.txt的内容,如果$CLuster_Quorum能正确显示俄文名称,说明编码问题已经解决,Set-ClusterQuorum也能正常找到资源了。

内容的提问来源于stack exchange,提问作者Artem31

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 15:09:05