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

Retrieve specific hash block from Hiera and pass to define

我有一个 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:
        ...
        ...
        ...

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

[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']
    }
}

您可以对来自 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']
    }
}

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

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

来自 hiera 函数查找表示您对 nil 键或具有 nil 值的键执行了查找。这两者通常都指向数据或查找中使用的键中的某种拼写错误,更不常见的是在层次结构中以错误的优先级执行的查找、hieradata 中的数据丢失或实际的 nil 值hieradata 中的一个键。