springboot遠(yuǎn)程執(zhí)行服務(wù)器指令
本例是java遠(yuǎn)程連接到服務(wù)器,去抓取查詢kubesphere中的etcd日志,并返回。步驟拆分:
- 連接到服務(wù)器
- 執(zhí)行指令獲取pod信息:kubectl get po -n kubesphere-system
- 將pod信息分割,只返回pod名稱
- 根據(jù)pod名稱,執(zhí)行指令獲取pod日志:kubectl logs -n kubesphere-system "+podName + "
- –tail=500
1、在工程中引入下方依賴
<dependency> <groupId>ch.ethz.ganymed</groupId> <artifactId>ganymed-ssh2</artifactId> <version>build210</version> </dependency>
2、編寫連接命令工具類KubeSphereSSHUtils
import ch.ethz.ssh2.Connection; import ch.ethz.ssh2.Session; import ch.ethz.ssh2.StreamGobbler; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; @Component public class KubeSphereSSHUtils { private String hostname; private String username; private String password; public void setHostname(String hostname) { this.hostname = hostname; } public void setUsername(String username) { this.username = username; } public void setPassword(String password) { this.password = password; } private static Logger log = LoggerFactory.getLogger(KubeSphereSSHUtils.class); public Connection sshConnection() { Connection sshConn = null; try { sshConn = new Connection(hostname); sshConn.connect(); boolean isAuthenticate = sshConn.authenticateWithPassword(username, password); if(isAuthenticate == false) { throw new IOException("連接到指定環(huán)境失敗"); } } catch (IOException e) { e.printStackTrace(); } return sshConn; } //獲取發(fā)布的日志的容器名 public List<String> getReleasePod(String nameSpaceName, String containName) { Connection conn = this.sshConnection(); Session sess = null; InputStream is = null; InputStreamReader inputStreamReader = null; BufferedReader reader = null; try { sess = conn.openSession(); String str = " kubectl get po -n "+nameSpaceName; log.info("執(zhí)行指令:"+str); sess.execCommand(str); is = new StreamGobbler(sess.getStdout()); inputStreamReader = new InputStreamReader(is); reader = new BufferedReader(inputStreamReader); boolean flg = true; List<String> names = new ArrayList<String>(); while(flg) { String line = reader.readLine(); if(StringUtils.isEmpty(line)) { break; } if(line.startsWith(containName)){ names.add(line.split("\\s+")[0]); } } return names; } catch (IOException e) { e.printStackTrace(); } finally { try { conn.close(); sess.close(); reader.close(); inputStreamReader.close(); is.close(); } catch (IOException e) { e.printStackTrace(); } } return null; } //獲取pod內(nèi)部日志 public List<String> getReleaseLogs(String nameSpaceName,String podName, String deploymentName){ Connection conn = this.sshConnection(); Session sess = null; InputStream is = null; InputStreamReader inputStreamReader = null; BufferedReader reader = null; try { sess = conn.openSession(); String execCommand = "kubectl logs -n "+nameSpaceName+" "+podName + " --tail=500"; // String execCommand = "kubectl logs -n "+nameSpaceName+" "+podName + " --tailssss=500"; log.info("執(zhí)行指令:"+execCommand); sess.execCommand(execCommand); is = new StreamGobbler(sess.getStdout()); inputStreamReader = new InputStreamReader(is); reader = new BufferedReader(inputStreamReader); boolean flg = true; List<String> logs = new ArrayList<String>(); while(flg) { String line = reader.readLine(); if(line == null) { break; } logs.add(line); } return logs; } catch (IOException e) { e.printStackTrace(); } finally { try { reader.close(); inputStreamReader.close(); is.close(); conn.close(); sess.close(); } catch (IOException e) { e.printStackTrace(); } } return null; } //獲取pod內(nèi)部日志 public List<String> getKubeletLogs(){ Connection conn = this.sshConnection(); Session sess = null; InputStream is = null; InputStreamReader inputStreamReader = null; BufferedReader reader = null; try { sess = conn.openSession(); String execCommand = "systemctl status kubelet"; log.info("執(zhí)行指令:"+execCommand); sess.execCommand(execCommand); is = new StreamGobbler(sess.getStdout()); inputStreamReader = new InputStreamReader(is); reader = new BufferedReader(inputStreamReader); boolean flg = true; List<String> logs = new ArrayList<String>(); while(flg) { String line = reader.readLine(); if(line == null) { break; } logs.add(line); } return logs; } catch (IOException e) { e.printStackTrace(); } finally { try { reader.close(); inputStreamReader.close(); is.close(); conn.close(); sess.close(); } catch (IOException e) { e.printStackTrace(); } } return null; } public List<String> getNodesStatus() { Connection conn = this.sshConnection(); Session sess = null; InputStream is = null; InputStreamReader inputStreamReader = null; BufferedReader reader = null; try { sess = conn.openSession(); String execCommand = "kubectl get nodes"; log.info("執(zhí)行指令:"+execCommand); sess.execCommand(execCommand); is = new StreamGobbler(sess.getStdout()); inputStreamReader = new InputStreamReader(is); reader = new BufferedReader(inputStreamReader); boolean flg = true; List<String> logs = new ArrayList<String>(); while(flg) { String line = reader.readLine(); if(line == null) { break; } logs.add(line); } return logs; } catch (IOException e) { e.printStackTrace(); } finally { try { reader.close(); inputStreamReader.close(); is.close(); conn.close(); sess.close(); } catch (IOException e) { e.printStackTrace(); } } return null; } public List<String> getNoReadyNodeMessage() { Connection conn = this.sshConnection(); Session sess = null; InputStream is = null; InputStreamReader inputStreamReader = null; BufferedReader reader = null; try { sess = conn.openSession(); // String execCommand = "kubectl get nodes | grep NotReady | awk '{print$1}'"; String execCommand = "kubectl get nodes | grep Ready | awk '{print$1}'"; log.info("執(zhí)行指令:"+execCommand); sess.execCommand(execCommand); is = new StreamGobbler(sess.getStdout()); inputStreamReader = new InputStreamReader(is); reader = new BufferedReader(inputStreamReader); boolean flg = true; List<String> logs = new ArrayList<String>(); while(flg) { String line = reader.readLine(); if(line == null) { break; } logs.add(line); } return logs; } catch (IOException e) { e.printStackTrace(); } finally { try { reader.close(); inputStreamReader.close(); is.close(); conn.close(); sess.close(); } catch (IOException e) { e.printStackTrace(); } } return null; } public List<String> restartKubelet() { Connection conn = this.sshConnection(); Session sess = null; InputStream is = null; InputStreamReader inputStreamReader = null; BufferedReader reader = null; try { sess = conn.openSession(); String execCommand = "systemctl restart kubelet.service"; log.info("執(zhí)行指令:"+execCommand); sess.execCommand(execCommand); is = new StreamGobbler(sess.getStdout()); inputStreamReader = new InputStreamReader(is); reader = new BufferedReader(inputStreamReader); boolean flg = true; List<String> logs = new ArrayList<String>(); while(flg) { String line = reader.readLine(); if(line == null) { break; } logs.add(line); } return logs; } catch (IOException e) { e.printStackTrace(); } finally { try { reader.close(); inputStreamReader.close(); is.close(); conn.close(); sess.close(); } catch (IOException e) { e.printStackTrace(); } } return null; } public List<String> getNodeIPMessage() { Connection conn = this.sshConnection(); Session sess = null; InputStream is = null; InputStreamReader inputStreamReader = null; BufferedReader reader = null; try { sess = conn.openSession(); String execCommand = "hostname -i"; sess.execCommand(execCommand); is = new StreamGobbler(sess.getStdout()); inputStreamReader = new InputStreamReader(is); reader = new BufferedReader(inputStreamReader); boolean flg = true; List<String> logs = new ArrayList<String>(); while(flg) { String line = reader.readLine(); if(line == null) { break; } logs.add(line); } return logs; } catch (IOException e) { e.printStackTrace(); } finally { try { reader.close(); inputStreamReader.close(); is.close(); conn.close(); sess.close(); } catch (IOException e) { e.printStackTrace(); } } return null; } //重啟node機(jī)器,慎用?。。。。?! public List<String> rebootNode() { Connection conn = this.sshConnection(); Session sess = null; InputStream is = null; InputStreamReader inputStreamReader = null; BufferedReader reader = null; try { sess = conn.openSession(); String execCommand = "systemctl reboot"; sess.execCommand(execCommand); is = new StreamGobbler(sess.getStdout()); inputStreamReader = new InputStreamReader(is); reader = new BufferedReader(inputStreamReader); boolean flg = true; List<String> logs = new ArrayList<String>(); while(flg) { String line = reader.readLine(); if(line == null) { break; } logs.add(line); } return logs; } catch (IOException e) { e.printStackTrace(); } finally { try { reader.close(); inputStreamReader.close(); is.close(); conn.close(); sess.close(); } catch (IOException e) { e.printStackTrace(); } } return null; } }
3、編寫配置連接類
@Component public class DeployUtil { private KubeSphereSSHUtils sshUtilsDev; private KubeSphereSSHUtils sshUtilsRelease; private KubeSphereSSHUtils sshUtilsProd; private KubeSphereSSHUtils sshUtilsDev_node1; private KubeSphereSSHUtils sshUtilsDev_node2; private KubeSphereSSHUtils sshUtilsDev_node3; private KubeSphereSSHUtils sshUtilsDev_node4; private KubeSphereSSHUtils sshUtilsRelease_node1; private KubeSphereSSHUtils sshUtilsRelease_node2; private KubeSphereSSHUtils sshUtilsRelease_node3; private KubeSphereSSHUtils sshUtilsRelease_node4; private KubeSphereSSHUtils sshUtilsRelease_node5; private KubeSphereSSHUtils sshUtilsRelease_node6; @Autowired K8sEnvConfigBean k8sEnvConfigBean; @PostConstruct public void init() { this.createK8sSSHUtils("dev"); this.createK8sSSHUtils("release"); this.createK8sSSHUtils("prod"); this.createK8sSSHNodeUtils_Dev("dev-node1"); this.createK8sSSHNodeUtils_Dev("dev-node2"); this.createK8sSSHNodeUtils_Dev("dev-node3"); this.createK8sSSHNodeUtils_Dev("dev-node4"); this.createK8sSSHNodeUtils_Release("release-node1"); this.createK8sSSHNodeUtils_Release("release-node2"); this.createK8sSSHNodeUtils_Release("release-node3"); this.createK8sSSHNodeUtils_Release("release-node4"); this.createK8sSSHNodeUtils_Release("release-node5"); this.createK8sSSHNodeUtils_Release("release-node6"); } //創(chuàng)建三套環(huán)境主節(jié)點(diǎn)的連接 public void createK8sSSHUtils(String env) { if(env.equals("dev")) { sshUtilsDev = new KubeSphereSSHUtils(); sshUtilsDev.setPassword(k8sEnvConfigBean.getDevPassword()); sshUtilsDev.setUsername(k8sEnvConfigBean.getDevUsername()); sshUtilsDev.setHostname(k8sEnvConfigBean.getDevHost()); }else if(env.equals("release")) { sshUtilsRelease = new KubeSphereSSHUtils(); sshUtilsRelease.setPassword(k8sEnvConfigBean.getReleasePassword()); sshUtilsRelease.setUsername(k8sEnvConfigBean.getReleaseUsername()); sshUtilsRelease.setHostname(k8sEnvConfigBean.getReleaseHost()); }else if(env.equals("prod")) { sshUtilsProd = new KubeSphereSSHUtils(); sshUtilsProd.setPassword(k8sEnvConfigBean.getProdPassword()); sshUtilsProd.setUsername(k8sEnvConfigBean.getProdUsername()); sshUtilsProd.setHostname(k8sEnvConfigBean.getProdHost()); } } //創(chuàng)建dev環(huán)境子節(jié)點(diǎn)的連接 public void createK8sSSHNodeUtils_Dev(String env) { switch (env) { case "dev-node1": sshUtilsDev_node1 = new KubeSphereSSHUtils(); sshUtilsDev_node1.setPassword(k8sEnvConfigBean.getDev_node1_password()); sshUtilsDev_node1.setUsername(k8sEnvConfigBean.getDev_node1_username()); sshUtilsDev_node1.setHostname(k8sEnvConfigBean.getDev_node1_host()); break; case "dev-node2": sshUtilsDev_node2 = new KubeSphereSSHUtils(); sshUtilsDev_node2.setPassword(k8sEnvConfigBean.getDev_node2_password()); sshUtilsDev_node2.setUsername(k8sEnvConfigBean.getDev_node2_username()); sshUtilsDev_node2.setHostname(k8sEnvConfigBean.getDev_node2_host()); break; case "dev-node3": sshUtilsDev_node3 = new KubeSphereSSHUtils(); sshUtilsDev_node3.setPassword(k8sEnvConfigBean.getDev_node3_password()); sshUtilsDev_node3.setUsername(k8sEnvConfigBean.getDev_node3_username()); sshUtilsDev_node3.setHostname(k8sEnvConfigBean.getDev_node3_host()); break; case "dev-node4": sshUtilsDev_node4 = new KubeSphereSSHUtils(); sshUtilsDev_node4.setPassword(k8sEnvConfigBean.getDev_node4_password()); sshUtilsDev_node4.setUsername(k8sEnvConfigBean.getDev_node4_username()); sshUtilsDev_node4.setHostname(k8sEnvConfigBean.getDev_node4_host()); } } //創(chuàng)建release環(huán)境子節(jié)點(diǎn)連接 public void createK8sSSHNodeUtils_Release(String env) { switch (env) { case "release-node1": sshUtilsRelease_node1 = new KubeSphereSSHUtils(); sshUtilsRelease_node1.setPassword(k8sEnvConfigBean.getRelease_node1_password()); sshUtilsRelease_node1.setUsername(k8sEnvConfigBean.getRelease_node1_username()); sshUtilsRelease_node1.setHostname(k8sEnvConfigBean.getRelease_node1_host()); break; case "release-node2": sshUtilsRelease_node2 = new KubeSphereSSHUtils(); sshUtilsRelease_node2.setPassword(k8sEnvConfigBean.getRelease_node2_password()); sshUtilsRelease_node2.setUsername(k8sEnvConfigBean.getRelease_node2_username()); sshUtilsRelease_node2.setHostname(k8sEnvConfigBean.getRelease_node2_host()); break; case "release-node3": sshUtilsRelease_node3 = new KubeSphereSSHUtils(); sshUtilsRelease_node3.setPassword(k8sEnvConfigBean.getRelease_node3_password()); sshUtilsRelease_node3.setUsername(k8sEnvConfigBean.getRelease_node3_username()); sshUtilsRelease_node3.setHostname(k8sEnvConfigBean.getRelease_node3_host()); break; case "release-node4": sshUtilsRelease_node4 = new KubeSphereSSHUtils(); sshUtilsRelease_node4.setPassword(k8sEnvConfigBean.getRelease_node4_password()); sshUtilsRelease_node4.setUsername(k8sEnvConfigBean.getRelease_node4_username()); sshUtilsRelease_node4.setHostname(k8sEnvConfigBean.getRelease_node4_host()); break; case "release-node5": sshUtilsRelease_node5 = new KubeSphereSSHUtils(); sshUtilsRelease_node5.setPassword(k8sEnvConfigBean.getRelease_node5_password()); sshUtilsRelease_node5.setUsername(k8sEnvConfigBean.getRelease_node5_username()); sshUtilsRelease_node5.setHostname(k8sEnvConfigBean.getRelease_node5_host()); case "release-node6": sshUtilsRelease_node6 = new KubeSphereSSHUtils(); sshUtilsRelease_node6.setPassword(k8sEnvConfigBean.getRelease_node6_password()); sshUtilsRelease_node6.setUsername(k8sEnvConfigBean.getRelease_node6_username()); sshUtilsRelease_node6.setHostname(k8sEnvConfigBean.getRelease_node6_host()); } } //獲取相應(yīng)環(huán)境的某臺(tái)機(jī)器的連接 public KubeSphereSSHUtils getK8sSSHUtils(String env) { KubeSphereSSHUtils result = null; if(env.equals("dev")) { if (this.sshUtilsDev == null) { this.createK8sSSHUtils(env); } result = sshUtilsDev; }else if(env.equals("release")) { if (this.sshUtilsRelease == null) { this.createK8sSSHUtils(env); } result = sshUtilsRelease; }else if(env.equals("prod")) { if (this.sshUtilsProd == null) { this.createK8sSSHUtils(env); } result = sshUtilsProd; } //新增操作dev節(jié)點(diǎn)的邏輯 else if(env.equals("dev-node1")) { if (this.sshUtilsDev_node1 == null) { this.createK8sSSHNodeUtils_Dev(env); } result = sshUtilsDev_node1; }else if(env.equals("dev-node2")) { if (this.sshUtilsDev_node2 == null) { this.createK8sSSHNodeUtils_Dev(env); } result = sshUtilsDev_node2; }else if(env.equals("dev-node3")) { if (this.sshUtilsDev_node3 == null) { this.createK8sSSHNodeUtils_Dev(env); } result = sshUtilsDev_node3; }else if(env.equals("dev-node4")) { if (this.sshUtilsDev_node4 == null) { this.createK8sSSHNodeUtils_Dev(env); } result = sshUtilsDev_node4; } //新增操作release節(jié)點(diǎn)的邏輯 else if(env.equals("release-node1")) { if (this.sshUtilsRelease_node1 == null) { this.createK8sSSHNodeUtils_Release(env); } result = sshUtilsRelease_node1; }else if(env.equals("release-node2")) { if (this.sshUtilsRelease_node2 == null) { this.createK8sSSHNodeUtils_Release(env); } result = sshUtilsRelease_node2; }else if(env.equals("release-node3")) { if (this.sshUtilsRelease_node3 == null) { this.createK8sSSHNodeUtils_Release(env); } result = sshUtilsRelease_node3; }else if(env.equals("release-node4")) { if (this.sshUtilsRelease_node4 == null) { this.createK8sSSHNodeUtils_Release(env); } result = sshUtilsRelease_node4; }else if(env.equals("release-node5")) { if (this.sshUtilsRelease_node5 == null) { this.createK8sSSHNodeUtils_Release(env); } result = sshUtilsRelease_node5; }else if(env.equals("release-node6")) { if (this.sshUtilsRelease_node6 == null) { this.createK8sSSHNodeUtils_Release(env); } result = sshUtilsRelease_node6; } return result; } //尋找環(huán)境下的某一個(gè)子節(jié)點(diǎn)物理機(jī),便于重啟該機(jī)器 public String getNodeEnvType(String nodeName,String env) { String k8sEnv = null; if(Objects.equals(env,"dev")){ //dev環(huán)境機(jī)器匹配,不匹配主節(jié)點(diǎn) switch (nodeName) { case "node1": k8sEnv = "dev-node1"; break; case "node2": k8sEnv = "dev-node2"; break; case "node3": k8sEnv = "dev-node3"; break; case "node4": k8sEnv = "dev-node4"; break; } } else if(Objects.equals(env,"release")) { //release環(huán)境機(jī)器匹配,不匹配主節(jié)點(diǎn) switch (nodeName) { case "node1": k8sEnv = "release-node1"; break; case "node2": k8sEnv = "release-node2"; break; case "node3": k8sEnv = "release-node3"; break; case "node4": k8sEnv = "release-node4"; break; case "node5": k8sEnv = "release-node5"; break; case "node6": k8sEnv = "release-node6"; break; } } //prod環(huán)境機(jī)器暫時(shí)不開啟自動(dòng)重啟功能 return k8sEnv; } }
4、調(diào)用時(shí)的代碼如下:
KubeSphereSSHUtils sshUtils = deployUtils.getK8sSSHUtils(env);//連接到指令環(huán)境 List<String> podNames = sshUtils.getReleasePod(KUBESPHERE_NAMESPACE, KUBESPHERE_ETCD_CONTAINNAME); //獲取pod名稱 List<String> logs = sshUtils.getReleaseLogs(KUBESPHERE_NAMESPACE, podName, KUBESPHERE_ETCD_CONTAINNAME);//獲取日志
到此這篇關(guān)于springboot遠(yuǎn)程執(zhí)行服務(wù)器指令的文章就介紹到這了,更多相關(guān)springboot服務(wù)器指令內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java實(shí)現(xiàn)百度云文字識(shí)別接口代碼
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)百度云文字識(shí)別的接口代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11SpringSecurity自定義AuthenticationProvider無法@Autowire的解決
這篇文章主要介紹了SpringSecurity自定義AuthenticationProvider無法@Autowire的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12Java虛擬機(jī)之對(duì)象創(chuàng)建過程與類加載機(jī)制及雙親委派模型
這篇文章主要給大家介紹了關(guān)于Java虛擬機(jī)之對(duì)象創(chuàng)建過程與類加載機(jī)制及雙親委派模型的相關(guān)資料,本文通過示例代碼以及圖文介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-11-11springmvc處理模型數(shù)據(jù)ModelAndView過程詳解
這篇文章主要介紹了springmvc處理模型數(shù)據(jù)ModelAndView過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01Java SpringMVC數(shù)據(jù)響應(yīng)超詳細(xì)講解
Spring?MVC?是?Spring?提供的一個(gè)基于?MVC?設(shè)計(jì)模式的輕量級(jí)?Web?開發(fā)框架,本質(zhì)上相當(dāng)于?Servlet,Spring?MVC?角色劃分清晰,分工明細(xì),本章來講解SpringMVC數(shù)據(jù)響應(yīng)2022-04-04IntelliJ IDEA2020.2.2創(chuàng)建Servlet方法及404問題
這篇文章主要介紹了IntelliJ IDEA2020.2.2創(chuàng)建Servlet方法及404問題,這里小編使用的2020.2.2企業(yè)破解版本,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09