如何在 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,但如果我正确理解 documentation,raw
之后的所有文本都将作为命令通过 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"
我正在使用 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,但如果我正确理解 documentation,raw
之后的所有文本都将作为命令通过 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"