2016-04-28 73 views
1

我使用Ansible來管理一堆Windows客戶端的配置。爲了記錄,Ansible劇本(即食譜)是用YAML寫的。如何在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"' 

回答

1

如果執行此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"" 

請注意,在CommandLine中沒有使用'

但是,您不需要通過cmd,因爲您的命令中沒有使用cmd功能。

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

應該足夠了。

我不知道是否可以,但是如果我正確理解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" 
+0

謝謝,我會在有機會的時候測試一下。我可以使用PowerShell作爲默認shell的所有示例。這很有意義,因爲我必須在Windows客戶端上配置PowerShell,以便接受來自Ansible的命令。這可能是爲什麼CMD/C是必需的,從PowerShell調用CMD shell。無論如何,感謝您的回覆! –

+0

如果shell實際上是powershell,並且如果我理解了正確的文檔,那麼您的原始命令應該可以工作。我添加了另一個代碼片段,這也應該起作用。如果兩者都不起作用,我可能誤解了有用的文檔。 –