Go template to write manifests

A ideia é deixares de escrever tanto YAML

Até poderias usar o pulumi, mas não era a mesma coisa

package main
 
import (
	"bytes"
	"fmt"
	"os"
	"os/exec"
	"text/template"
)
 
// Define the Go template for the NGINX deployment
const nginxDeploymentTemplate = `
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: {{ .Replicas }}
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:{{ .ImageTag }}
        ports:
        - containerPort: 80
`
 
// Define the Go template for the NGINX service
const nginxServiceTemplate = `
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: LoadBalancer
`
 
// Struct to hold deployment parameters
type NginxDeployment struct {
	Replicas int
	ImageTag string
}
 
// Function to render a Go template
func renderTemplate(templateContent string, data interface{}) (string, error) {
	tmpl, err := template.New("k8s").Parse(templateContent)
	if err != nil {
		return "", err
	}
 
	var rendered bytes.Buffer
	err = tmpl.Execute(&rendered, data)
	if err != nil {
		return "", err
	}
 
	return rendered.String(), nil
}
 
// Function to apply Kubernetes manifests using kubectl
func applyManifest(manifest string) error {
	cmd := exec.Command("kubectl", "apply", "-f", "-")
	cmd.Stdin = bytes.NewBufferString(manifest)
	cmd.Stdout = os.Stdout
	cmd.Stderr = os.Stderr
	return cmd.Run()
}
 
func main() {
	// Define the deployment configuration
	deployConfig := NginxDeployment{
		Replicas: 3,
		ImageTag: "latest",
	}
 
	// Generate Deployment YAML
	deploymentYaml, err := renderTemplate(nginxDeploymentTemplate, deployConfig)
	if err != nil {
		fmt.Println("Error rendering deployment template:", err)
		os.Exit(1)
	}
 
	// Generate Service YAML
	serviceYaml, err := renderTemplate(nginxServiceTemplate, nil)
	if err != nil {
		fmt.Println("Error rendering service template:", err)
		os.Exit(1)
	}
 
	// Apply the Deployment
	fmt.Println("Applying NGINX Deployment...")
	if err := applyManifest(deploymentYaml); err != nil {
		fmt.Println("Error applying deployment:", err)
		os.Exit(1)
	}
 
	// Apply the Service
	fmt.Println("Applying NGINX Service...")
	if err := applyManifest(serviceYaml); err != nil {
		fmt.Println("Error applying service:", err)
		os.Exit(1)
	}
 
	fmt.Println("NGINX deployment completed successfully!")
}

Ref