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     = "dc1"
 | |
| 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 "节点配置脚本执行完成" |