Puppet在安装包之前执行命令

时间:2018-03-08 05:29:21

标签: puppet

我正在尝试在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通知,但是在安装之后会发生这种情况。我需要的是在安装之前。提前谢谢。

1 个答案:

答案 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