如何用Terraform获取Vault身份实体别名下的名称字段
问题
使用Terraform的vault_identity_entity数据源获取实体信息时,当前脚本只能拿到实体ID(如entity_ec5c123),无法提取到aliases数组下的name字段(该字段为用户邮箱地址)。
示例代码:
data "vault_identity_group" "group" { group_name = "vaultadmin" } data "vault_identity_entity" "entity" { for_each = toset(data.vault_identity_group.group.member_entity_ids) entity_id = each.value } data "null_data_source" "values" { for_each = data.vault_identity_entity.entity inputs = { ssh_user_details = lookup(jsondecode(data.vault_identity_entity.entity[each.key].data_json),"name",{}) } }
对应的data_json内容:
"data_json": "{\"aliases\":[{\"canonical_id\":\"37b4c764-a4ec-dcb7-c3c7-31cf9c51e456\",\"creation_time\":\"2022-07-20T08:53:36.553988277Z\",\"custom_metadata\":null,\"id\":\"59fb8a9c-1c0c-0591-0f6e-1a153233e456\",\"last_update_time\":\"2022-07-20T08:53:36.553988277Z\",\"local\":false,\"merged_from_canonical_ids\":null,\"metadata\":null,\"mount_accessor\":\"auth_approle_12d1d8af\",\"mount_path\":\"auth/approle/\",\"mount_type\":\"approle\",\"name\":\"name.user@test.com\"}],\"creation_time\":\"2022-07-20T08:53:36.553982983Z\",\"direct_group_ids\":[\"e456cb46-2b51-737c-3277-64082352f47e\"],\"disabled\":false,\"group_ids\":[\"e456cb46-2b51-737c-3277-64082352f47e\"],\"id\":\"37b4c764-a4ec-dcb7-c3c7-31cf9c51e456\",\"inherited_group_ids\":[],\"last_update_time\":\"2022-07-20T08:53:36.553982983Z\",\"merged_entity_ids\":null,\"metadata\":null,\"name\":\"entity_ec5c123\",\"namespace_id\":\"root\",\"policies\":[]}"
解决方案
核心问题是aliases是数组类型,不能直接通过lookup获取其下的字段,需要先定位到数组中的具体别名对象,再提取name字段。
1. 提取单个别名的name(适用于仅一个别名的场景)
修改null_data_source部分的代码,直接访问数组第一个元素的name字段:
data "null_data_source" "values" { for_each = data.vault_identity_entity.entity inputs = { # 直接提取第一个别名的name ssh_user_details = jsondecode(data.vault_identity_entity.entity[each.key].data_json).aliases[0].name } }
2. 按条件筛选别名(适用于多个别名的场景)
如果实体存在多个别名,可根据mount_type、mount_path等属性筛选目标别名,比如只提取approle类型的别名:
data "null_data_source" "values" { for_each = data.vault_identity_entity.entity inputs = { # 筛选approle类型的别名并提取name,取第一个匹配结果 ssh_user_details = [ for alias in jsondecode(data.vault_identity_entity.entity[each.key].data_json).aliases : alias.name if alias.mount_type == "approle" ][0] } }
3. 处理空值情况(避免报错)
如果存在实体无别名的情况,可添加默认值防止Terraform报错:
data "null_data_source" "values" { for_each = data.vault_identity_entity.entity inputs = { ssh_user_details = try( jsondecode(data.vault_identity_entity.entity[each.key].data_json).aliases[0].name, "" # 无别名时返回空字符串 ) } }
内容的提问来源于stack exchange,提问作者arcrunner
相关产品推荐
相关产品推荐

