276 lines
6.3 KiB
Bash
276 lines
6.3 KiB
Bash
#!/bin/bash
|
|
|
|
# Nomad 节点用户数据脚本
|
|
# 用于自动配置 Nomad 节点,支持服务器和客户端模式
|
|
|
|
set -e
|
|
|
|
# 日志函数
|
|
log() {
|
|
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1"
|
|
}
|
|
|
|
log "开始 Nomad 节点配置..."
|
|
|
|
# 更新系统
|
|
log "更新系统包..."
|
|
apt-get update
|
|
apt-get upgrade -y
|
|
|
|
# 安装必要工具
|
|
log "安装必要工具..."
|
|
apt-get install -y curl unzip wget gnupg software-properties-common
|
|
|
|
# 安装 Podman (作为容器运行时)
|
|
log "安装 Podman..."
|
|
. /etc/os-release
|
|
echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/ /" | tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
|
|
curl -L "https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/Release.key" | apt-key add -
|
|
apt-get update
|
|
apt-get install -y podman
|
|
|
|
# 配置 Podman
|
|
log "配置 Podman..."
|
|
mkdir -p /etc/containers
|
|
echo -e "[registries.search]\nregistries = ['docker.io']" > /etc/containers/registries.conf
|
|
|
|
# 下载并安装 Nomad
|
|
log "安装 Nomad..."
|
|
NOMAD_VERSION=${nomad_version}
|
|
NOMAD_ZIP="nomad_${NOMAD_VERSION}_linux_amd64.zip"
|
|
NOMAD_URL="https://releases.hashicorp.com/nomad/${NOMAD_VERSION}/${NOMAD_ZIP}"
|
|
NOMAD_SHA256_URL="https://releases.hashicorp.com/nomad/${NOMAD_VERSION}/nomad_${NOMAD_VERSION}_SHA256SUMS"
|
|
|
|
cd /tmp
|
|
wget -q ${NOMAD_URL}
|
|
wget -q ${NOMAD_SHA256_URL}
|
|
sha256sum -c nomad_${NOMAD_VERSION}_SHA256SUMS --ignore-missing
|
|
unzip -o ${NOMAD_ZIP} -d /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
|
|
# Nomad 配置文件
|
|
datacenter = "${datacenter}"
|
|
data_dir = "/opt/nomad/data"
|
|
log_level = "INFO"
|
|
|
|
# 客户端配置
|
|
client {
|
|
enabled = true
|
|
servers = ["${nomad_servers}"]
|
|
options {
|
|
"driver.raw_exec.enable" = "1"
|
|
"driver.podman.enabled" = "1"
|
|
}
|
|
}
|
|
|
|
# 服务器配置
|
|
server {
|
|
enabled = ${server_enabled}
|
|
bootstrap_expect = ${bootstrap_expect}
|
|
}
|
|
|
|
# Consul 集成
|
|
consul {
|
|
address = "127.0.0.1:8500"
|
|
token = "${consul_token}"
|
|
}
|
|
|
|
# 加密设置
|
|
encrypt = "${nomad_encrypt_key}"
|
|
|
|
# 网络配置
|
|
network {
|
|
mode = "bridge"
|
|
}
|
|
|
|
# UI 配置
|
|
ui {
|
|
enabled = true
|
|
}
|
|
|
|
# 插件目录
|
|
plugin_dir = "/opt/nomad/plugins"
|
|
EOF
|
|
|
|
# 创建 systemd 服务文件
|
|
log "创建 systemd 服务文件..."
|
|
cat > /etc/systemd/system/nomad.service << EOF
|
|
[Unit]
|
|
Description=Nomad
|
|
Documentation=https://www.nomadproject.io/
|
|
Wants=network-online.target
|
|
After=network-online.target
|
|
|
|
[Service]
|
|
ExecReload=/bin/kill -HUP \$MAINPID
|
|
ExecStart=/usr/local/bin/nomad agent -config /etc/nomad.d
|
|
KillMode=process
|
|
KillSignal=SIGINT
|
|
LimitNOFILE=65536
|
|
LimitNPROC=infinity
|
|
Restart=on-failure
|
|
RestartSec=2
|
|
StartLimitBurst=3
|
|
StartLimitInterval=10
|
|
TasksMax=infinity
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
EOF
|
|
|
|
# 启动 Nomad 服务
|
|
log "启动 Nomad 服务..."
|
|
systemctl daemon-reload
|
|
systemctl enable nomad
|
|
systemctl start nomad
|
|
|
|
# 等待服务启动
|
|
log "等待 Nomad 服务启动..."
|
|
sleep 10
|
|
|
|
# 验证 Nomad 状态
|
|
if systemctl is-active --quiet nomad; then
|
|
log "Nomad 服务启动成功"
|
|
else
|
|
log "Nomad 服务启动失败"
|
|
journalctl -u nomad --no-pager
|
|
exit 1
|
|
fi
|
|
|
|
# 创建 Nomad 客户端状态检查脚本
|
|
log "创建状态检查脚本..."
|
|
cat > /usr/local/bin/check-nomad.sh << 'EOF'
|
|
#!/bin/bash
|
|
# Nomad 状态检查脚本
|
|
|
|
set -e
|
|
|
|
# 检查 Nomad 服务状态
|
|
if systemctl is-active --quiet nomad; then
|
|
echo "Nomad 服务运行正常"
|
|
else
|
|
echo "Nomad 服务未运行"
|
|
exit 1
|
|
fi
|
|
|
|
# 检查 Nomad 节点状态
|
|
NODE_STATUS=$(nomad node status -self -json | jq -r '.Status')
|
|
if [ "$NODE_STATUS" = "ready" ]; then
|
|
echo "Nomad 节点状态: $NODE_STATUS"
|
|
else
|
|
echo "Nomad 节点状态异常: $NODE_STATUS"
|
|
exit 1
|
|
fi
|
|
|
|
# 检查 Nomad 集群成员
|
|
SERVER_MEMBERS=$(nomad server members 2>/dev/null | grep -c "alive" || echo "0")
|
|
if [ "$SERVER_MEMBERS" -gt 0 ]; then
|
|
echo "Nomad 集群服务器成员: $SERVER_MEMBERS"
|
|
else
|
|
echo "未找到 Nomad 集群服务器成员"
|
|
exit 1
|
|
fi
|
|
|
|
echo "Nomad 状态检查完成"
|
|
EOF
|
|
|
|
chmod +x /usr/local/bin/check-nomad.sh
|
|
|
|
# 设置防火墙规则
|
|
log "设置防火墙规则..."
|
|
if command -v ufw >/dev/null 2>&1; then
|
|
ufw allow 4646/tcp # Nomad HTTP
|
|
ufw allow 4647/tcp # Nomad RPC
|
|
ufw allow 4648/tcp # Nomad Serf
|
|
ufw --force enable
|
|
elif command -v firewall-cmd >/dev/null 2>&1; then
|
|
firewall-cmd --permanent --add-port=4646/tcp
|
|
firewall-cmd --permanent --add-port=4647/tcp
|
|
firewall-cmd --permanent --add-port=4648/tcp
|
|
firewall-cmd --reload
|
|
fi
|
|
|
|
# 创建简单的 Nomad 任务示例
|
|
log "创建示例任务..."
|
|
mkdir -p /opt/nomad/examples
|
|
cat > /opt/nomad/examples/redis.nomad << 'EOF'
|
|
job "redis" {
|
|
datacenters = ["dc1", "dc2", "dc3"]
|
|
type = "service"
|
|
priority = 50
|
|
|
|
update {
|
|
stagger = "10s"
|
|
max_parallel = 1
|
|
}
|
|
|
|
group "redis" {
|
|
count = 1
|
|
|
|
restart {
|
|
attempts = 3
|
|
delay = "30s"
|
|
interval = "5m"
|
|
mode = "fail"
|
|
}
|
|
|
|
task "redis" {
|
|
driver = "podman"
|
|
|
|
config {
|
|
image = "redis:alpine"
|
|
ports = ["redis"]
|
|
}
|
|
|
|
resources {
|
|
cpu = 200 # MHz
|
|
memory = 128 # MB
|
|
|
|
network {
|
|
mbits = 10
|
|
port "redis" {
|
|
static = 6379
|
|
}
|
|
}
|
|
}
|
|
|
|
service {
|
|
name = "redis"
|
|
port = "redis"
|
|
check {
|
|
type = "tcp"
|
|
interval = "10s"
|
|
timeout = "2s"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
EOF
|
|
|
|
log "Nomad 节点配置完成"
|
|
log "Nomad UI 可通过 http://$(curl -s http://169.254.169.254/latest/meta-data/public-ipv4):4646 访问" |