Nebula自动化脚本:常用操作的批量处理

Nebula自动化脚本:常用操作的批量处理

【免费下载链接】nebula A scalable overlay networking tool with a focus on performance, simplicity and security 【免费下载链接】nebula 项目地址: https://gitcode.com/GitHub_Trending/ne/nebula

概述

在企业级Nebula网络部署中,手动管理数十甚至数百个节点的证书创建、配置分发和运维管理是一项极其繁琐且容易出错的任务。本文为您提供一套完整的Nebula自动化脚本解决方案,通过批量处理技术显著提升运维效率,确保网络部署的一致性和安全性。

自动化需求分析

常见痛点

  • 证书管理复杂:CA证书、主机证书的批量创建和分发
  • 配置一致性难保证:多节点配置文件的手动修改易出错
  • 部署效率低下:逐台服务器部署耗时耗力
  • 运维监控困难:服务状态监控和故障恢复自动化程度低

自动化目标

mermaid

核心自动化脚本实现

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流水线

mermaid

环境变量配置文件

# 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 "操作完成!"

最佳实践与注意事项

安全实践

  1. 密钥管理: CA私钥必须离线存储,主机私钥设置600权限
  2. 访问控制: 使用最小权限原则,限制SSH访问
  3. 审计日志: 记录所有自动化操作,便于审计追踪
  4. 备份策略: 定期备份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自动化脚本套件,您可以实现:

  1. 标准化部署: 确保所有节点配置一致,减少人为错误
  2. 批量操作效率: 从数小时的手工操作缩短到几分钟的自动化执行
  3. 持续监控: 实时掌握网络状态,及时发现和处理问题
  4. 安全合规: 规范的证书管理和访问控制策略

这些脚本可以根据实际环境需求进行定制和扩展,构建适合您组织需求的Nebula自动化运维体系。建议在生产环境部署前,在测试环境中充分验证所有脚本的功能和稳定性。

【免费下载链接】nebula A scalable overlay networking tool with a focus on performance, simplicity and security 【免费下载链接】nebula 项目地址: https://gitcode.com/GitHub_Trending/ne/nebula

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值