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