重构架构
This commit is contained in:
96
internal/cli/tmpl/render.go
Normal file
96
internal/cli/tmpl/render.go
Normal file
@@ -0,0 +1,96 @@
|
||||
package tmpl
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
log "sunhpc/pkg/logger"
|
||||
templating "sunhpc/pkg/templating"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
var (
|
||||
tmplFile string
|
||||
hostname string
|
||||
domain string
|
||||
oldHostname string
|
||||
ip string
|
||||
clusterName string
|
||||
outputRoot string
|
||||
)
|
||||
|
||||
func newRenderCmd() *cobra.Command {
|
||||
cmd := &cobra.Command{
|
||||
Use: "render <template-name>",
|
||||
Short: "渲染配置模板",
|
||||
Long: "根据 YAML 模板和上下文变量生成配置文件或脚本",
|
||||
Args: cobra.ExactArgs(1),
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
tmplName := args[0]
|
||||
var template *templating.Template
|
||||
var err error
|
||||
|
||||
// 优先使用 -f 指定的外部模版文件
|
||||
if tmplFile != "" {
|
||||
template, err = templating.LoadTemplate(tmplFile)
|
||||
if err != nil {
|
||||
return fmt.Errorf("加载外部模板失败: %w", err)
|
||||
}
|
||||
log.Infof("✅ 外部模板 '%s' 已加载\n", tmplFile)
|
||||
} else {
|
||||
// 否则从内置模板加载
|
||||
template, err = templating.LoadEmbeddedTemplate(tmplName)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
log.Infof("✅ 内置模板 '%s' 已加载\n", tmplName)
|
||||
}
|
||||
|
||||
ctx := templating.Context{
|
||||
Node: templating.NodeInfo{
|
||||
Hostname: hostname,
|
||||
OldHostname: oldHostname,
|
||||
Domain: domain,
|
||||
IP: ip,
|
||||
},
|
||||
Cluster: templating.ClusterInfo{
|
||||
Name: clusterName,
|
||||
},
|
||||
}
|
||||
|
||||
rendered, err := template.Render(ctx)
|
||||
if err != nil {
|
||||
return fmt.Errorf("模板渲染失败: %w", err)
|
||||
}
|
||||
|
||||
// 处理 post 阶段
|
||||
if steps, ok := rendered["post"]; ok {
|
||||
fmt.Println(">>> 执行 post 阶段")
|
||||
if err := templating.WriteFiles(steps, outputRoot); err != nil {
|
||||
return err
|
||||
}
|
||||
templating.PrintScripts(steps)
|
||||
}
|
||||
|
||||
// 处理 configure 阶段
|
||||
if steps, ok := rendered["configure"]; ok {
|
||||
fmt.Println(">>> 执行 configure 阶段")
|
||||
templating.PrintScripts(steps)
|
||||
}
|
||||
|
||||
fmt.Println("✅ 模板渲染完成")
|
||||
return nil
|
||||
},
|
||||
}
|
||||
|
||||
cmd.Flags().StringVarP(&tmplFile, "file", "f", "", "指定模板文件路径(覆盖默认查找)")
|
||||
cmd.Flags().StringVar(&hostname, "hostname", "", "节点主机名")
|
||||
cmd.Flags().StringVar(&domain, "domain", "cluster.local", "DNS 域名")
|
||||
cmd.Flags().StringVar(&oldHostname, "old-hostname", "", "旧主机名(用于迁移)")
|
||||
cmd.Flags().StringVar(&ip, "ip", "", "节点 IP 地址")
|
||||
cmd.Flags().StringVar(&clusterName, "cluster", "default", "集群名称")
|
||||
cmd.Flags().StringVarP(&outputRoot, "output", "o", "/", "文件输出根目录")
|
||||
|
||||
_ = cmd.MarkFlagRequired("hostname")
|
||||
return cmd
|
||||
}
|
||||
Reference in New Issue
Block a user