String 如何在Ansible YAML中引用此原始命令?

String 如何在Ansible YAML中引用此原始命令?,string,powershell,yaml,quoting,String,Powershell,Yaml,Quoting,我正在使用Ansible管理大量Windows客户端的配置。为了记录在案,Ansible剧本(即食谱)是用YAML编写的 我需要在每个客户端上运行此命令,并且我可以在客户端计算机上的Powershell提示符中成功测试它: > CMD /C 'control intl.cpl,, /f:"C:\Temp\intlsettings.xml"' (注意单引号,这是必需的,因为文件名周围有双引号) 现在我“只”需要编写一个YAML剧本,并使用Ansible的原始模块将此命令发送到远程Power

我正在使用Ansible管理大量Windows客户端的配置。为了记录在案,Ansible剧本(即食谱)是用YAML编写的

我需要在每个客户端上运行此命令,并且我可以在客户端计算机上的Powershell提示符中成功测试它:

> CMD /C 'control intl.cpl,, /f:"C:\Temp\intlsettings.xml"'
(注意单引号,这是必需的,因为文件名周围有双引号)

现在我“只”需要编写一个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创建以下内容:

注意,命令行中不使用

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

control.exe intl.cpl,, /f:"C:\Temp\intlsettings.xml"
应该足够了

我不知道ansible,但是如果我理解正确,
raw
之后的所有文本都是通过ssh作为命令发送的。这意味着,它是由某个shell解释的。如果这个shell是cmd.exe,这应该可以工作:

tasks:
  - name: apply keyboard mappings config
    raw: control.exe intl.cpl,, /f:"C:\Temp\intlsettings.xml"
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"
tasks:
  - name: apply keyboard mappings config
    raw: control.exe --% intl.cpl,, /f:"C:\Temp\intlsettings.xml"

谢谢,我会在有机会的时候进行测试。我能接触到的所有示例都使用PowerShell作为默认shell。这很有意义,因为我必须在Windows客户端上配置PowerShell,以便它接受Ansible发送的命令。这可能就是为什么需要CMD/C从PowerShell调用CMD shell的原因。无论如何,感谢您的reply!如果shell实际上是powershell,并且我正确理解了ansible文档,那么您的原始命令应该可以工作。我添加了另一个代码段,这也应该可以工作。如果两者都不能工作,那么我可能误解了ansible文档。