From 49a352c6540ff77a2dd2c704d6a613be60ea52e0 Mon Sep 17 00:00:00 2001
From: cheliequan <liequanche@126.com>
Date: 星期三, 24 五月 2023 18:10:48 +0800
Subject: [PATCH] 重构项目,导出函数手写字母大写

---
 src/k8s/create.go      |   14 -
 src/main/main.go       |   24 +--
 go.sum                 |    6 
 src/rancher/ranche.go  |  110 +++++++++++++
 src/cluster/cluster.go |  246 ++++--------------------------
 src/util/util.go       |   10 
 go.mod                 |    1 
 src/k8s/delete.go      |   14 -
 8 files changed, 174 insertions(+), 251 deletions(-)

diff --git a/go.mod b/go.mod
index e96a977..ab3eb52 100644
--- a/go.mod
+++ b/go.mod
@@ -3,6 +3,7 @@
 go 1.14
 
 require (
+	golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0
 	k8s.io/api v0.20.2
 	k8s.io/apimachinery v0.20.2
 	k8s.io/client-go v0.20.0
diff --git a/go.sum b/go.sum
index 86c6572..734d07f 100644
--- a/go.sum
+++ b/go.sum
@@ -160,6 +160,12 @@
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/rancher/client-go v1.5.1 h1:RqwrSLR+sgaXTC/0nraGDDB58fFySWuMyANCpxdXN2I=
+github.com/rancher/client-go v1.25.4-rancher1 h1:9MlBC8QbgngUkhNzMR8rZmmCIj6WNRHFOnYiwC2Kty4=
+github.com/rancher/go-rancher v0.1.0 h1:YIKWwe5giu2WICfyCcGqX+m4XTRbMpA8vzLxl1Kwb7w=
+github.com/rancher/go-rancher v0.1.0/go.mod h1:7oQvGNiJsGvrUgB+7AH8bmdzuR0uhULfwKb43Ht0hUk=
+github.com/rancherio/go-rancher v0.1.0 h1:rwAwhMXyNdA82hglnWxKwkoAvQ8UKo0i0SudM1mTYfY=
+github.com/rancherio/go-rancher v0.1.0/go.mod h1:VXd0Uc4WrlOE85WC4Syk7rY+VNPxBhHXoTgcB1Gquo0=
 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
 github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
diff --git a/src/cluster/cluster.go b/src/cluster/cluster.go
index 68686a0..4245064 100644
--- a/src/cluster/cluster.go
+++ b/src/cluster/cluster.go
@@ -1,18 +1,16 @@
-package main
+package cluster
 
 import (
+	"_/E_/git/aps_deploy/src/util"
 	"bytes"
-	"context"
-	"crypto/tls"
 	"encoding/json"
 	"fmt"
 	"log"
 	"net/http"
 	"os"
 	"strings"
-	"time"
 
-	"golang.org/x/crypto/ssh"
+	"../util"
 )
 
 type Cluster struct {
@@ -32,7 +30,7 @@
 	NodeCommand string `json:"nodeCommand"`
 }
 
-func createRegistrationToken(serverURL, bearerToken, clusterID string) (string, error) {
+func CreateRegistrationToken(serverURL, bearerToken, clusterID string) (string, error) {
 	url := fmt.Sprintf("%s/v3/clusterregistrationtokens", serverURL)
 
 	payload := strings.NewReader(fmt.Sprintf(`{
@@ -47,7 +45,7 @@
 	req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", bearerToken))
 	req.Header.Set("Content-Type", "application/json")
 
-	client := createHTTPClient()
+	client := util.CreateHTTPClient()
 
 	resp, err := client.Do(req)
 	if err != nil {
@@ -68,7 +66,7 @@
 	return tokenResp.Command, nil
 }
 
-func getNodeCommand(serverURL, bearerToken, clusterID string) (string, error) {
+func GetNodeCommand(serverURL, bearerToken, clusterID string) (string, error) {
 	url := fmt.Sprintf("%s/v3/clusterregistrationtokens", serverURL)
 
 	payload := map[string]interface{}{
@@ -88,7 +86,7 @@
 	req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", bearerToken))
 	req.Header.Set("Content-Type", "application/json")
 
-	client := createHTTPClient()
+	client := util.CreateHTTPClient()
 
 	resp, err := client.Do(req)
 	if err != nil {
@@ -109,7 +107,7 @@
 	return nodeCommandResponse.NodeCommand, nil
 }
 
-func getClusterID(serverURL, bearerToken, clusterName string) (string, error) {
+func GetClusterID(serverURL, bearerToken, clusterName string) (string, error) {
 	url := fmt.Sprintf("%s/v3/clusters", serverURL)
 
 	req, err := http.NewRequest("GET", url, nil)
@@ -119,7 +117,7 @@
 
 	req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", bearerToken))
 
-	client := createHTTPClient()
+	client := util.CreateHTTPClient()
 
 	resp, err := client.Do(req)
 	if err != nil {
@@ -147,133 +145,6 @@
 	}
 
 	return "", fmt.Errorf("cluster '%s' not found", clusterName)
-}
-
-// Create an HTTP client with insecure TLS configuration
-func createHTTPClient() *http.Client {
-	transport := &http.Transport{
-		TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
-	}
-	return &http.Client{Transport: transport}
-}
-
-func sshExec(nodeIP, sshUsername, sshPassword, remoteSSHCommand string, sshPort int) (string, error) {
-	// SSH 杩炴帴閰嶇疆
-	config := &ssh.ClientConfig{
-		User: sshUsername,
-		Auth: []ssh.AuthMethod{
-			ssh.Password(sshPassword),
-		},
-		HostKeyCallback: ssh.InsecureIgnoreHostKey(),
-	}
-
-	// 杩炴帴鍒拌繙绋嬫湇鍔″櫒
-	client, err := ssh.Dial("tcp", fmt.Sprintf("%s:%d", nodeIP, sshPort), config)
-	if err != nil {
-		return "", fmt.Errorf("failed to connect to node %s: %v", nodeIP, err)
-	}
-	defer client.Close()
-
-	// 鍒涘缓浼氳瘽
-	session, err := client.NewSession()
-	if err != nil {
-		return "", fmt.Errorf("failed to create SSH session: %v", err)
-	}
-	defer session.Close()
-
-	// 鍒涘缓涓�涓叿鏈夎秴鏃剁殑涓婁笅鏂�
-	ctx, cancel := context.WithTimeout(context.Background(), 300*time.Second)
-	defer cancel()
-
-	// 閫氳繃浼氳瘽鎵ц杩滅▼鍛戒护
-	outputChan := make(chan string)
-	errorChan := make(chan error)
-	go func() {
-		// 鍒涘缓涓�涓繛鎺ユ爣鍑嗚緭鍏ョ殑绠¢亾
-		stdinPipe, err := session.StdinPipe()
-		if err != nil {
-			errorChan <- fmt.Errorf("failed to create stdin pipe: %v", err)
-			return
-		}
-
-		// 鍚姩浼氳瘽
-		if err := session.Start(fmt.Sprintf("sudo -SE %s", remoteSSHCommand)); err != nil {
-			errorChan <- fmt.Errorf("failed to start command: %v err锛�%v", remoteSSHCommand, err)
-			return
-		}
-
-		// 灏嗗瘑鐮佸啓鍏ユ爣鍑嗚緭鍏ョ閬�
-		_, err = fmt.Fprintf(stdinPipe, "%s\n", sshPassword)
-		if err != nil {
-			errorChan <- fmt.Errorf("failed to write password to stdin: %v", err)
-			return
-		}
-
-		// 绛夊緟浼氳瘽缁撴潫
-		if err := session.Wait(); err != nil {
-			errorChan <- fmt.Errorf("command execution failed: %v err锛�%v", remoteSSHCommand, err)
-			return
-		}
-
-		outputChan <- ""
-	}()
-
-	// 绛夊緟缁撴灉鎴栬秴鏃�
-	select {
-	case <-ctx.Done():
-		// 鍏抽棴浼氳瘽浠ョ粓姝㈣繙绋嬪懡浠�
-		session.Close()
-		// 绛夊緟浼氳瘽鍏抽棴鐨� goroutine 缁撴潫
-		<-outputChan
-		return "", fmt.Errorf("SSH command execution timed out")
-	case err := <-errorChan:
-		return "", err
-	case <-outputChan:
-		fmt.Printf("Command: %v executed on the remote server: %s\n", remoteSSHCommand, nodeIP)
-		return "", nil
-	}
-}
-
-// 瀹夎Docker
-func installDocker(nodeIP, sshUsername, sshPassword string, sshPort int) error {
-	// 妫�鏌ocker鏄惁宸插畨瑁�
-	checkCommand := "which docker"
-	_, err := sshExec(nodeIP, sshUsername, sshPassword, checkCommand, sshPort)
-	if err == nil {
-		fmt.Println("Docker is already installed on the remote server.")
-		return nil
-	}
-
-	// 瀹夎Docker
-	installCommand := "sudo curl -fsSL https://get.docker.com -o get-docker.sh && sudo sh get-docker.sh"
-	_, err = sshExec(nodeIP, sshUsername, sshPassword, installCommand, sshPort)
-	if err != nil {
-		return fmt.Errorf("failed to install Docker on the remote server: %v", err)
-	}
-
-	fmt.Println("Docker has been installed on the remote server.")
-	return nil
-}
-
-// 瀹夎kubectl
-func installKubectl(nodeIP, sshUsername, sshPassword string, sshPort int) error {
-	// 妫�鏌ubectl鏄惁宸插畨瑁�
-	checkCommand := "which kubectl"
-	_, err := sshExec(nodeIP, sshUsername, sshPassword, checkCommand, sshPort)
-	if err == nil {
-		fmt.Println("kubectl is already installed on the remote server.")
-		return nil
-	}
-
-	// 瀹夎kubectl
-	installCommand := "sudo curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl && sudo chmod +x kubectl && sudo mv kubectl /usr/local/bin/"
-	_, err = sshExec(nodeIP, sshUsername, sshPassword, installCommand, sshPort)
-	if err != nil {
-		return fmt.Errorf("failed to install kubectl on the remote server: %v", err)
-	}
-
-	fmt.Println("kubectl has been installed on the remote server.")
-	return nil
 }
 
 type Node struct {
@@ -328,35 +199,36 @@
 }
 
 // Deploy Kubernetes roles on a node using SSH
-func deployk8sRolesOnNode(nodeIP, sshUsername, sshPassword, remoteSSHCommand string, sshPort int, roles []string) error {
+func Deployk8sRolesOnNode(nodeIP, sshUsername, sshPassword, remoteSSHCommand string, sshPort int, roles []string) error {
 	rancherAgentInstalled, err := isRancherAgentInstalled(nodeIP, sshUsername, sshPassword, sshPort)
 	if err == nil {
 		return nil
 	}
 
 	if !rancherAgentInstalled {
-	// Add role parameters to nodeCommand
-	for _, role := range roles {
-		switch role {
-		case "etcd":
-			remoteSSHCommand += " --etcd"
-		case "controlplane":
-			remoteSSHCommand += " --controlplane"
-		case "worker":
-			remoteSSHCommand += " --worker"
-		default:
-			log.Fatalf("invalid role specified : %s", role)
+		// Add role parameters to nodeCommand
+		for _, role := range roles {
+			switch role {
+			case "etcd":
+				remoteSSHCommand += " --etcd"
+			case "controlplane":
+				remoteSSHCommand += " --controlplane"
+			case "worker":
+				remoteSSHCommand += " --worker"
+			default:
+				log.Fatalf("invalid role specified : %s", role)
+			}
 		}
-	}
 
-	_, err := sshExec(nodeIP, sshUsername, sshPassword, remoteSSHCommand, sshPort)
-	if err != nil {
-		return fmt.Errorf("failed to deploy Kubernetes roles on the remote server: %v", err)
+		_, err := sshExec(nodeIP, sshUsername, sshPassword, remoteSSHCommand, sshPort)
+		if err != nil {
+			return fmt.Errorf("failed to deploy Kubernetes roles on the remote server: %v", err)
+		}
+		return nil
 	}
-	return nil
 }
 
-func isRancherInstalled(ip, username, password string, sshPort int) (bool, error) {
+func IsRancherInstalled(ip, username, password string, sshPort int) (bool, error) {
 	// 妫�鏌ancher瀹瑰櫒鏄惁宸茶繍琛�
 	checkRancherCommand := "sudo docker ps --format '{{.Image}}' | grep -q rancher/rancher:v2.5.17"
 	_, err := sshExec(ip, username, password, checkRancherCommand, sshPort)
@@ -368,7 +240,7 @@
 	return true, nil
 }
 
-func isRancherAgentInstalled(ip, username, password string, sshPort int) (bool, error) {
+func IsRancherAgentInstalled(ip, username, password string, sshPort int) (bool, error) {
 	// 妫�鏌ancher瀹瑰櫒鏄惁宸茶繍琛�
 	checkRancherCommand := "sudo docker ps --format '{{.Image}}' | grep -q rancher/rancher-agent:v2.5."
 	_, err := sshExec(ip, username, password, checkRancherCommand, sshPort)
@@ -380,43 +252,7 @@
 	return true, nil
 }
 
-func installRancher(ip, username, password string, sshPort int) error {
-	rancherInstalled, err := isRancherInstalled(ip, username, password, sshPort)
-	if err == nil {
-		return nil
-	}
-
-	if !rancherInstalled {
-		// 瀹夎Rancher鍛戒护
-		rancherCommand := "sudo docker run --privileged  -d --restart=unless-stopped -p 8081:80 -p 8443:443  -v /opt/rancher:/var/lib/rancher registry.cn-hangzhou.aliyuncs.com/rancher/rancher:v2.5.17"
-		_, err = sshExec(ip, username, password, rancherCommand, sshPort)
-		if err != nil {
-			return fmt.Errorf("failed to install Rancher: %v", err)
-		}
-	} else {
-		fmt.Println("Rancher is already installed on the remote server.")
-	}
-
-	return nil
-}
-
-func installDockerAndRancher(ip, username, password string, sshPort int) error {
-	// 瀹夎Docker鍛戒护
-	err := installDocker(ip, username, password, sshPort)
-	if err != nil {
-		return err
-	}
-
-	// 瀹夎Rancher鍛戒护
-	err = installRancher(ip, username, password, sshPort)
-	if err != nil {
-		return err
-	}
-
-	return nil
-}
-
-func createCluster(rancherConfig RancherConfig, clusterName string) error {
+func CreateCluster(rancherConfig RancherConfig, clusterName string) error {
 	requestBody := createClusterData(clusterName)
 
 	url := fmt.Sprintf("%s/v3/clusters", rancherConfig.RancherURL)
@@ -428,7 +264,7 @@
 	req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", rancherConfig.BearerToken))
 	req.Header.Set("Content-Type", "application/json")
 
-	client := createHTTPClient()
+	client := util.CreateHTTPClient()
 
 	resp, err := client.Do(req)
 	if err != nil {
@@ -481,12 +317,6 @@
 		// Add more nodes here if needed
 	}
 
-	//install rancher on master node
-	err := installDockerAndRancher(nodes[0].IP, nodes[0].SSHUsername, nodes[0].SSHPassword, nodes[0].SSHPort)
-	if err != nil {
-		log.Fatalf("Failed to install Rancher: %v", err)
-	}
-
 	// Create the cluster
 	// Rancher configuration
 	/*rancherConfig := RancherConfig{
@@ -500,15 +330,15 @@
 	}
 
 	//	Deploy clusterId
-	clusterID, err := getClusterID(rancherConfig.RancherURL, rancherConfig.BearerToken, clusterName)
+	clusterID, err := GetClusterID(rancherConfig.RancherURL, rancherConfig.BearerToken, clusterName)
 	if err != nil {
 		log.Fatal(err)
-		err = createCluster(rancherConfig, clusterName)
+		err = CreateCluster(rancherConfig, clusterName)
 		if err != nil {
 			log.Fatalf("Failed to create cluster: %v", err)
 		}
 		fmt.Printf("Cluster created: %s\n", clusterName)
-		clusterID, err = getClusterID(rancherConfig.RancherURL, rancherConfig.BearerToken, clusterName)
+		clusterID, err = GetClusterID(rancherConfig.RancherURL, rancherConfig.BearerToken, clusterName)
 		if err != nil {
 			log.Fatal(err)
 		}
@@ -516,7 +346,7 @@
 	fmt.Println(clusterID)
 
 	//	Deploy nodeCommand
-	nodeCommand, err := getNodeCommand(rancherConfig.RancherURL, rancherConfig.BearerToken, clusterID)
+	nodeCommand, err := GetNodeCommand(rancherConfig.RancherURL, rancherConfig.BearerToken, clusterID)
 	if err != nil {
 		log.Fatal(err)
 	}
@@ -524,19 +354,19 @@
 
 	for _, node := range nodes {
 		//Deploy Docker on each node
-		err = installDocker(node.IP, node.SSHUsername, node.SSHPassword, node.SSHPort)
+		err = util.InstallDocker(node.IP, node.SSHUsername, node.SSHPassword, node.SSHPort)
 		if err != nil {
 			log.Fatal(err)
 		}
 
 		// Deploy Kubectl on each node
-		err = installKubectl(node.IP, node.SSHUsername, node.SSHPassword, node.SSHPort)
+		err = util.InstallKubectl(node.IP, node.SSHUsername, node.SSHPassword, node.SSHPort)
 		if err != nil {
 			log.Fatal(err)
 		}
 
 		// Deploy Kubernetes roles on each node
-		err = deployk8sRolesOnNode(node.IP, node.SSHUsername, node.SSHPassword, nodeCommand, node.SSHPort, node.Roles)
+		err = Deployk8sRolesOnNode(node.IP, node.SSHUsername, node.SSHPassword, nodeCommand, node.SSHPort, node.Roles)
 		if err != nil {
 			log.Fatal(err)
 		}
diff --git a/src/create/main.go b/src/k8s/create.go
similarity index 95%
rename from src/create/main.go
rename to src/k8s/create.go
index 6a3ad5d..53e4ef0 100644
--- a/src/create/main.go
+++ b/src/k8s/create.go
@@ -1,4 +1,4 @@
-package create
+package k8s
 
 import (
 	"context"
@@ -6,9 +6,9 @@
 	"fmt"
 	"log"
 	"math/rand"
-	"os"
 	"path/filepath"
 
+	"../util"
 	appsv1 "k8s.io/api/apps/v1"
 	apiv1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/api/errors"
@@ -27,7 +27,7 @@
 
 func main() {
 	// 閰嶇疆 Kubernetes 闆嗙兢鐨� kubeconfig 璺緞
-	kubeconfig := flag.String("kubeconfig", filepath.Join(homeDir(), ".kube", "config"), "kubeconfig file")
+	kubeconfig := flag.String("kubeconfig", filepath.Join(util.HomeDir(), ".kube", "config"), "kubeconfig file")
 	flag.Parse()
 
 	// 鍒涘缓 Kubernetes 瀹㈡埛绔�
@@ -320,14 +320,6 @@
 	}
 
 	return false, nil
-}
-
-// homeDir 鑾峰彇褰撳墠鐢ㄦ埛鐨勫鐩綍璺緞
-func homeDir() string {
-	if h := os.Getenv("HOME"); h != "" {
-		return h
-	}
-	return os.Getenv("USERPROFILE") // Windows 鐜涓嬭幏鍙栫敤鎴风洰褰�
 }
 
 // GetServiceNodePort 鑾峰彇鎸囧畾 Service 鐨� NodePort
diff --git a/src/delete/main.go b/src/k8s/delete.go
similarity index 90%
rename from src/delete/main.go
rename to src/k8s/delete.go
index e5b2d28..f7170c8 100644
--- a/src/delete/main.go
+++ b/src/k8s/delete.go
@@ -1,12 +1,12 @@
-package delete
+package k8s
 
 import (
 	"context"
 	"flag"
 	"fmt"
-	"os"
 	"path/filepath"
 
+	"../util"
 	"k8s.io/apimachinery/pkg/api/errors"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/client-go/kubernetes"
@@ -22,7 +22,7 @@
 
 func main() {
 	// 閰嶇疆 Kubernetes 闆嗙兢鐨� kubeconfig 璺緞
-	kubeconfig := flag.String("kubeconfig", filepath.Join(homeDir(), ".kube", "config"), "kubeconfig file")
+	kubeconfig := flag.String("kubeconfig", filepath.Join(util.HomeDir(), ".kube", "config"), "kubeconfig file")
 	flag.Parse()
 
 	// 鍒涘缓 Kubernetes 瀹㈡埛绔�
@@ -124,12 +124,4 @@
 	}
 
 	return nil
-}
-
-// homeDir 鑾峰彇褰撳墠鐢ㄦ埛鐨勫鐩綍璺緞
-func homeDir() string {
-	if h := os.Getenv("HOME"); h != "" {
-		return h
-	}
-	return os.Getenv("USERPROFILE") // Windows 鐜涓嬭幏鍙栫敤鎴风洰褰�
 }
diff --git a/src/main/main.go b/src/main/main.go
index c788412..a04a495 100644
--- a/src/main/main.go
+++ b/src/main/main.go
@@ -8,11 +8,11 @@
 	"path/filepath"
 	"time"
 
+	"../util"
 	"k8s.io/client-go/kubernetes"
 	"k8s.io/client-go/tools/clientcmd"
 
-	"basic.com/aps/aps_deploy.git/src/create"
-	"basic.com/aps/aps_deploy.git/src/delete"
+	"../k8s"
 )
 
 var (
@@ -53,7 +53,7 @@
 	}
 
 	// 閰嶇疆 Kubernetes 闆嗙兢鐨� kubeconfig 璺緞
-	kubeconfig := flag.String("kubeconfig", filepath.Join(homeDir(), ".kube", "config"), "kubeconfig file")
+	kubeconfig := flag.String("kubeconfig", filepath.Join(util.HomeDir(), ".kube", "config"), "kubeconfig file")
 	flag.Parse()
 
 	// 鍒涘缓 Kubernetes 瀹㈡埛绔�
@@ -75,12 +75,12 @@
 			os.Exit(1)
 		}
 
-		err := create.CreateDeploymentAndService(clientset, *createNamespace, *createDeployment, *createService)
+		err := k8s.CreateDeploymentAndService(clientset, *createNamespace, *createDeployment, *createService)
 		if err != nil {
 			panic(err)
 		}
 
-		nodeport, err := create.GetServiceNodePort(clientset, *createNamespace, *createService)
+		nodeport, err := k8s.GetServiceNodePort(clientset, *createNamespace, *createService)
 		if err != nil {
 			panic(err)
 		}
@@ -96,7 +96,7 @@
 			os.Exit(1)
 		}
 
-		err := delete.DeleteResources(clientset, *deleteNamespace, *deleteDeployment, *deleteService)
+		err := k8s.DeleteResources(clientset, *deleteNamespace, *deleteDeployment, *deleteService)
 		if err != nil {
 			panic(err)
 		}
@@ -113,7 +113,7 @@
 		for _, ns := range namespaces {
 			deploymentName := ns
 			serviceName := ns
-			err := create.CreateDeploymentAndService(clientset, ns, deploymentName, serviceName)
+			err := k8s.CreateDeploymentAndService(clientset, ns, deploymentName, serviceName)
 			if err != nil {
 				log.Printf("\033[97;41mFailed to create resources in namespace %s: %v\033[0m\n", ns, err)
 			} else {
@@ -135,7 +135,7 @@
 
 		// 鍒犻櫎澶氫釜 Namespace 涓嬬殑鐩稿悓鍚嶇О鐨� Deployment 鍜� Service
 		for _, ns := range namespaces {
-			err = delete.DeleteResources(clientset, ns, ns, ns)
+			err = k8s.DeleteResources(clientset, ns, ns, ns)
 			if err != nil {
 				panic(err)
 			}
@@ -145,11 +145,3 @@
 	}
 
 }
-// homeDir 鑾峰彇褰撳墠鐢ㄦ埛鐨勫鐩綍璺緞
-func homeDir() string {
-        if h := os.Getenv("HOME"); h != "" {
-                return h
-        }
-        return os.Getenv("USERPROFILE") // Windows 鐜涓嬭幏鍙栫敤鎴风洰褰�
-}
-
diff --git a/src/rancher/ranche.go b/src/rancher/ranche.go
new file mode 100644
index 0000000..286694e
--- /dev/null
+++ b/src/rancher/ranche.go
@@ -0,0 +1,110 @@
+package rancher
+
+import (
+	"fmt"
+	"log"
+	"os"
+
+	"../util"
+)
+
+type Node struct {
+	ClusterName string   `json:"clusterName"`
+	Roles       []string `json:"roles"`
+	IP          string   `json:"ip"`
+	SSHUsername string   `json:"sshUsername"`
+	SSHPassword string   `json:"sshPassword"`
+	SSHPort     int      `json:"sshPort"`
+}
+
+type RancherConfig struct {
+	RancherURL  string `json:"rancherURL"`
+	BearerToken string `json:"bearerToken"`
+}
+
+func isRancherInstalled(ip, username, password string, sshPort int) (bool, error) {
+	// 妫�鏌ancher瀹瑰櫒鏄惁宸茶繍琛�
+	checkRancherCommand := "sudo docker ps --format '{{.Image}}' | grep -q rancher/rancher:v2.5.17"
+	_, err := util.SSHExec(ip, username, password, checkRancherCommand, sshPort)
+	if err != nil {
+		// 濡傛灉鎵ц鍛戒护鍑洪敊锛屽垯璇存槑Rancher鏈畨瑁呮垨鍙戠敓鍏朵粬閿欒
+		return false, fmt.Errorf("failed to check Rancher installation: %v", err)
+	}
+
+	return true, nil
+}
+
+func InstallRancher(ip, username, password string, sshPort int) error {
+	rancherInstalled, err := isRancherInstalled(ip, username, password, sshPort)
+	if err == nil {
+		return nil
+	}
+
+	if !rancherInstalled {
+		// 瀹夎Rancher鍛戒护
+		rancherCommand := "sudo docker run --privileged  -d --restart=unless-stopped -p 8081:80 -p 8443:443  -v /opt/rancher:/var/lib/rancher registry.cn-hangzhou.aliyuncs.com/rancher/rancher:v2.5.17"
+		_, err = util.SSHExec(ip, username, password, rancherCommand, sshPort)
+		if err != nil {
+			return fmt.Errorf("failed to install Rancher: %v", err)
+		}
+	} else {
+		fmt.Println("Rancher is already installed on the remote server.")
+	}
+
+	return nil
+}
+
+func InstallDockerAndRancher(ip, username, password string, sshPort int) error {
+	// 瀹夎Docker鍛戒护
+	err := util.InstallDocker(ip, username, password, sshPort)
+	if err != nil {
+		return err
+	}
+
+	// 瀹夎Rancher鍛戒护
+	err = InstallRancher(ip, username, password, sshPort)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func main() {
+	clusterName := "kubernetus"
+	nodes := []Node{
+		{
+			ClusterName: clusterName,
+			Roles:       []string{"etcd", "controlplane", "worker"},
+			IP:          "192.168.20.189",
+			SSHUsername: "basic",
+			SSHPassword: "123",
+			SSHPort:     22,
+		},
+		{
+			ClusterName: clusterName,
+			Roles:       []string{"worker"},
+			IP:          "192.168.20.10",
+			SSHUsername: "basic",
+			SSHPassword: "123",
+			SSHPort:     22,
+		},
+		{
+			ClusterName: clusterName,
+			Roles:       []string{"worker"},
+			IP:          "192.168.20.115",
+			SSHUsername: "basic",
+			SSHPassword: "alien123",
+			SSHPort:     22,
+		},
+		// Add more nodes here if needed
+	}
+
+	//install rancher on master node
+	err := InstallDockerAndRancher(nodes[0].IP, nodes[0].SSHUsername, nodes[0].SSHPassword, nodes[0].SSHPort)
+	if err != nil {
+		log.Fatalf("Failed to install Rancher: %v", err)
+	}
+
+	os.Exit(0)
+}
diff --git a/src/util/util.go b/src/util/util.go
index 3da9a85..08caedd 100644
--- a/src/util/util.go
+++ b/src/util/util.go
@@ -12,14 +12,14 @@
 )
 
 // homeDir 鑾峰彇褰撳墠鐢ㄦ埛鐨勫鐩綍璺緞
-func homeDir() string {
+func HomeDir() string {
 	if h := os.Getenv("HOME"); h != "" {
 		return h
 	}
 	return os.Getenv("USERPROFILE") // Windows 鐜涓嬭幏鍙栫敤鎴风洰褰�
 }
 
-func sshExec(nodeIP, sshUsername, sshPassword, remoteSSHCommand string, sshPort int) (string, error) {
+func SSHExec(nodeIP, sshUsername, sshPassword, remoteSSHCommand string, sshPort int) (string, error) {
 	// SSH 杩炴帴閰嶇疆
 	config := &ssh.ClientConfig{
 		User: sshUsername,
@@ -97,7 +97,7 @@
 }
 
 // 瀹夎Docker
-func installDocker(nodeIP, sshUsername, sshPassword string, sshPort int) error {
+func InstallDocker(nodeIP, sshUsername, sshPassword string, sshPort int) error {
 	// 妫�鏌ocker鏄惁宸插畨瑁�
 	checkCommand := "which docker"
 	_, err := sshExec(nodeIP, sshUsername, sshPassword, checkCommand, sshPort)
@@ -118,7 +118,7 @@
 }
 
 // Create an HTTP client with insecure TLS configuration
-func createHTTPClient() *http.Client {
+func CreateHTTPClient() *http.Client {
 	transport := &http.Transport{
 		TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
 	}
@@ -126,7 +126,7 @@
 }
 
 // 瀹夎kubectl
-func installKubectl(nodeIP, sshUsername, sshPassword string, sshPort int) error {
+func InstallKubectl(nodeIP, sshUsername, sshPassword string, sshPort int) error {
 	// 妫�鏌ubectl鏄惁宸插畨瑁�
 	checkCommand := "which kubectl"
 	_, err := sshExec(nodeIP, sshUsername, sshPassword, checkCommand, sshPort)

--
Gitblit v1.8.0