package ansible import ( "fmt" "os" "path/filepath" "text/template" ) // InventoryHost represents a single host in the inventory type InventoryHost struct { Name string IP string Port int User string AuthMethod string SSHKey string Password string DeployType string Token string GRPCURL string } // Inventory represents an Ansible inventory file type Inventory struct { Hosts []InventoryHost } const inventoryTemplateText = `{{ range .Hosts }} {{ .Name }} ansible_host={{ .IP }} ansible_port={{ .Port }} ansible_user={{ .User }} ansible_connection=ssh {{ if eq .AuthMethod "key" }}ansible_ssh_private_key_file={{ .SSHKey }}{{ end }} {{ if eq .AuthMethod "password" }}ansible_ssh_pass={{ .Password }}{{ end }} deploy_type={{ .DeployType }} agent_token={{ .Token }} agent_label={{ .Name }} grpc_url={{ .GRPCURL }} {{ end }}` // GenerateInventory generates an Ansible inventory file from the given hosts func GenerateInventory(hosts []InventoryHost, outputPath string) error { tmpl, err := template.New("inventory").Parse(inventoryTemplateText) if err != nil { return fmt.Errorf("failed to parse inventory template: %w", err) } // Ensure directory exists dir := filepath.Dir(outputPath) if err := os.MkdirAll(dir, 0755); err != nil { return fmt.Errorf("failed to create inventory directory: %w", err) } file, err := os.Create(outputPath) if err != nil { return fmt.Errorf("failed to create inventory file: %w", err) } defer file.Close() if err := tmpl.Execute(file, Inventory{Hosts: hosts}); err != nil { return fmt.Errorf("failed to execute inventory template: %w", err) } return nil }