如何在 Puppet 中有条件地执行包?
How do I get a package conditionally executed in Puppet?
如何让包仅在 exec['get-chocolatey']
完成并成功时才执行?现在,包尝试在 exec 命令之前执行,因此失败并显示错误 reading
Chocolatey is not functional on the node
我不明白为什么 '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 Provider 的官方 Chocolatey 安装程序
链接资源有效,但为什么不直接使用 chocolatey
class 来确保安装?
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 包的组织使用
如果您是一个组织,您应该构建自己的包或重新编译包以不使用外部下载并为这些包托管您自己的内部包服务器。
这是由于信任、控制和对破损的低容忍度。以下资源提供了有关推理的更多上下文和解释。
见
How do I get the packages to only execute if and when exec['get-chocolatey'] is complete and successful?
您建立了需要的资源关系。您已经使用 require
属性完成了这些操作,您也可以使用链运算符来完成这些操作。
Right now, the packages try to get executed before the exec command
我认为不是。我观察到您的 Exec
被标记为只刷新。因此它的命令 根本不会执行 除非该资源从其他资源接收到事件。您的 class 中没有任何内容会产生此类事件。有可能从外部直接接收到事件,或者通过某些资源向包含的 class 发送信号,但由于命令不是 运行ning,因此情况似乎并非如此。
and hence fails with the error reading 'chocolatey is not functional on the node'. I don't get why 'require' doesn't work here.
我看不出有什么理由认为 require
不起作用。
我也不明白您为什么将 Exec
标记为只刷新。如果您只想在需要时将命令安排到 运行,那么请改用适当的 'unless' 或 'onlyif' 命令,或者使用它的 'creates' 属性。
这种依赖关系有一种通用形式,可能有助于减少 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
如何让包仅在 exec['get-chocolatey']
完成并成功时才执行?现在,包尝试在 exec 命令之前执行,因此失败并显示错误 reading
Chocolatey is not functional on the node
我不明白为什么 '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 Provider 的官方 Chocolatey 安装程序
链接资源有效,但为什么不直接使用 chocolatey
class 来确保安装?
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 包的组织使用
如果您是一个组织,您应该构建自己的包或重新编译包以不使用外部下载并为这些包托管您自己的内部包服务器。
这是由于信任、控制和对破损的低容忍度。以下资源提供了有关推理的更多上下文和解释。
见
How do I get the packages to only execute if and when exec['get-chocolatey'] is complete and successful?
您建立了需要的资源关系。您已经使用 require
属性完成了这些操作,您也可以使用链运算符来完成这些操作。
Right now, the packages try to get executed before the exec command
我认为不是。我观察到您的 Exec
被标记为只刷新。因此它的命令 根本不会执行 除非该资源从其他资源接收到事件。您的 class 中没有任何内容会产生此类事件。有可能从外部直接接收到事件,或者通过某些资源向包含的 class 发送信号,但由于命令不是 运行ning,因此情况似乎并非如此。
and hence fails with the error reading 'chocolatey is not functional on the node'. I don't get why 'require' doesn't work here.
我看不出有什么理由认为 require
不起作用。
我也不明白您为什么将 Exec
标记为只刷新。如果您只想在需要时将命令安排到 运行,那么请改用适当的 'unless' 或 'onlyif' 命令,或者使用它的 'creates' 属性。
这种依赖关系有一种通用形式,可能有助于减少 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