如何在Puppet中有条件地执行包?

时间:2016-07-06 07:11:21

标签: package exec puppet chocolatey

如果exec['get-chocolatey']完成且成功,我如何才能执行包?现在,程序包尝试在exec命令之前执行,因此失败并显示错误读取

  

Chocolatey在节点上不起作用

我不明白为什么'要求'在这里不起作用。

exec { 'get-chocolatey':
    path        => 'C:\Windows\system32\WindowsPowerShell\v1.0',
    command     => 'Powershell.exe "Invoke-WebRequest https://chocolatey.org/install.ps1 -UseBasicParsing | Invoke-Expression"',
    refreshonly => true,
    logoutput   => true
}

package { 'webpi':
    provider => 'chocolatey',
    ensure   => latest,
    require  => Exec['get-chocolatey']
}

package { 'redis-64':
    provider => 'chocolatey',
    ensure   => latest,
    require  => Exec['get-chocolatey']
}

3 个答案:

答案 0 :(得分:2)

  

如果exec ['get-chocolatey']完成且成功,我怎样才能让包执行?

您需要设置资源关系。您已使用require属性完成了哪些操作,以及您可以使用链操作符执行哪些操作。

  

现在,程序包尝试在exec命令

之前执行

我想不是。我注意到你的Exec被标记为刷新。因此,除非该资源从某个其他资源接收事件,否则其命令将不会在处执行。你班上没有任何东西会产生这样的事件。有可能直接或通过信号包含类的某个资源从外部接收事件,但由于命令未运行,情况似乎并非如此。

  

因此错误读取'chocolatey在节点上不起作用'失败。我不明白为什么'要求'在这里不起作用。

我认为没有理由认为require无效。

我也不明白为什么你已经标记了Exec。如果您希望安排命令仅在需要时运行,则使用适当的'unless'或'onlyif'命令,或者使用其'creates'属性。

答案 1 :(得分:1)

使用Puppet Provider的官方Chocolatey安装程序

链接资源有效,但为什么不使用chocolatey类来确保安装?

https://forge.puppet.com/chocolatey/chocolatey#usage

include chocolatey

OR

class {'chocolatey':
  chocolatey_download_url         => 'https://internalurl/to/chocolatey.nupkg',
  use_7zip                        => false,
  choco_install_timeout_seconds   => 2700,
}

Chocolatey.org包的组织使用

如果您是一个组织,您应该构建自己的软件包或重新编译软件包,以便不使用外部下载并为这些软件包托管您自己的内部软件包服务器。

这是由于信任,控制和对破损的容忍度低。以下资源提供了有关推理的更多背景和解释。

答案 2 :(得分:0)

这种依赖的一种可推广形式可能有助于减少require语句的重复。

这说" get-chocolatey"应该在使用Chocolatey提供程序的任何包资源之前发生。

Exec['get-chocolatey'] -> Package<| provider == 'chocolatey' |>

您可以在此处详细了解。

https://docs.puppet.com/puppet/latest/reference/lang_relationships.html#syntax-chaining-arrows

在这里

https://docs.puppet.com/puppet/latest/reference/lang_collectors.html