Nebula自动化脚本:常用操作的批量处理
概述
在企业级Nebula网络部署中,手动管理数十甚至数百个节点的证书创建、配置分发和运维管理是一项极其繁琐且容易出错的任务。本文为您提供一套完整的Nebula自动化脚本解决方案,通过批量处理技术显著提升运维效率,确保网络部署的一致性和安全性。
自动化需求分析
常见痛点
- 证书管理复杂:CA证书、主机证书的批量创建和分发
- 配置一致性难保证:多节点配置文件的手动修改易出错
- 部署效率低下:逐台服务器部署耗时耗力
- 运维监控困难:服务状态监控和故障恢复自动化程度低
自动化目标
核心自动化脚本实现
1. 证书管理自动化
CA证书创建脚本
#!/bin/bash
# generate_ca.sh - 自动化创建Nebula CA证书
set -e
CA_NAME="${1:-MyOrganization}"
CA_DURATION="${2:-8760h}" # 默认1年
OUTPUT_DIR="${3:-/etc/nebula/ca}"
mkdir -p "$OUTPUT_DIR"
echo "创建Nebula CA证书..."
./nebula-cert ca -name "$CA_NAME" -duration "$CA_DURATION" \
-out-key "$OUTPUT_DIR/ca.key" -out-crt "$OUTPUT_DIR/ca.crt"
# 设置严格的权限
chmod 600 "$OUTPUT_DIR/ca.key"
chmod 644 "$OUTPUT_DIR/ca.crt"
echo "CA证书已创建到: $OUTPUT_DIR"
echo "CA证书指纹: $(./nebula-cert print -path "$OUTPUT_DIR/ca.crt" | grep Fingerprint)"
批量主机证书签发脚本
#!/bin/bash
# batch_sign_certs.sh - 批量签发主机证书
set -e
CA_KEY="${1:-ca.key}"
CA_CRT="${2:-ca.crt}"
HOSTS_FILE="${3:-hosts.list}"
NETWORK_CIDR="${4:-192.168.100.0/24}"
OUTPUT_DIR="${5:-certs}"
mkdir -p "$OUTPUT_DIR"
# 主机列表文件格式: hostname,ip,groups
# example: web01,192.168.100.10,web,production
declare -i counter=2
while IFS=, read -r hostname ip groups; do
[ -z "$hostname" ] && continue
echo "为 $hostname 签发证书..."
# 构建groups参数
groups_param=""
if [ -n "$groups" ]; then
groups_param="-groups \"$groups\""
fi
./nebula-cert sign -name "$hostname" -ip "$ip/24" $groups_param \
-ca-key "$CA_KEY" -ca-crt "$CA_CRT" \
-out-key "$OUTPUT_DIR/$hostname.key" -out-crt "$OUTPUT_DIR/$hostname.crt"
chmod 600 "$OUTPUT_DIR/$hostname.key"
counter+=1
done < "$HOSTS_FILE"
echo "批量证书签发完成!共创建 $(($counter-2)) 个主机证书"
2. 配置管理自动化
配置模板创建脚本
#!/bin/bash
# generate_config.sh - 基于模板创建节点配置
set -e
TEMPLATE_FILE="${1:-config_template.yml}"
HOSTS_FILE="${2:-hosts.list}"
LIGHTHOUSE_IP="${3:-192.168.100.1}"
LIGHTHOUSE_REAL_IP="${4:-your.lighthouse.ip}"
OUTPUT_DIR="${5:-configs}"
mkdir -p "$OUTPUT_DIR"
# 读取模板内容
template=$(cat "$TEMPLATE_FILE")
while IFS=, read -r hostname ip groups; do
[ -z "$hostname" ] && continue
echo "为 $hostname 创建配置..."
# 替换模板变量
config_content=$(echo "$template" | \
sed "s/{{HOSTNAME}}/$hostname/g" | \
sed "s/{{NEBULA_IP}}/$ip/g" | \
sed "s/{{LIGHTHOUSE_IP}}/$LIGHTHOUSE_IP/g" | \
sed "s/{{LIGHTHOUSE_REAL_IP}}/$LIGHTHOUSE_REAL_IP/g" | \
sed "s/{{GROUPS}}/$groups/g")
echo "$config_content" > "$OUTPUT_DIR/$hostname.yml"
done < "$HOSTS_FILE"
echo "配置创建完成!"
配置模板示例
# config_template.yml
pki:
ca: /etc/nebula/ca.crt
cert: /etc/nebula/{{HOSTNAME}}.crt
key: /etc/nebula/{{HOSTNAME}}.key
static_host_map:
"{{LIGHTHOUSE_IP}}": ["{{LIGHTHOUSE_REAL_IP}}:4242"]
lighthouse:
am_lighthouse: false
hosts:
- "{{LIGHTHOUSE_IP}}"
listen:
host: "::"
port: 4242
punchy:
punch: true
tun:
dev: nebula1
mtu: 1300
logging:
level: info
firewall:
outbound_action: drop
inbound_action: drop
outbound:
- port: any
proto: any
host: any
inbound:
- port: any
proto: icmp
host: any
- port: any
proto: any
groups: ["{{GROUPS}}"]
3. 部署运维自动化
批量部署脚本
#!/bin/bash
# deploy_nebula.sh - 批量部署Nebula节点
set -e
HOSTS_FILE="${1:-hosts.list}"
SSH_USER="${2:-root}"
SSH_KEY="${3:-~/.ssh/id_rsa}"
NEBULA_BINARY="${4:-nebula}"
declare -a successful_hosts=()
declare -a failed_hosts=()
while IFS=, read -r hostname ip groups; do
[ -z "$hostname" ] && continue
echo "正在部署 $hostname ($ip)..."
# 创建远程目录结构
ssh -i "$SSH_KEY" "$SSH_USER@$ip" << 'EOF'
mkdir -p /etc/nebula
chmod 700 /etc/nebula
EOF
# 传输文件
scp -i "$SSH_KEY" ca.crt "$SSH_USER@$ip:/etc/nebula/"
scp -i "$SSH_KEY" "certs/$hostname.crt" "$SSH_USER@$ip:/etc/nebula/host.crt"
scp -i "$SSH_KEY" "certs/$hostname.key" "$SSH_USER@$ip:/etc/nebula/host.key"
scp -i "$SSH_KEY" "configs/$hostname.yml" "$SSH_USER@$ip:/etc/nebula/config.yml"
scp -i "$SSH_KEY" "$NEBULA_BINARY" "$SSH_USER@$ip:/usr/local/bin/nebula"
# 设置权限
ssh -i "$SSH_KEY" "$SSH_USER@$ip" << 'EOF'
chmod 600 /etc/nebula/*.key
chmod 644 /etc/nebula/*.crt
chmod 755 /usr/local/bin/nebula
EOF
# 安装服务
scp -i "$SSH_KEY" nebula.service "$SSH_USER@$ip:/etc/systemd/system/"
ssh -i "$SSH_KEY" "$SSH_USER@$ip" << 'EOF'
systemctl daemon-reload
systemctl enable nebula
systemctl start nebula
systemctl status nebula --no-pager
EOF
if [ $? -eq 0 ]; then
successful_hosts+=("$hostname")
echo "✓ $hostname 部署成功"
else
failed_hosts+=("$hostname")
echo "✗ $hostname 部署失败"
fi
done < "$HOSTS_FILE"
# 输出部署结果
echo ""
echo "部署完成!"
echo "成功: ${#successful_hosts[@]} 个节点"
echo "失败: ${#failed_hosts[@]} 个节点"
[ ${#failed_hosts[@]} -gt 0 ] && echo "失败节点: ${failed_hosts[*]}"
4. 监控与维护自动化
服务状态检查脚本
#!/bin/bash
# check_nebula_status.sh - 检查Nebula服务状态
set -e
HOSTS_FILE="${1:-hosts.list}"
SSH_USER="${2:-root}"
SSH_KEY="${3:-~/.ssh/id_rsa}"
declare -i healthy_count=0
declare -i total_count=0
echo "开始检查Nebula服务状态..."
echo "=========================================="
while IFS=, read -r hostname ip groups; do
[ -z "$hostname" ] && continue
total_count+=1
status=$(ssh -i "$SSH_KEY" "$SSH_USER@$ip" \
"systemctl is-active nebula 2>/dev/null || echo 'inactive'")
if [ "$status" = "active" ]; then
# 检查实际连接状态
conn_status=$(ssh -i "$SSH_KEY" "$SSH_USER@$ip" \
"ip addr show nebula1 2>/dev/null | grep 'inet ' || echo 'no_ip'")
if [[ "$conn_status" != "no_ip" ]]; then
echo "✓ $hostname - 服务正常运行"
healthy_count+=1
else
echo "⚠ $hostname - 服务运行但无IP地址"
fi
else
echo "✗ $hostname - 服务未运行 ($status)"
fi
done < "$HOSTS_FILE"
echo "=========================================="
echo "健康检查完成: $healthy_count/$total_count 个节点正常"
证书过期监控脚本
#!/bin/bash
# check_cert_expiry.sh - 监控证书过期时间
set -e
HOSTS_FILE="${1:-hosts.list}"
SSH_USER="${2:-root}"
SSH_KEY="${3:-~/.ssh/id_rsa}"
WARNING_DAYS="${4:-30}"
current_date=$(date +%s)
warning_seconds=$((WARNING_DAYS * 24 * 3600))
echo "检查证书过期情况(警告阈值: $WARNING_DAYS 天)..."
echo "=========================================="
while IFS=, read -r hostname ip groups; do
[ -z "$hostname" ] && continue
# 获取证书过期时间
expiry_info=$(ssh -i "$SSH_KEY" "$SSH_USER@$ip" \
"openssl x509 -in /etc/nebula/host.crt -noout -enddate 2>/dev/null | cut -d= -f2")
if [ -n "$expiry_info" ]; then
expiry_date=$(date -d "$expiry_info" +%s)
days_remaining=$(( (expiry_date - current_date) / 86400 ))
if [ $days_remaining -le 0 ]; then
echo "❌ $hostname - 证书已过期"
elif [ $days_remaining -le $WARNING_DAYS ]; then
echo "⚠ $hostname - 证书将在 $days_remaining 天后过期"
else
echo "✓ $hostname - 证书有效剩余 ${days_remaining} 天"
fi
else
echo "? $hostname - 无法读取证书信息"
fi
done < "$HOSTS_FILE"
自动化工作流集成
完整的CI/CD流水线
环境变量配置文件
# env.config
export CA_NAME="MyCompany-Nebula-CA"
export NETWORK_CIDR="192.168.100.0/24"
export LIGHTHOUSE_IP="192.168.100.1"
export LIGHTHOUSE_REAL_IP="1.2.3.4"
export SSH_USER="nebula-admin"
export SSH_KEY="/root/.ssh/nebula_deploy"
export WARNING_DAYS=30
主控制脚本
#!/bin/bash
# nebula_automation.sh - 主控制脚本
source env.config
echo "Nebula自动化管理平台启动..."
echo "选择操作:"
echo "1) 创建CA证书"
echo "2) 批量签发主机证书"
echo "3) 创建节点配置"
echo "4) 批量部署节点"
echo "5) 服务状态检查"
echo "6) 证书过期检查"
echo "7) 完整部署流程"
read -p "请输入选择 (1-7): " choice
case $choice in
1) ./generate_ca.sh "$CA_NAME" ;;
2) ./batch_sign_certs.sh ca.key ca.crt hosts.list "$NETWORK_CIDR" ;;
3) ./generate_config.sh config_template.yml hosts.list "$LIGHTHOUSE_IP" "$LIGHTHOUSE_REAL_IP" ;;
4) ./deploy_nebula.sh hosts.list "$SSH_USER" "$SSH_KEY" ;;
5) ./check_nebula_status.sh hosts.list "$SSH_USER" "$SSH_KEY" ;;
6) ./check_cert_expiry.sh hosts.list "$SSH_USER" "$SSH_KEY" "$WARNING_DAYS" ;;
7)
echo "执行完整部署流程..."
./generate_ca.sh "$CA_NAME"
./batch_sign_certs.sh ca.key ca.crt hosts.list "$NETWORK_CIDR"
./generate_config.sh config_template.yml hosts.list "$LIGHTHOUSE_IP" "$LIGHTHOUSE_REAL_IP"
./deploy_nebula.sh hosts.list "$SSH_USER" "$SSH_KEY"
./check_nebula_status.sh hosts.list "$SSH_USER" "$SSH_KEY"
;;
*) echo "无效选择" ;;
esac
echo "操作完成!"
最佳实践与注意事项
安全实践
- 密钥管理: CA私钥必须离线存储,主机私钥设置600权限
- 访问控制: 使用最小权限原则,限制SSH访问
- 审计日志: 记录所有自动化操作,便于审计追踪
- 备份策略: 定期备份CA证书和配置模板
性能优化
| 优化项 | 建议值 | 说明 |
|---|---|---|
| 批量并发数 | 5-10节点/批次 | 避免SSH连接过多导致性能下降 |
| 证书有效期 | 90-365天 | 平衡安全性与运维成本 |
| 监控频率 | 每小时1次 | 实时监控服务状态 |
| 告警阈值 | 30天 | 证书过期前足够时间处理 |
故障处理
# 紧急恢复脚本
#!/bin/bash
# emergency_recovery.sh - 节点故障恢复
HOST=$1
ssh "$SSH_USER@$HOST" "systemctl restart nebula"
sleep 5
ssh "$SSH_USER@$HOST" "systemctl status nebula"
if [ $? -ne 0 ]; then
echo "重启失败,尝试重新部署..."
# 调用部署脚本进行单节点重部署
./deploy_single_node.sh "$HOST"
fi
总结
通过本文提供的Nebula自动化脚本套件,您可以实现:
- 标准化部署: 确保所有节点配置一致,减少人为错误
- 批量操作效率: 从数小时的手工操作缩短到几分钟的自动化执行
- 持续监控: 实时掌握网络状态,及时发现和处理问题
- 安全合规: 规范的证书管理和访问控制策略
这些脚本可以根据实际环境需求进行定制和扩展,构建适合您组织需求的Nebula自动化运维体系。建议在生产环境部署前,在测试环境中充分验证所有脚本的功能和稳定性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



