Puppet 在安装包之前执行命令
Puppet exec a command before the package is installed
我正试图在 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 属性不会触发命令。有人可以帮我实现这种行为吗?
有一个通知命令,它会发送一个 EXEC 通知,但那是在安装之后发生的。我需要的是在安装之前。提前致谢。
使它正常工作的诀窍是只有当你需要将脚本触发到 运行 时才必须编写 c:\Test\cleanup.ps1.file
,并且 exec 资源必须订阅它。否则,如果该文件没有更改,并且没有订阅 exec,则 exec 资源认为它不需要 运行 因此人偶 运行 完成但脚本永远不会触发。
根据您在此处粘贴的代码,您似乎在 class?我猜你是在 class 中更新还是在 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
我正试图在 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 属性不会触发命令。有人可以帮我实现这种行为吗? 有一个通知命令,它会发送一个 EXEC 通知,但那是在安装之后发生的。我需要的是在安装之前。提前致谢。
使它正常工作的诀窍是只有当你需要将脚本触发到 运行 时才必须编写 c:\Test\cleanup.ps1.file
,并且 exec 资源必须订阅它。否则,如果该文件没有更改,并且没有订阅 exec,则 exec 资源认为它不需要 运行 因此人偶 运行 完成但脚本永远不会触发。
根据您在此处粘贴的代码,您似乎在 class?我猜你是在 class 中更新还是在 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