如何在 Ansible YAML 中引用这个原始命令?

How to quote this raw command in Ansible YAML?

我正在使用 Ansible 来管理一堆 Windows 客户端的配置。作为记录,Ansible 剧本(即食谱)是用 YAML 编写的。

我需要在每个客户端上 运行 这个命令,我可以在客户端机器上的 Powershell 提示符下成功测试它:

> CMD /C 'control intl.cpl,, /f:"C:\Temp\intlsettings.xml"'

(注意单引号,因为文件名周围有双引号)

现在我 "just" 需要编写 YAML 剧本并使用 Ansible 中的原始模块将此命令发送到远程 Powershell 会话。这就是我被困的地方。我的命令包含 :'" 符号,所以我不知道如何正确引用它。

我已经尝试了一百万种变体,到目前为止都没有成功:

CMD /C 'control intl.cpl,, /f:"C:\Temp\intlsettings.xml"'
"CMD /C 'control intl.cpl,, /f:"C:\Temp\intlsettings.xml"'"
"CMD /C 'control intl.cpl,, /f:\"C:\Temp\intlsettings.xml\"'"
"CMD /C 'control intl.cpl,, /f\:\"C\:\Temp\intlsettings.xml\"'"

有关信息,最终剧本将类似于:

---
- name: Configure keyboard mappings
  hosts: windows

  tasks:
  - name: apply keyboard mappings config
    raw: CMD /C 'control intl.cpl,, /f:"C:\Temp\intlsettings.xml"'

如果你执行这个powershell命令

CMD /C 'control intl.cpl,, /f:"C:\Temp\intlsettings.xml"'

powershell 创建这个 CommandLine:

"C:\Windows\system32\cmd.exe" /C "control intl.cpl,, /f:"C:\Temp\intlsettings.xml""

请注意,命令行中未使用 '

但是,您不需要通过 cmd,因为您的命令中没有使用 cmd 功能。

control.exe intl.cpl,, /f:"C:\Temp\intlsettings.xml"

应该够了。

我不知道 ansible,但如果我正确理解 documentationraw 之后的所有文本都将作为命令通过 ssh 发送。这意味着,它被一些 shell 解释。如果这个 shell 是 cmd.exe,这应该有效:

tasks:
  - name: apply keyboard mappings config
    raw: control.exe intl.cpl,, /f:"C:\Temp\intlsettings.xml"

如果 shell 是 powershell(v3 及更高版本(win8 及更高版本的默认设置,win7 可安装)),这应该有效:

tasks:
  - name: apply keyboard mappings config
    raw: control.exe --% intl.cpl,, /f:"C:\Temp\intlsettings.xml"