Files
ConfTemplate/src/schemas/keepalived.js
T
cnbugs d80d33e6f6 feat: 新增 15 个服务组件,总计 59 个
系统服务: NTP, DHCP, BIND, NFS, SAMBA, RSYNC, Sersync, vsftpd, Subversion
数据库中间件: Mycat
CI/CD: GitLab, Jenkins
高可用: Keepalived, HAProxy, LVS

新增 4 个分类: 系统服务、数据库中间件、CI/CD、高可用
2026-07-19 16:11:09 +08:00

297 lines
8.2 KiB
JavaScript

export const keepalivedSchema = {
id: 'keepalived',
name: 'Keepalived',
icon: 'Connection',
category: '高可用',
description: '基于 VRRP 协议的高可用解决方案,用于 IP 漂移和故障转移',
format: 'conf',
fileName: 'keepalived.conf',
groups: [
{
title: 'VRRP 实例配置',
fields: [
{
key: 'vrrpInstanceName',
label: 'VRRP 实例名称',
type: 'text',
default: 'VI_1',
},
{
key: 'interface',
label: '网络接口',
type: 'text',
default: 'eth0',
tip: '绑定的网络接口名称',
},
{
key: 'state',
label: '初始状态',
type: 'select',
options: [
{ label: 'MASTER - 主节点', value: 'master' },
{ label: 'BACKUP - 备节点', value: 'backup' },
],
default: 'master',
},
{
key: 'virtualRouterId',
label: '虚拟路由 ID',
type: 'number',
min: 1,
max: 255,
default: 51,
tip: '同一组的节点必须相同',
},
{
key: 'priority',
label: '优先级',
type: 'number',
min: 1,
max: 255,
default: 100,
tip: '数值越大优先级越高',
},
{
key: 'advertInt',
label: '通告间隔 (秒)',
type: 'number',
min: 1,
max: 255,
default: 1,
},
],
},
{
title: '认证配置',
fields: [
{
key: 'authType',
label: '认证类型',
type: 'text',
default: 'PASS',
tip: 'PASS 或 AH',
},
{
key: 'authPass',
label: '认证密码',
type: 'text',
default: '1234',
tip: '同一组的节点必须相同',
},
],
},
{
title: '虚拟 IP 配置',
fields: [
{
key: 'virtualIpAddress',
label: '虚拟 IP 地址',
type: 'text',
default: '192.168.1.100/24 dev eth0',
required: true,
tip: '格式: IP/MASK dev 接口',
},
],
},
{
title: '通知脚本',
fields: [
{
key: 'enableNotify',
label: '启用通知脚本',
type: 'switch',
default: false,
tip: '状态切换时执行的脚本',
},
{
key: 'notifyMaster',
label: '切换为 Master 时执行',
type: 'text',
default: "'/etc/keepalived/notify.sh master'",
dependsOn: { key: 'enableNotify', value: true },
},
{
key: 'notifyBackup',
label: '切换为 Backup 时执行',
type: 'text',
default: "'/etc/keepalived/notify.sh backup'",
dependsOn: { key: 'enableNotify', value: true },
},
{
key: 'notifyFault',
label: '进入 Fault 状态时执行',
type: 'text',
default: "'/etc/keepalived/notify.sh fault'",
dependsOn: { key: 'enableNotify', value: true },
},
],
},
{
title: '单播配置',
fields: [
{
key: 'enableVipUnicast',
label: '启用单播',
type: 'switch',
default: false,
tip: '使用单播代替组播通信',
},
{
key: 'unicastPeerIp',
label: '单播对端 IP',
type: 'text',
default: '192.168.1.2',
dependsOn: { key: 'enableVipUnicast', value: true },
},
],
},
{
title: '健康检查',
fields: [
{
key: 'enableHealthCheck',
label: '启用健康检查',
type: 'switch',
default: true,
},
{
key: 'healthCheckType',
label: '检查类型',
type: 'select',
options: [
{ label: 'TCP 端口检查', value: 'tcp' },
{ label: 'HTTP GET 检查', value: 'http_get' },
{ label: 'SSL GET 检查', value: 'ssl_get' },
{ label: 'SMTP 检查', value: 'smtp' },
{ label: 'MISC 自定义检查', value: 'misc_check' },
],
default: 'tcp',
dependsOn: { key: 'enableHealthCheck', value: true },
},
{
key: 'healthCheckUrl',
label: '检查 URL 路径',
type: 'text',
default: '/health',
dependsOn: { key: 'healthCheckType', valueIn: ['http_get', 'ssl_get'] },
},
{
key: 'healthCheckPort',
label: '检查端口',
type: 'number',
min: 1,
max: 65535,
default: 80,
dependsOn: { key: 'enableHealthCheck', value: true },
},
{
key: 'healthCheckTimeout',
label: '超时时间 (秒)',
type: 'number',
min: 1,
max: 30,
default: 3,
dependsOn: { key: 'enableHealthCheck', value: true },
},
{
key: 'healthCheckRetry',
label: '重试次数',
type: 'number',
min: 1,
max: 10,
default: 3,
dependsOn: { key: 'enableHealthCheck', value: true },
},
{
key: 'healthCheckDelayBeforeRetry',
label: '重试间隔 (秒)',
type: 'number',
min: 1,
max: 30,
default: 3,
dependsOn: { key: 'enableHealthCheck', value: true },
},
],
},
],
}
export function generateKeepalivedConf(config) {
const lines = []
lines.push(`# Keepalived 配置文件 - 由 ConfTemplate 生成`)
lines.push(`# 生成时间: ${new Date().toLocaleString('zh-CN')}`)
lines.push(``)
// VRRP Script (health check)
if (config.enableHealthCheck) {
lines.push(`vrrp_script chk_service {`)
if (config.healthCheckType === 'tcp') {
lines.push(` script "</dev/tcp/127.0.0.1/${config.healthCheckPort}"`)
} else if (config.healthCheckType === 'http_get') {
lines.push(` script "curl -s http://127.0.0.1:${config.healthCheckPort}${config.healthCheckUrl}"`)
} else if (config.healthCheckType === 'ssl_get') {
lines.push(` script "curl -sk https://127.0.0.1:${config.healthCheckPort}${config.healthCheckUrl}"`)
} else if (config.healthCheckType === 'smtp') {
lines.push(` script "nc -w ${config.healthCheckTimeout} 127.0.0.1 25 < /dev/null"`)
} else {
lines.push(` script "/etc/keepalived/check_script.sh"`)
}
lines.push(` interval ${config.healthCheckTimeout}`)
lines.push(` weight -20`)
lines.push(` fall ${config.healthCheckRetry}`)
lines.push(` rise ${config.healthCheckRetry}`)
lines.push(`}`)
lines.push(``)
}
// VRRP Instance
lines.push(`vrrp_instance ${config.vrrpInstanceName} {`)
lines.push(` state ${config.state.toUpperCase()}`)
lines.push(` interface ${config.interface}`)
lines.push(` virtual_router_id ${config.virtualRouterId}`)
lines.push(` priority ${config.priority}`)
lines.push(` advert_int ${config.advertInt}`)
lines.push(``)
// Auth
lines.push(` authentication {`)
lines.push(` auth_type ${config.authType}`)
lines.push(` auth_pass ${config.authPass}`)
lines.push(` }`)
lines.push(``)
// Virtual IP
lines.push(` virtual_ipaddress {`)
lines.push(` ${config.virtualIpAddress}`)
lines.push(` }`)
lines.push(``)
// Unicast
if (config.enableVipUnicast) {
lines.push(` unicast_src_ip ${config.virtualIpAddress.split('/')[0].trim()}`)
lines.push(` unicast_peer {`)
lines.push(` ${config.unicastPeerIp}`)
lines.push(` }`)
lines.push(``)
}
// Notify
if (config.enableNotify) {
lines.push(` notify_master ${config.notifyMaster}`)
lines.push(` notify_backup ${config.notifyBackup}`)
lines.push(` notify_fault ${config.notifyFault}`)
lines.push(``)
}
// Health check track
if (config.enableHealthCheck) {
lines.push(` track_script {`)
lines.push(` chk_service`)
lines.push(` }`)
}
lines.push(`}`)
return lines.join('\n')
}