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!")
}