从Hiera检索特定的哈希块并传递给define

时间:2017-03-18 20:14:53

标签: puppet hiera

我有一个define函数,我 从网站清单中调用它,并在需要时使用不同的参数。参数详细信息也仅存在于站点清单中。我现在试图使用Hiera来存储这些参数细节。

[tom@pe-server] cat role_dll.pp
define sql::role_ddl (
    $role_ddl_params
) {
    $role_ddl_sql = $role_ddl_params[role_ddl_sql]
    $user = $role_ddl_params[user]
    $db = $role_ddl_params[db]

    ...code to consume above variables...
}


[tom@pe-server] cat my_node.yaml
role_ddl_params:
    userA:
        role_ddl_sql: 'f:/db/ddl.sql',
        user: 'my_domain\\userA',
        db: 'test_db',
    userB:
        ...
        ...
        ...

现在我不想迭代完整的哈希值。相反,我想从上面的哈希调用一个特定的块。比如说,哈希块只对应于userA。我不确定如何在下面显示的节点块中执行此操作:

[tom@pe-server] cat site.pp
node 'my_node' {
    sql::role_ddl { 'Granting ddl access to userA':
        role_ddl_params => hiera('role_ddl_params')
    }
}

更新:根据评论中的建议,我试过,但我收到以下错误:

Error: Could not retrieve catalog from remote server: Error 500 on SERVER: {"message":"Server Error: Evaluation Error: Error while eval
uating a Function Call, undefined method `empty?' for nil:NilClass at /etc/puppetlabs/code/environments/production/manifests/site.pp:10
0:22 on node my_node.abc.com","issue_kind":"RUNTIME_ERROR","stacktrace":["Warning: The 'stacktrace' property is deprecated and will be
removed in a future version of Puppet. For security reasons, stacktraces are not returned with Puppet HTTP Error responses."]}

我遇到了这个link,我尝试了以下方式,但仍然失败并出现上述错误:

node 'my_node' {
    $ddl_params = hiera('role_ddl_params')

    sql::role_ddl { 'Granting ddl access to userA':
        role_ddl_params => $ddl_params['userA']
    }
}

1 个答案:

答案 0 :(得分:1)

您可以从hieradata对哈希查找执行直接键值访问,以访问特定用户的嵌套哈希值。

例如,您可以在hiera函数查找后立即执行此操作:

node 'my_node' {
    $ddl_params = hiera('role_ddl_params')['userA']

    sql::role_ddl { 'Granting ddl access to userA':
        role_ddl_params => $ddl_params
    }
}

或存储查找结果的变量:

node 'my_node' {
    $ddl_params = hiera('role_ddl_params')

    sql::role_ddl { 'Granting ddl access to userA':
        role_ddl_params => $ddl_params['userA']
    }
}

你也可以完全内联这个,虽然这可能会影响代码表现力:

node 'my_node' {
    sql::role_ddl { 'Granting ddl access to userA':
        role_ddl_params => hiera('role_ddl_params')['userA']
    }
}

在相关的旁注中,看到抛出以下错误:

  

错误:无法从远程服务器检索目录:SERVER上的错误500:{“message”:“服务器错误:评估错误:eval时出错   使用函数调用,未定义的方法“空”?为零:NilClass

来自hiera函数查找的

表示您对nil键或具有nil值的键执行了查找。这两者通常都指向数据或查找中使用的密钥中的某种拼写错误,并且更常见的是在层次结构中以错误的优先级执行的查找,hieradata中缺少的数据或实际的nil值对于hieradata中的钥匙。