Windows-Server-2008

Puppet 未在 Windows 2008 伺服器上執行 PowerShell 腳本

  • February 22, 2015

我的 Windows VM 上的Puppet代理未執行 PowerShell 腳本。我也用一個非常簡單的腳本對其進行了測試。該腳本作為 test.ps1 儲存在 C 驅動器上。其內容如下:

"$(Get-Date -format F)" | Out-File C:\z.txt -Encoding ASCII

當我從 PowerShell 控制台手動將其作為 ./test.ps1 執行時,它工作正常並創建了文件 z.txt。但由於某種原因,Puppet 代理沒有執行它。我的 site.pp 的內容是:

exec { "Run Script":
       command => 'C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -Executionpolicy Unrestricted -File c:/test.ps1',
       logoutput => true,
       refreshonly => true,
}

虛擬機本身的“puppet agent -t”的輸出是:

C:\Users\Administrator>puppet agent -t
Info: Retrieving pluginfacts
Warning: Copying owner/mode/group from the source file on Windows is deprecated;
use source_permissions => ignore.
  (at C:/Program Files (x86)/Puppet Labs/Puppet/puppet/lib/puppet/type/file/sou
rce.rb:120:in `each')
Info: Retrieving plugin
Info: Caching catalog for f9881998-7fdf-4e96-a784-d9690fcd5495
Info: Applying configuration version '1410182959'
Notice: Finished catalog run in 0.42 seconds

所以在我看來,任何地方都沒有錯誤,但 PowerShell 腳本仍然沒有執行。我究竟做錯了什麼?

該類型的 Puppet 資源exec不會自行同步。它只會“刷新”自己,這意味著只有當資源從另一個資源接收到從非同步狀態成功更改的信號時,才會執行該命令。

file { 'C:\not-yet-existent':
   ensure => 'file',
   notify => Exec['Run Script'],
}

這不是一個很好的操作模式,因為如果您的腳本由於任何原因失敗,Puppet 很可能不知道創建新事件,因為file資源現在是同步的。

最好不要使用refreshonly => true,而是給 Puppet 一個提示,以確定是否執行該命令。該exec類型可以通過其onlyifunless 參數以及通常有用的(如您的情況)creates參數來執行此操作。

exec { "Run Script":
   command   => 'C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -Executionpolicy Unrestricted -File c:/test.ps1',
   logoutput => true,
   creates   => 'C:\z.txt',
}

引用自:https://serverfault.com/questions/627012