如何以延迟方式将Sensitive转为Sensitive[String]适配PostgreSQL角色参数?
我在处理敏感值时遇到问题,正在向以下定义传递password_hash参数:
define postgresql::server::role ( Boolean $update_password = true, Variant[Boolean, String, Sensitive[String]] $password_hash = false, )
我的值来自延迟函数的返回结果:
$password = Deferred('vault_lookup::lookup', ["path", { 'field' => $_vault_field }]) postgresql::server::role { $_username: password_hash => $password, }
问题在于vault_lookup::lookup函数返回的是Sensitive类型,而非Sensitive[String],因此触发如下错误:
Error: Could not retrieve catalog from remote server:
Error 500 on SERVER: Server Error: Evaluation Error:
Error while evaluating a Resource Statement, Postgresql::Server::Role[seaweedfs]: parameter 'password_hash' expects a value of type Boolean, String, or Sensitive[String], got Sensitive (file: ****/provision.pp, line: 63) on node ****
请问是否可以通过延迟方式将其重新转换为Sensitive[String]类型?或者有其他方法可以将该值传递给该参数?
方法1:嵌套延迟调用实现类型包装
直接用Sensitive构造器包裹延迟函数的返回值,让外层构造器接收内层返回的字符串,最终生成Sensitive[String]类型:
$password = Deferred('Sensitive', [ Deferred('vault_lookup::lookup', ["path", { 'field' => $_vault_field }]) ])
这种方式利用延迟调用的嵌套特性,确保类型转换在代理端执行,符合参数的类型要求。
方法2:修改vault_lookup函数的返回类型
如果有权限调整vault_lookup::lookup的代码,直接在函数定义中指定返回类型为Sensitive[String],而非泛型Sensitive。修改后函数返回值会自动匹配参数的类型约束,无需额外转换操作。
方法3:强制内部值转为字符串后再包装
如果不确定vault返回的敏感值内部类型,可先用String()函数强制转换为字符串,再包装成Sensitive[String]:
$password = Deferred('Sensitive', [ Deferred('String', [ Deferred('vault_lookup::lookup', ["path", { 'field' => $_vault_field }]) ]) ])
这种方式能确保敏感值内部的类型严格为String,彻底解决类型不匹配问题。
内容的提问来源于stack exchange,提问作者TrojakJan

