如何从Puppet嵌套结构体中提取唯一的allowed_sources数组?
解决Puppet中提取嵌套哈希唯一allowed_sources的问题
问题根源
你原来的代码无效是因为Puppet的变量是不可变的——一旦变量被赋值,就无法修改。你在each循环里尝试用$sources << ...修改变量,实际上只是在lambda内部创建了一个局部的$sources变量,外部的原始$sources始终是空数组,所以最终结果为空。
正确实现方式
利用Puppet的声明式集合操作方法,一步完成提取、扁平化和去重:
# 提取所有allowed_sources数组 → 扁平化一维数组 → 去重 $sources = $databases.map |$db_name, $db_settings| { $db_settings['allowed_sources'] }.flatten.unique
步骤拆解:
map方法:遍历$databases哈希,提取每个数据库的allowed_sources数组,得到一个嵌套数组(比如[["192.0.2.1/24"], ["192.0.2.1/24"]])flatten方法:将嵌套数组转为一维数组(比如["192.0.2.1/24", "192.0.2.1/24"])unique方法:去除重复的源地址,得到最终的唯一地址数组(比如["192.0.2.1/24"])
额外注意:修复赋值代码的语法错误
你给$database::databases赋值的代码存在语法问题,每个哈希键值对末尾缺少逗号,会导致Puppet编译报错,修正后的代码如下:
$database::databases = { development1 => { owner_password => "development", allowed_sources => ["192.0.2.1/24"] }, development2 => { owner_password => "development", allowed_sources => ["192.0.2.1/24"] } }
内容的提问来源于stack exchange,提问作者SK4ndal
相关产品推荐
相关产品推荐

