如何用Bash脚本检测Azure Key Vault中60天内到期密钥并触发续期
问题与解决方案:Azure Key Vault密钥到期检测及流水线触发脚本修复
由于Azure Runbook与本地部署的Azure DevOps Server流水线集成存在限制,需编写Bash脚本实现以下功能:
- 遍历指定的Azure Key Vault列表
- 找出其中60天内即将到期的密钥
- 触发发布流水线将该密钥的有效期延长2年并完成发布审批
目前在获取密钥到期时间、计算剩余天数以及遍历Key Vault的过程中遇到问题,相关代码片段及修复方案如下:
1. 获取密钥到期时间与剩余天数计算问题
原错误代码
az keyvault secret list --vault-name kv-01 --query "[?attributes.expires ].{Id:id, expires:attributes.expires}" | jq '.[].expires' '+%s'
问题分析
无法将Azure返回的ISO格式时间(YYYY-MM-DDTHH:MM:SSZ)正确转换为Unix时间戳,导致无法计算剩余天数。
修复代码
# 获取当前UTC时间戳(秒) current_ts=$(date -u +%s) # 遍历指定Key Vault,筛选60天内到期的密钥并计算剩余天数 az keyvault secret list --vault-name kv-01 --query "[?attributes.expires].{Id:id, Expires:attributes.expires}" | jq --arg current_ts "$current_ts" ' .[] | .expire_ts = (.Expires | fromdateiso8601) | .days_remaining = (.expire_ts - $current_ts | tonumber / 86400 | floor) | select(.days_remaining <= 60) | {SecretId: .Id, DaysRemaining: .days_remaining} '
关键说明
fromdateiso8601:将Azure返回的标准时间格式转为Unix时间戳- 剩余天数计算:用过期时间戳减去当前时间戳,除以86400(一天的秒数)后取整
select(.days_remaining <=60):精准筛选出60天内到期的密钥
2. 遍历Key Vault失败问题
原错误代码
inlineScript: | #Azure Key Vault details keyvaults=$(az keyvault list --query "[].{Name:name}") echo "keyvaults are as below $keyvaults" #Iterate through the kvs for row in $(echo "${keyvaults}" | jq -c '.[]'); do keyVaultName=$(echo "$row" | jq -r '.Name') done #Get the current date in UTC currentDate=$(date -u +"%Y-%m-%dT%H:%M:%SZ") echo "currentDate is $currentDate".....
问题分析
- 时间计算逻辑放在循环外,无法为每个Key Vault单独处理
- 用
for row in $(...)遍历JSON数组,易因名称含空格/特殊字符导致遍历异常 - 循环内未执行密钥检测的核心逻辑
修复代码
inlineScript: | # 获取当前UTC时间戳(秒) current_ts=$(date -u +%s) # 获取所有Key Vault名称并安全遍历 az keyvault list --query "[].name" -o tsv | while read -r keyVaultName; do echo "正在处理Key Vault: $keyVaultName" # 筛选该Vault中60天内到期的密钥ID expiring_secrets=$(az keyvault secret list --vault-name "$keyVaultName" --query "[?attributes.expires].{Id:id, Expires:attributes.expires}" | jq --arg current_ts "$current_ts" ' .[] | .expire_ts = (.Expires | fromdateiso8601) | .days_remaining = (.expire_ts - $current_ts | tonumber / 86400 | floor) | select(.days_remaining <= 60) | .Id ') # 遍历到期密钥,触发流水线延长有效期 echo "$expiring_secrets" | jq -r '.[]' | while read -r secret_id; do echo "触发流水线延长密钥有效期: $secret_id" # 替换为你的Azure DevOps Server流水线触发命令 # az pipelines run --name "你的发布流水线名称" --variables secretId="$secret_id" expireDays=730 done done
关键说明
az keyvault list --query "[].name" -o tsv:直接输出纯文本格式的Key Vault名称,避免JSON解析问题while read -r keyVaultName:安全遍历列表,支持名称含特殊字符的场景- 将密钥检测、流水线触发逻辑嵌入Key Vault遍历循环,确保每个Vault都被处理
内容的提问来源于stack exchange,提问作者Vowneee
相关产品推荐
相关产品推荐

