128 lines
3.8 KiB
Bash
Executable File
128 lines
3.8 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# 简化版 OpenTofu 密钥上传脚本
|
|
set -euo pipefail
|
|
|
|
# 配置
|
|
CONSUL_ADDR="${CONSUL_ADDR:-http://master:8500}"
|
|
ENVIRONMENT="${ENVIRONMENT:-dev}"
|
|
TFVARS_FILE="tofu/environments/${ENVIRONMENT}/terraform.tfvars"
|
|
|
|
# 颜色输出
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m'
|
|
|
|
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
|
|
log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
|
|
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
|
|
|
# 检查 Consul 连接
|
|
check_consul() {
|
|
log_info "检查 Consul 连接..."
|
|
if ! curl -s "${CONSUL_ADDR}/v1/status/leader" > /dev/null; then
|
|
log_error "无法连接到 Consul: ${CONSUL_ADDR}"
|
|
exit 1
|
|
fi
|
|
log_success "Consul 连接正常"
|
|
}
|
|
|
|
# 上传配置
|
|
upload_configs() {
|
|
local uploaded_count=0
|
|
|
|
log_info "开始解析并上传配置..."
|
|
|
|
# 直接解析 tfvars 文件
|
|
while IFS= read -r line; do
|
|
# 跳过注释和空行
|
|
if [[ "$line" =~ ^[[:space:]]*# ]] || [[ -z "${line// }" ]]; then
|
|
continue
|
|
fi
|
|
|
|
# 匹配变量赋值
|
|
if [[ "$line" =~ ^[[:space:]]*([a-zA-Z_][a-zA-Z0-9_]*)[[:space:]]*=[[:space:]]*\"([^\"]*)\"|^[[:space:]]*([a-zA-Z_][a-zA-Z0-9_]*)[[:space:]]*=[[:space:]]*([^[:space:]#]+) ]]; then
|
|
local var_name="${BASH_REMATCH[1]:-${BASH_REMATCH[3]}}"
|
|
local var_value="${BASH_REMATCH[2]:-${BASH_REMATCH[4]}}"
|
|
|
|
# 跳过空值
|
|
if [[ -z "$var_value" || "$var_value" == "null" ]]; then
|
|
continue
|
|
fi
|
|
|
|
# 确定配置分类和路径
|
|
local consul_path=""
|
|
if [[ "$var_name" =~ ^oci_ ]]; then
|
|
consul_path="config/${ENVIRONMENT}/oracle/${var_name#oci_}"
|
|
elif [[ "$var_name" =~ ^huawei_ ]]; then
|
|
consul_path="config/${ENVIRONMENT}/huawei/${var_name#huawei_}"
|
|
elif [[ "$var_name" =~ ^aws_ ]]; then
|
|
consul_path="config/${ENVIRONMENT}/aws/${var_name#aws_}"
|
|
elif [[ "$var_name" =~ ^do_ ]]; then
|
|
consul_path="config/${ENVIRONMENT}/digitalocean/${var_name#do_}"
|
|
elif [[ "$var_name" =~ ^gcp_ ]]; then
|
|
consul_path="config/${ENVIRONMENT}/gcp/${var_name#gcp_}"
|
|
else
|
|
consul_path="config/${ENVIRONMENT}/general/${var_name}"
|
|
fi
|
|
|
|
# 上传到 Consul
|
|
if curl -s -X PUT "${CONSUL_ADDR}/v1/kv/${consul_path}" -d "$var_value" > /dev/null; then
|
|
log_info "上传: ${consul_path}"
|
|
((uploaded_count++))
|
|
else
|
|
log_error "上传失败: ${consul_path}"
|
|
fi
|
|
fi
|
|
done < "$TFVARS_FILE"
|
|
|
|
log_success "总共上传了 $uploaded_count 个配置项到 Consul"
|
|
}
|
|
|
|
# 列出配置
|
|
list_configs() {
|
|
log_info "列出 Consul 中的配置..."
|
|
|
|
local keys=$(curl -s "${CONSUL_ADDR}/v1/kv/config/${ENVIRONMENT}/?keys" | jq -r '.[]' 2>/dev/null || echo "")
|
|
|
|
if [[ -z "$keys" ]]; then
|
|
log_error "没有找到配置"
|
|
return
|
|
fi
|
|
|
|
echo "=== 环境 ${ENVIRONMENT} 的配置 ==="
|
|
echo "$keys" | while read -r key; do
|
|
local value=$(curl -s "${CONSUL_ADDR}/v1/kv/${key}?raw" 2>/dev/null || echo "无法读取")
|
|
# 隐藏敏感信息
|
|
if [[ "$key" =~ (secret|key|token|password|ocid) ]]; then
|
|
echo "$key: [已隐藏]"
|
|
else
|
|
echo "$key: $value"
|
|
fi
|
|
done
|
|
}
|
|
|
|
# 主函数
|
|
main() {
|
|
if [[ ! -f "$TFVARS_FILE" ]]; then
|
|
log_error "找不到配置文件: $TFVARS_FILE"
|
|
exit 1
|
|
fi
|
|
|
|
check_consul
|
|
|
|
case "${1:-upload}" in
|
|
"upload")
|
|
upload_configs
|
|
;;
|
|
"list")
|
|
list_configs
|
|
;;
|
|
*)
|
|
echo "用法: $0 [upload|list]"
|
|
;;
|
|
esac
|
|
}
|
|
|
|
main "$@" |