我正在尝试在Pacakage开始安装msi安装程序之前运行电源shell脚本。该脚本清除某些阻止安装程序的未受管理资源。 我试过的是,
file { 'c:\Test\cleanup.ps1.file' :
path => 'c:\Test\cleanup.ps1',
ensure => present,
source => 'puppet:///modules/test/cleanup.ps1',
source_permissions => ignore,
}
exec { 'c:\Test\cleanup.ps1.file':
refreshonly => true,
provider => powershell,
}
package { 'ServiceInstaller':
ensure => $version,
require => [Package['Service1Installer'],Exec['c:\Test\cleanup.ps1']],
}
但是require属性并没有触发命令。有人可以帮我实现这个行为。 有这个notify命令,它会发送一个EXEC通知,但是在安装之后会发生这种情况。我需要的是在安装之前。提前谢谢。
答案 0 :(得分:1)
让这种方法正常工作的诀窍是,只有在需要触发脚本运行时才需要编写c:\Test\cleanup.ps1.file
,并且exec资源必须订阅它。否则,如果该文件没有更改,并且exec未被订阅,则exec资源不认为它需要运行,因此puppet运行完成但脚本永远不会触发。
根据您在此处粘贴的代码,您似乎在课程中指定了$version
?当你想要升级时,我猜你是在课堂上还是在hiera中更新?如果是这样,您可以让c:\Test\cleanup.ps1.file
文件编写内联模板,并将版本号放在该文件中。当您在puppet的class / hiera / wherever中更新版本时,您正在执行此操作,文件将更新并且exec将启动。
这看起来像是:
file { 'c:\Test\cleanup.ps1.file' :
path => 'c:\Test\cleanup.ps1',
ensure => present,
content => inline_template("<%= @version %>"),
source_permissions => ignore,
}
exec { 'c:\Test\cleanup.ps1.file':
refreshonly => true,
provider => powershell,
subscribe => File['c:\Test\cleanup.ps1.file'],
}
package { 'ServiceInstaller':
ensure => $version,
require => [Package['Service1Installer'],Exec['c:\Test\cleanup.ps1']],
}
这假设您只是尝试使用cleanup.ps1.file
作为exec的触发器。如果该文件中有东西需要用于其他目的,那么请保留该声明,并将另一个文件声明作为触发器文件,仅使用内联模板中的版本,并将exec订阅到该文件而不是cleanup.ps1.file