228 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Bash
		
	
	
	
			
		
		
	
	
			228 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Bash
		
	
	
	
#!/bin/bash
 | 
						|
# Nomad 多数据中心节点自动配置脚本
 | 
						|
# 数据中心: ${datacenter}
 | 
						|
 | 
						|
set -e
 | 
						|
 | 
						|
# 日志函数
 | 
						|
log() {
 | 
						|
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a /var/log/nomad-setup.log
 | 
						|
}
 | 
						|
 | 
						|
log "开始配置 Nomad 节点 - 数据中心: ${datacenter}"
 | 
						|
 | 
						|
# 更新系统
 | 
						|
log "更新系统包..."
 | 
						|
apt-get update -y
 | 
						|
apt-get upgrade -y
 | 
						|
 | 
						|
# 安装必要的包
 | 
						|
log "安装必要的包..."
 | 
						|
apt-get install -y \
 | 
						|
    curl \
 | 
						|
    wget \
 | 
						|
    unzip \
 | 
						|
    jq \
 | 
						|
    podman \
 | 
						|
    htop \
 | 
						|
    net-tools \
 | 
						|
    vim
 | 
						|
 | 
						|
# 启动 Podman
 | 
						|
log "启动 Podman 服务..."
 | 
						|
systemctl enable podman
 | 
						|
systemctl start podman
 | 
						|
usermod -aG podman ubuntu
 | 
						|
 | 
						|
# 安装 Nomad
 | 
						|
log "安装 Nomad ${nomad_version}..."
 | 
						|
cd /tmp
 | 
						|
wget -q https://releases.hashicorp.com/nomad/${nomad_version}/nomad_${nomad_version}_linux_amd64.zip
 | 
						|
unzip nomad_${nomad_version}_linux_amd64.zip
 | 
						|
mv nomad /usr/local/bin/
 | 
						|
chmod +x /usr/local/bin/nomad
 | 
						|
 | 
						|
# 创建 Nomad 用户和目录
 | 
						|
log "创建 Nomad 用户和目录..."
 | 
						|
useradd --system --home /etc/nomad.d --shell /bin/false nomad
 | 
						|
mkdir -p /opt/nomad/data
 | 
						|
mkdir -p /etc/nomad.d
 | 
						|
mkdir -p /var/log/nomad
 | 
						|
chown -R nomad:nomad /opt/nomad /etc/nomad.d /var/log/nomad
 | 
						|
 | 
						|
# 获取本机 IP 地址
 | 
						|
if [ "${bind_addr}" = "auto" ]; then
 | 
						|
    # 尝试多种方法获取 IP
 | 
						|
    BIND_ADDR=$(curl -s http://169.254.169.254/latest/meta-data/local-ipv4 2>/dev/null || \
 | 
						|
                curl -s http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/ip -H "Metadata-Flavor: Google" 2>/dev/null || \
 | 
						|
                ip route get 8.8.8.8 | awk '{print $7; exit}' || \
 | 
						|
                hostname -I | awk '{print $1}')
 | 
						|
else
 | 
						|
    BIND_ADDR="${bind_addr}"
 | 
						|
fi
 | 
						|
 | 
						|
log "检测到 IP 地址: $BIND_ADDR"
 | 
						|
 | 
						|
# 创建 Nomad 配置文件
 | 
						|
log "创建 Nomad 配置文件..."
 | 
						|
cat > /etc/nomad.d/nomad.hcl << EOF
 | 
						|
datacenter = "${datacenter}"
 | 
						|
region     = "global"
 | 
						|
data_dir   = "/opt/nomad/data"
 | 
						|
 | 
						|
bind_addr = "$BIND_ADDR"
 | 
						|
 | 
						|
%{ if server_enabled }
 | 
						|
server {
 | 
						|
  enabled          = true
 | 
						|
  bootstrap_expect = ${bootstrap_expect}
 | 
						|
  encrypt          = "${nomad_encrypt_key}"
 | 
						|
}
 | 
						|
%{ endif }
 | 
						|
 | 
						|
%{ if client_enabled }
 | 
						|
client {
 | 
						|
  enabled = true
 | 
						|
  
 | 
						|
  host_volume "podman-sock" {
 | 
						|
    path      = "/run/podman/podman.sock"
 | 
						|
    read_only = false
 | 
						|
  }
 | 
						|
}
 | 
						|
%{ endif }
 | 
						|
 | 
						|
ui {
 | 
						|
  enabled = true
 | 
						|
}
 | 
						|
 | 
						|
addresses {
 | 
						|
  http = "0.0.0.0"
 | 
						|
  rpc  = "$BIND_ADDR"
 | 
						|
  serf = "$BIND_ADDR"
 | 
						|
}
 | 
						|
 | 
						|
ports {
 | 
						|
  http = 4646
 | 
						|
  rpc  = 4647
 | 
						|
  serf = 4648
 | 
						|
}
 | 
						|
 | 
						|
plugin "podman" {
 | 
						|
  config {
 | 
						|
    volumes {
 | 
						|
      enabled = true
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
telemetry {
 | 
						|
  collection_interval        = "10s"
 | 
						|
  disable_hostname          = false
 | 
						|
  prometheus_metrics        = true
 | 
						|
  publish_allocation_metrics = true
 | 
						|
  publish_node_metrics      = true
 | 
						|
}
 | 
						|
 | 
						|
log_level = "INFO"
 | 
						|
log_file  = "/var/log/nomad/nomad.log"
 | 
						|
EOF
 | 
						|
 | 
						|
# 创建 systemd 服务文件
 | 
						|
log "创建 systemd 服务文件..."
 | 
						|
cat > /etc/systemd/system/nomad.service << EOF
 | 
						|
[Unit]
 | 
						|
Description=Nomad
 | 
						|
Documentation=https://www.nomadproject.io/
 | 
						|
Requires=network-online.target
 | 
						|
After=network-online.target
 | 
						|
ConditionFileNotEmpty=/etc/nomad.d/nomad.hcl
 | 
						|
 | 
						|
[Service]
 | 
						|
Type=notify
 | 
						|
User=nomad
 | 
						|
Group=nomad
 | 
						|
ExecStart=/usr/local/bin/nomad agent -config=/etc/nomad.d/nomad.hcl
 | 
						|
ExecReload=/bin/kill -HUP \$MAINPID
 | 
						|
KillMode=process
 | 
						|
Restart=on-failure
 | 
						|
LimitNOFILE=65536
 | 
						|
 | 
						|
[Install]
 | 
						|
WantedBy=multi-user.target
 | 
						|
EOF
 | 
						|
 | 
						|
# 启动 Nomad 服务
 | 
						|
log "启动 Nomad 服务..."
 | 
						|
systemctl daemon-reload
 | 
						|
systemctl enable nomad
 | 
						|
systemctl start nomad
 | 
						|
 | 
						|
# 等待服务启动
 | 
						|
log "等待 Nomad 服务启动..."
 | 
						|
sleep 10
 | 
						|
 | 
						|
# 验证安装
 | 
						|
log "验证 Nomad 安装..."
 | 
						|
if systemctl is-active --quiet nomad; then
 | 
						|
    log "✅ Nomad 服务运行正常"
 | 
						|
    log "📊 节点信息:"
 | 
						|
    /usr/local/bin/nomad node status -self || true
 | 
						|
else
 | 
						|
    log "❌ Nomad 服务启动失败"
 | 
						|
    systemctl status nomad --no-pager || true
 | 
						|
    journalctl -u nomad --no-pager -n 20 || true
 | 
						|
fi
 | 
						|
 | 
						|
# 配置防火墙(如果需要)
 | 
						|
log "配置防火墙规则..."
 | 
						|
if command -v ufw >/dev/null 2>&1; then
 | 
						|
    ufw allow 4646/tcp  # HTTP API
 | 
						|
    ufw allow 4647/tcp  # RPC
 | 
						|
    ufw allow 4648/tcp  # Serf
 | 
						|
    ufw allow 22/tcp    # SSH
 | 
						|
fi
 | 
						|
 | 
						|
# 创建有用的别名和脚本
 | 
						|
log "创建管理脚本..."
 | 
						|
cat > /usr/local/bin/nomad-status << 'EOF'
 | 
						|
#!/bin/bash
 | 
						|
echo "=== Nomad 服务状态 ==="
 | 
						|
systemctl status nomad --no-pager
 | 
						|
 | 
						|
echo -e "\n=== Nomad 集群成员 ==="
 | 
						|
nomad server members 2>/dev/null || echo "无法连接到集群"
 | 
						|
 | 
						|
echo -e "\n=== Nomad 节点状态 ==="
 | 
						|
nomad node status 2>/dev/null || echo "无法获取节点状态"
 | 
						|
 | 
						|
echo -e "\n=== 最近日志 ==="
 | 
						|
journalctl -u nomad --no-pager -n 5
 | 
						|
EOF
 | 
						|
 | 
						|
chmod +x /usr/local/bin/nomad-status
 | 
						|
 | 
						|
# 添加到 ubuntu 用户的 bashrc
 | 
						|
echo 'alias ns="nomad-status"' >> /home/ubuntu/.bashrc
 | 
						|
echo 'alias nomad-logs="journalctl -u nomad -f"' >> /home/ubuntu/.bashrc
 | 
						|
 | 
						|
log "🎉 Nomad 节点配置完成!"
 | 
						|
log "📍 数据中心: ${datacenter}"
 | 
						|
log "🌐 IP 地址: $BIND_ADDR"
 | 
						|
log "🔗 Web UI: http://$BIND_ADDR:4646"
 | 
						|
log "📝 使用 'nomad-status' 或 'ns' 命令查看状态"
 | 
						|
 | 
						|
# 输出重要信息到 motd
 | 
						|
cat > /etc/update-motd.d/99-nomad << EOF
 | 
						|
#!/bin/bash
 | 
						|
echo ""
 | 
						|
echo "🚀 Nomad 节点信息:"
 | 
						|
echo "   数据中心: ${datacenter}"
 | 
						|
echo "   IP 地址: $BIND_ADDR"
 | 
						|
echo "   Web UI: http://$BIND_ADDR:4646"
 | 
						|
echo "   状态检查: nomad-status"
 | 
						|
echo ""
 | 
						|
EOF
 | 
						|
 | 
						|
chmod +x /etc/update-motd.d/99-nomad
 | 
						|
 | 
						|
log "节点配置脚本执行完成" |