puppet - 重构 ensure_packages 以切换已安装包的版本
问题描述
我在 Debian linux 上使用 puppet 按版本成功安装了几个 PHP 模块,如下所示:
$php_version = '7.3'
ensure_packages([
"php$php_version-xml",
"php$php_version-zip",
"php$php_version-curl",
"php$php_version-mbstring",
"libapache2-mod-php$php_version",
],
{
'ensure' => 'present',
}
)
现在我想准备从 PHP 7.3 到 7.4 的更新。这基本上可以工作,但 7.3 包仍然安装。我想修改代码以删除旧包。我正在寻找一种方法来重用模块包列表进行卸载。
我正在考虑这样的签名
class profile::software::apache (
$php_version = '7.4',
$php_remove = ['7.0‘, ‘7.3'],
#...
) {
$myPackages = [
"php$php_version-xml",
"php$php_version-zip",
"php$php_version-curl",
"php$php_version-mbstring",
"libapache2-mod-php$php_version",
]
ensure_packages($myPackages,
{
'ensure' => 'present',
}
)
$php_remove.each | String $php_version | {
ensure_packages($myPackages,
{
'ensure' => 'absent',
}
)
}
}
有没有办法解决这个问题?
谢谢
解决方案
我能够通过使用 puppet 的迭代函数来解决这个问题。
从这两个参数中,我构建了一个哈希,其中包含要处理的版本键和安装或删除给定版本的值。现在我可以遍历这个散列,重用结构:
class profile::software::apache (
$php_version = '7.4',
$php_remove = ['7.0‘, ‘7.3'],
#...
) {
# build a hash of PHP Versions with a value of either present or absent
# and iterate over it with each
$phpInstallHash = { $php_version => 'present' }
#notify { "Value of phpRemove: ${php_remove}": }
if $php_remove {
# We have the array, use the map function to build remove hash
$phpRemoveHash = $php_remove.map |$version| {
{ $version => 'absent' }
}
$phpFullHash = $phpInstallHash + $phpRemoveHash
} else {
$phpFullHash = $phpInstallHash
}
#notify { "phpHash to iterate over to install/uninstall: ${phpFullHash}": }
#iterate over the result installing/uninstalling
$phpFullHash.each | $php_version, $ensure_value | {
ensure_packages([
"php$php_version-xml",
"php$php_version-zip",
"php$php_version-curl",
"php$php_version-mbstring",
"libapache2-mod-php$php_version",
],
{
'ensure' => $ensure_value,
require => [Class['apt::update'],
Apt::Source['source_php_sury'],
],
notify => Class['apache::service'],
}
)
}
}
hth
推荐阅读
- node.js - 包装现有 net.Socket 的 nodejs 抛出 EEXISTS
- javascript - 将数据传输到另一个文件中的 PHP 数组后,jQuery 数组的数据不会显示在数据库中
- react-native - React Native TextInput returnKeyType 不起作用
- sql-server - SQL Server 在 DBI::dbSendStatement() 和 DBI::dbBind() 中使用了错误的数据类型
- reactjs - React 重新渲染不必要的组件
- r - R为多个(相似)变量(eq.var1,var2,var3)重复case_when
- shell - 如何在 perl 中将 ascii 编码文件转换为 utf-8 编码?
- hadoop - 如何在 Hive 中透视数据?
- sql - 如何在 ssms 中对打开的 sql server 表进行排序
- node.js - 节点 - 收集作业并将它们作为具有超时的批次使用