这木偶我的 Windows VM 上的代理未执行 PowerShell 脚本。我也使用一个非常简单的脚本对其进行了测试。该脚本存储在 C 盘上,名为 test.ps1。其内容如下:
"$(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 脚本仍然无法运行。我做错了什么?
答案1
该类型的 Puppet 资源exec
不会自行同步。它只会“刷新”自身,也就是说,只有当该资源收到另一个资源发出的信号,而该资源已成功从非同步状态转变,该命令才会运行。
file { 'C:\not-yet-existent':
ensure => 'file',
notify => Exec['Run Script'],
}
这不是一个很好的操作模式,因为如果您的脚本由于任何原因失败,Puppet 很可能不知道创建一个新的事件,因为资源file
现在是同步的。
最好不要使用refreshonly => true
,而是给 Puppet 一个提示来判断是否运行该命令。 类型可以通过其和exec
来做到这一点。onlyif
unless
参数,以及经常有用的(如您的情况)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',
}