【问题标题】:How do I get a package conditionally executed in Puppet?如何在 Puppet 中获得有条件执行的包?
【发布时间】:2016-07-06 07:11:20
【问题描述】:

只有当exec['get-chocolatey'] 完成并成功时,我如何才能让包执行?现在,包试图在 exec 命令之前执行,因此失败并显示错误

Chocolatey 在节点上不起作用

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

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']
}

【问题讨论】:

  • 请添加运行 Puppet 的日志(最好使用 --debug)以显示您所描述的问题。

标签: package exec puppet chocolatey


【解决方案1】:

如何让包仅在 exec['get-chocolatey'] 完成且成功时执行?

您设置了需要的资源关系。您已经使用 require 属性完成了该操作,并且您也可以使用链运算符进行操作。

现在,包尝试在 exec 命令之前执行

我认为不会。我观察到您的Exec 被标记为仅刷新。因此,它的命令将不会被执行根本,除非该资源接收到来自其他资源的事件。您的班级中没有任何东西会产生这样的事件。有可能从外部直接或通过某些资源向包含类发出信号来接收事件,但由于命令未运行,情况似乎并非如此。

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

我认为没有理由认为 require 不起作用。

我也不明白你为什么标记了Exec refreshonly。如果您想安排命令仅在需要时运行,则改为使用适当的“除非”或“仅当”命令,或者使用其“创建”属性。

【讨论】:

  • 嗨,约翰,你是对的。我误解了“刷新”命令。我的意图是阻止 Choco 每 30 分钟重新安装一次。我的意思是优化脚本并减少执行时间。无论如何,删除 refreshonly 就可以了,现在它可以按预期工作了。谢谢。
  • 添加创建,仅当或除非为 exec 资源提供测试以确保幂等执行。
【解决方案2】:

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

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

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

include chocolatey

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

Chocolatey.org 包的组织使用

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

这是由于信任、控制和对破损的低容忍度。以下资源围绕推理提供了更多上下文和解释。

【讨论】:

  • 嗨,Rob,我可以做到的。我在编写脚本后遇到了该页面,但没有更改它,因为它正在运行。请快速提问 - 我如何让 Puppet 确认包安装?我收到以下错误:无法更新:执行“C:\ProgramData\chocolatey\bin\choco.exe install webpi -y”返回 4294967295:安装以下软件包:webpi 通过安装,您接受软件包的许可证。 webpi v5.0 正在安装 webpi... Chocolatey 等待命令完成超时。指定的超时时间为“2700”秒。也许尝试更高的--execution-timeout
  • 请注意,2700 秒是 45 分钟。听起来安装程序并非完全静音或有一些要求,因为它正在阻止等待输入。更高的执行超时不会让你工作。我也会更新我的答案。
【解决方案3】:

这种依赖有一种可概括的形式,可能有助于减少 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多