Puppet 未在 Windows 2008 服务器上运行 PowerShell 脚本

Puppet 未在 Windows 2008 服务器上运行 PowerShell 脚本

木偶我的 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来做到这一点。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',
}

相关内容