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