在 Hiera 中检索高级哈希键名称

Retrieve superior hash-key name in Hiera

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

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

来自 "our_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"

我现在如何进行简单查找或迭代
.each | String $key, Hash $value | { ... }

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

是否有任何可能,如果有的话如何?

据我了解这个问题,我认为您希望实现的是,例如,当您查找 our_mysql::configure_db::dbs.sales_db 键时,您会合并该(子)键的数据和那些对于 our_mysql::configure_db::dbs.defaults 子项,AND 后者中的各种 %{lookup ...} 标记以某种方式解析为字符串 sales_db.

恐怕这不会发生。插值标记甚至不考虑在这里——Hiera 根本不会执行这样的合并。我猜你想到了哈希合并查找,但它只合并相同的键和子键,而不是 our_mysql::configure_db::dbs.sales_dbour_mysql::configure_db::dbs.defaults。 Hiera 以在数据层次结构的低优先级级别为那些特定键 记录的数据 的数据形式提供特定键的默认值。另一方面,您提供的 "defaults" 子项对标准 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 子项的数据,这些数据不需要知道特定的数据库名称,但它为各种目录名称设置了模式进入资源声明,而不是进入数据。要认识的最重要的事情是使用 splat * 参数通配符从散列中获取多个参数,以及使用每个表达式资源 属性 默认使用 default 关键字在资源声明中。

如果您想这样做,您可以付出更多的努力(以及一个或多个新密钥)将目录名称的更多详细信息推回数据中。