Puppet 检索Hiera中的高级哈希键名称

Puppet 检索Hiera中的高级哈希键名称,puppet,hiera,Puppet,Hiera,你好,我正在Hiera/Puppet中构建一个用于创建mysql/config文件的数据结构。我的目标是有一些默认值,可以通过合并覆盖。它一直工作到这一点。 因为我们在许多主机上有不同的mysql实例,所以我想自动为每个实例配置一些唯一的路径。我将实例名称作为名称空间中散列的散列(名称):我们的_mysql::configure_db::dbs: 在我的例子中,我想在datadir这样的路径中查找“sales_db”或“hr_db”这样的实例名,但我找不到查找高级关键字名的方法 来自“我们的_m

你好,我正在Hiera/Puppet中构建一个用于创建mysql/config文件的数据结构。我的目标是有一些默认值,可以通过合并覆盖。它一直工作到这一点。
因为我们在许多主机上有不同的mysql实例,所以我想自动为每个实例配置一些唯一的路径。我将实例名称作为名称空间中散列的散列(名称):我们的_mysql::configure_db::dbs:

在我的例子中,我想在datadir这样的路径中查找“sales_db”或“hr_db”这样的实例名,但我找不到查找高级关键字名的方法

来自“我们的_mysql”模块的Hiera数据表示一些默认值:

our_mysql::configure_db::dbs:
  'defaults':
    datadir:     /var/lib/mysql/"%{lookup('lookup to superior hash-key name')}"
    log_error:   /var/log/mysql/"%{lookup('lookup to superior hash-key name')}".log
    logbindir:   /var/lib/mysql/"%{lookup('lookup to superior hash-key name')}"
    db_port:     3306
    ...:         ...
    KEY_N:       VALUE_N
节点定义的Hiera数据:

our_mysql::configure_db::dbs:
  'sales_db':
    db_port: "3317"
    innodb_buffer_pool_size: "1"
    innodb_log_file_size: 1GB
    innodb_log_files_in_group: "2"
    server_id: "1"
  'hr_db':
    db_port: "3307"
我现在知道如何进行简单的查找或迭代
。每个|字符串$key,散列$value |{…}

但我不知道如何引用某个层次结构级别的键。搜索所有与puppet和hiera相关的主题都没有帮助


有可能吗?如果有,怎么可能?

根据我对问题的理解,我认为您希望实现的是,例如,当您查找
我们的\u mysql::configure\u db::dbs.sales\u db
键时,您会得到该键的数据合并(sub)默认值子键,表示后者中的各种
%{lookup…}
标记以某种方式解析为字符串
sales\u db

我担心这不会发生。插值标记在这里甚至不起作用——Hiera根本不会执行这样的合并。我猜您考虑的是散列合并查找,但它只合并相同的键和子键,因此不会合并我们的\u mysql::configure\u db::dbs.sales\u db和
我们的\u mysql::configure\u db::dbs.defaults
.Hiera以数据层次结构的低优先级为特定键记录数据的形式为特定键提供默认值。另一方面,您提供的“默认”子键对标准Hiera数据提供程序没有特殊意义

<>你仍然可以解决这个问题,只是不完全在数据内。例如,考虑这个:

$dbs = lookup('our_mysql::configure_db::dbs', Hash, 'deep')

$dbs.filter |$dbname, $dbparms| { $dbname != 'defaults' }.each |$dbname, $dbparms| {
    # Declare a database using a suitable resource type.  "my_mysql::database" is
    # a dummy resource name for the purposes of this example only
    my_mysql::database {
      $dbname:
        * => $dbparams;
      default:
        datadir   => "/var/lib/mysql/${dbname}",
        log_error => "/var/log/mysql/${dbname}.log",
        logbindir => "/var/lib/mysql/${dbname}",
        *         => $dbs['defaults'];
    }
}
这假设了问题中呈现的形式的数据,并使用了
defaults
子键中的数据,这些子键不需要知道特定的数据库名,但它将各种目录名的模式放入资源声明中,而不是数据中e splat
*
参数通配符,用于从散列中获取多个参数,每个表达式的使用资源属性默认为在资源声明中使用
default
关键字


如果您想这样做,您可以更努力地(和一个或多个新键)将目录名的更多细节推回到数据中.

这是通过在hiera配置中设置层次结构自动完成的。请共享所有相关的
hiera.yaml
。我的问题的有效解决方案!问题是资源类型需要固定数量的参数。其他方式:我在我的“our_mysql::configure_db”中定义了
$dynamic_mysql\u defaults={datadir=>”/data/var/lib/mysql/${dbname},log_error=>“/data/var/log/mysql/${dbname}.log”,logbindir=>“/data1/var/lib/mysql/${dbname}”,}

将其与“+”运算符合并:
$db_config={$dbname=>$dynamic_mysql\u defaults+$dbdefaults+$dbparams}

这提供了更多的自由,是一个有效的折衷方案。最初我想从数据中操作代码。