158 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			HCL
		
	
	
	
			
		
		
	
	
			158 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			HCL
		
	
	
	
job "vault" {
 | 
						||
  datacenters = ["dc1"]
 | 
						||
  type        = "service"
 | 
						||
 | 
						||
  # 约束只在 warden、ch4、ash3c 节点上运行
 | 
						||
  constraint {
 | 
						||
    attribute = "${node.unique.name}"
 | 
						||
    operator  = "regexp"
 | 
						||
    value     = "^(warden|ch4|ash3c)$"
 | 
						||
  }
 | 
						||
 | 
						||
  group "vault" {
 | 
						||
    count = 3
 | 
						||
 | 
						||
    # 确保每个节点只运行一个实例
 | 
						||
    constraint {
 | 
						||
      operator  = "distinct_hosts"
 | 
						||
      value     = "true"
 | 
						||
    }
 | 
						||
 | 
						||
    # 网络配置
 | 
						||
    network {
 | 
						||
      port "http" {
 | 
						||
        static = 8200
 | 
						||
        to     = 8200
 | 
						||
      }
 | 
						||
    }
 | 
						||
 | 
						||
    # 服务发现配置 - 包含版本信息
 | 
						||
    service {
 | 
						||
      name = "vault"
 | 
						||
      port = "http"
 | 
						||
      
 | 
						||
      # 添加版本标签以避免检查拒绝
 | 
						||
      tags = [
 | 
						||
        "vault",
 | 
						||
        "secrets",
 | 
						||
        "version:1.20.3"
 | 
						||
      ]
 | 
						||
 | 
						||
      check {
 | 
						||
        name     = "vault-health"
 | 
						||
        type     = "http"
 | 
						||
        path     = "/v1/sys/health"
 | 
						||
        interval = "10s"
 | 
						||
        timeout  = "3s"
 | 
						||
        method   = "GET"
 | 
						||
        
 | 
						||
      }
 | 
						||
 | 
						||
      # 健康检查配置
 | 
						||
      check {
 | 
						||
        name     = "vault-sealed-check"
 | 
						||
        type     = "script"
 | 
						||
        command  = "/bin/sh"
 | 
						||
        args     = ["-c", "vault status -format=json | jq -r '.sealed' | grep -q 'false'"]
 | 
						||
        interval = "30s"
 | 
						||
        timeout  = "5s"
 | 
						||
        task     = "vault"
 | 
						||
      }
 | 
						||
    }
 | 
						||
 | 
						||
    # 任务配置
 | 
						||
    task "vault" {
 | 
						||
      driver = "raw_exec"
 | 
						||
 | 
						||
      # 资源配置
 | 
						||
      resources {
 | 
						||
        cpu    = 500
 | 
						||
        memory = 1024
 | 
						||
      }
 | 
						||
 | 
						||
      # 环境变量
 | 
						||
      env {
 | 
						||
        VAULT_ADDR = "http://127.0.0.1:8200"
 | 
						||
      }
 | 
						||
 | 
						||
      # 模板配置 - Vault 配置文件
 | 
						||
      template {
 | 
						||
        data = <<EOF
 | 
						||
ui = true
 | 
						||
 | 
						||
storage "consul" {
 | 
						||
  address = "127.0.0.1:8500"
 | 
						||
  path    = "vault"
 | 
						||
}
 | 
						||
 | 
						||
# HTTP listener (不使用 TLS,因为 nomad 会处理负载均衡)
 | 
						||
listener "tcp" {
 | 
						||
  address = "0.0.0.0:8200"
 | 
						||
  tls_disable = 1
 | 
						||
}
 | 
						||
 | 
						||
# 禁用 mlock 以避免权限问题
 | 
						||
disable_mlock = true
 | 
						||
 | 
						||
# 日志配置
 | 
						||
log_level = "INFO"
 | 
						||
log_format = "json"
 | 
						||
 | 
						||
# 性能优化
 | 
						||
max_lease_ttl = "168h"
 | 
						||
default_lease_ttl = "24h"
 | 
						||
 | 
						||
# HA 配置
 | 
						||
ha_storage "consul" {
 | 
						||
  address = "127.0.0.1:8500"
 | 
						||
  path    = "vault"
 | 
						||
}
 | 
						||
EOF
 | 
						||
        destination = "local/vault.hcl"
 | 
						||
        perms       = "644"
 | 
						||
        wait {
 | 
						||
          min = "2s"
 | 
						||
          max = "10s"
 | 
						||
        }
 | 
						||
      }
 | 
						||
 | 
						||
      # 启动命令
 | 
						||
      config {
 | 
						||
        command = "/usr/bin/vault"
 | 
						||
        args = [
 | 
						||
          "agent",
 | 
						||
          "-config=/local/vault.hcl"
 | 
						||
        ]
 | 
						||
      }
 | 
						||
 | 
						||
 | 
						||
      # 重启策略
 | 
						||
      restart {
 | 
						||
        attempts = 3
 | 
						||
        interval = "30m"
 | 
						||
        delay    = "15s"
 | 
						||
        mode     = "fail"
 | 
						||
      }
 | 
						||
    }
 | 
						||
 | 
						||
    # 更新策略
 | 
						||
    update {
 | 
						||
      max_parallel     = 1
 | 
						||
      health_check     = "checks"
 | 
						||
      min_healthy_time = "10s"
 | 
						||
      healthy_deadline = "5m"
 | 
						||
      progress_deadline = "10m"
 | 
						||
      auto_revert      = true
 | 
						||
      canary           = 0
 | 
						||
    }
 | 
						||
 | 
						||
    # 迁移策略
 | 
						||
    migrate {
 | 
						||
      max_parallel     = 1
 | 
						||
      health_check     = "checks"
 | 
						||
      min_healthy_time = "10s"
 | 
						||
      healthy_deadline = "5m"
 | 
						||
    }
 | 
						||
  }
 | 
						||
}
 |