puppet hiera数组,循环和哈希

时间:2015-05-11 15:32:37

标签: loops hash puppet hiera

我目前在hiera / puppet之间存在一个问题:

在我的hiera我有:

mysql_user_mgmt:
     - mysql_user: 'toto@localhost'
       mysql_hash_password: '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29'
       mysql_grant_user: 'toto@localhost/*.*'
       mysql_user_table_privileges: '*.*'
     - mysql_user: 'test@localhost'
       mysql_hash_password: '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29'
       mysql_grant_user: 'test@localhost/*.*'
       mysql_user_table_privileges: '*.*'

在我的木偶中,我正在尝试创建一个循环来从hiera获取数据:

$mysql_user_mgmt = hiera('mysql_user_mgmt',undef)
define mysql_loop () {
$mysql_hash_password = $name['mysql_hash_password']
notify { "mysql_hash_password: ${mysql_hash_password}": }
}
mysql_loop { $mysql_user_mgmt: }

但是我得到了一些奇怪的错误。有人可以帮我弄清楚如何制作循环吗?

1 个答案:

答案 0 :(得分:3)

资源标题是字符串。总是

您正尝试使用mysql_loop资源的标题将哈希提供给类型定义。这不起作用。最终会使用字符串化版本的哈希值,而后来通过哈希索引检索组件的尝试将失败,可能会出现某种类型的错误。

您有几个选择:

  1. 您可以稍微重构您的定义和数据,并将聚合数据作为哈希参数传递。 (以下示例。)

  2. 您可以稍微重新定义您的定义和数据,并使用create_resources()函数。

  3. 如果您已经升级到Puppet 4,或者您愿意在Puppet 3中启用未来的解析器,那么您可以使用其中一个新的(ish)循环函数,例如each()

  4. 替代方案(1)的例子:

    将数据重新组织为哈希哈希值,以用户ID键入:

    mysql_user_mgmt:
      'toto@localhost':
         mysql_hash_password: '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29'
         mysql_grant_user: 'toto@localhost/*.*'
         mysql_user_table_privileges: '*.*'
      'test@localhost':
         mysql_hash_password: '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29'
         mysql_grant_user: 'test@localhost/*.*'
         mysql_user_table_privileges: '*.*'
    

    修改定义:

    define mysql_user ($all_user_info) {
      $mysql_hash_password = $all_user_info[$title]['mysql_hash_password']
      notify { "mysql_hash_password: ${mysql_hash_password}": }
    }
    

    像这样使用它:

    $mysql_user_mgmt = hiera('mysql_user_mgmt',undef)
    $mysql_user_ids = keys($mysql_user_mgmt)
    mysql_user { $mysql_user_ids: all_user_info => $mysql_user_mgmt }
    

    keys()函数可从puppetlabs-stdlib模块获得。)