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

时间:2019-01-29 16:03:39

标签: puppet hiera

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

在我的情况下,我想在诸如datadir之类的路径中查找“ sales_db”或“ hr_db”之类的实例名称,但是我找不到找到上级键名的方法。

“ our_mysql”模块中的层次数据代表一些默认值:

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

来自节点定义的层次数据:

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相关的主题都无济于事。

是否有可能?如果是,怎么办?

1 个答案:

答案 0 :(得分:1)

据我了解的问题,我认为您希望实现的是,例如,当您查找our_mysql::configure_db::dbs.sales_db键时,您将获得该(sub)键和(sub)键的数据的合并。 our_mysql::configure_db::dbs.defaults子项,并且,后者中的各个%{lookup ...}令牌以某种方式解析为字符串sales_db

恐怕这不会发生。插值标记甚至不在这里考虑-希拉根本不会执行这种合并。我想您会想到要进行散列合并查找,但这只会合并相同的键和子键,因此不会合并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关键字

如果要这样做,您可以花费更多的精力(以及一个或多个新键)将目录名称的更多详细信息推回数据中。