使用Java管理千台規模Linux伺服器_入門

火星人 @ 2014-03-12 , reply:0
←手機掃碼閱讀

  

前東家是一家遊戲公司,老闆很好,當時工作也留下了很多自己原創的管理腳本。現在分享一下在辦公環境使用Java、Jsch登錄VPN管理Linux的腳本(此處實現JAVA調用Linux上備份Mysql的shell作為示例),希望對運維的朋友有幫助,儘快從繁雜的伺服器管理工作中脫離出來。

主要的實現思路:

如果需要先登錄VPN才能連接遊戲伺服器,需要將遊戲伺服器的ssh埠(一般是22)映射到本地辦公電腦的埠上(如5555),然後ssh連接本地辦公電腦的5555埠,這樣就可以連接到遊戲伺服器,並可以管理遊戲伺服器了。

當您學會通過VPN連接Linux伺服器后,如果只在內網環境,不使用VPN,就更簡單了,此外不再詳述。Jsch的example里也有介紹。

代碼:使用Jsch透過VPN

  1. package com.daily.wednesday;  
  2. import java.io.IOException;  
  3. import java.io.InputStream;  
  4. import java.sql.Connection;  
  5. import java.sql.DriverManager;  
  6. import java.sql.ResultSet;  
  7. import java.sql.SQLException;  
  8. import java.sql.Statement;  
  9. import com.daily.util.DataBaseConnection;  
  10. import com.jcraft.jsch.Channel;  
  11. import com.jcraft.jsch.ChannelExec;  
  12. import com.jcraft.jsch.JSch;  
  13. import com.jcraft.jsch.JSchException;  
  14. import com.jcraft.jsch.Session;  
  15. public class BackUpMysql3 {  
  16.     public static void main(String args[]) {  
  17.         // 讀取資料庫配置  
  18.         DataBaseConnection dataBaseConnection = new DataBaseConnection();  
  19.         String dataBaseConfigForWrite[] = new String[3];  
  20.         dataBaseConfigForWrite = dataBaseConnection.loadDataConfig();  
  21.  
  22.         Connection conn = null;// 資料庫連接  
  23.         Statement stmt = null;// 資料庫表達式  
  24.         ResultSet rs = null// 結果集  
  25.         int rowcount = 0;// 總記錄數  
  26.         String sql = "select * from servers_maint_wednesday";  
  27.  
  28.         try {  
  29.             conn = DriverManager.getConnection(dataBaseConfigForWrite[0],  
  30.                     dataBaseConfigForWrite[1], dataBaseConfigForWrite[2]);  
  31.             stmt = conn.createStatement();  
  32.             rs = stmt.executeQuery(sql);  
  33.             rs.last();  
  34.             rowcount = rs.getRow();// 總記錄數  
  35.             rs = stmt.executeQuery(sql);  
  36.         } catch (SQLException e) {  
  37.             e.printStackTrace();  
  38.         }  
  39.         // 定義遊戲伺服器IP的數組,遊戲伺服器IP存在資料庫中。  
  40.         String privateIpaddress[] = new String[rowcount];  
  41.         String remark[] = new String[rowcount];// 定義遊戲區名稱  
  42.         String programPath[] = new String[rowcount];// 定義程序路徑  
  43.         String backMysqlShellPath[] = new String[rowcount];// 定義mysql備份腳本路徑  
  44.  
  45.         int j = 0;  
  46.         try {  
  47.             while (rs.next()) {  
  48.                 privateIpaddress[j] = rs.getString("privateipaddress");  
  49.                 remark[j] = rs.getString("remarks");  
  50.                 programPath[j] = rs.getString("programpath");  
  51.                 backMysqlShellPath[j] = rs.getString("backmysqlshellpath");  
  52.                 j++;  
  53.             }  
  54.         } catch (Exception e) {  
  55.             e.printStackTrace();  
  56.         } finally {  
  57.             try {  
  58.                 if (rs != null) {  
  59.                     rs.close();  
  60.                 }  
  61.                 if (stmt != null) {  
  62.                     stmt.close();  
  63.                 }  
  64.                 if (conn != null) {  
  65.                     conn.close();  
  66.                 }  
  67.             } catch (Exception e) {  
  68.                 e.printStackTrace();  
  69.             }  
  70.         }  
  71.  
  72.         // 調用mysql備份方法  
  73.         for (int n = 0; n < privateIpaddress.length; n++) {  
  74.             try {  
  75.                 try {  
  76.                     backUpMysql(privateIpaddress[n], backMysqlShellPath[n],remark[n]);  
  77.                 } catch (IOException e) {  
  78.                     // TODO Auto-generated catch block  
  79.                     e.printStackTrace();  
  80.                 }  
  81.             } catch (JSchException e) {  
  82.                 // TODO Auto-generated catch block  
  83.                 e.printStackTrace();  
  84.             }  
  85.         }  
  86.  
  87.     }  
  88.     /**  
  89.      * 備份mysql資料庫的方法  
  90.      * @param privateip  
  91.      * @param backMysqlShellPath  
  92.      * @throws JSchException  
  93.      * @throws IOException  
  94.      */ 
  95.     public static void backUpMysql(String privateip, String backMysqlShellPath, String remark)  
  96.             throws JSchException, IOException {  
  97.         // 登錄到伺服器  
  98.         int rport;  
  99.         JSch jsch = new JSch();  
  100.         String host = "dl.dengdie.com"//此處為VPN伺服器地址  
  101.         String user = "admin"//VPN用戶名  
  102.         Session sessionForBack = jsch.getSession(user, host, 22);  
  103.         rport = 22;  
  104.         sessionForBack.setPassword("&*&&&&lalaflls"); //VPN密碼  
  105.         java.util.Properties config = new java.util.Properties();  
  106.         config.put("StrictHostKeyChecking""no");  
  107.         sessionForBack.setConfig(config);  
  108.         sessionForBack.connect();//登錄到VPN伺服器  
  109.           
  110.         // 建立與遊戲伺服器的ssh轉發連接:即將遊戲伺服器的22號ssh埠映射的本地辦公電腦的53238埠。        
  111.         sessionForBack.setPortForwardingL(53238, privateip, rport);  
  112.  
  113.         try {  
  114.             JSch jschToBack = new JSch();  
  115.  
  116.             Session sessionToBack = jschToBack.getSession(user, "127.0.0.1",  
  117.                     53238); //連接本地辦公電腦的53238埠,就相當於連接了遊戲伺服器的22號埠。  
  118.             sessionToBack.setPassword("&*&&&&lalaflls");  
  119.             sessionToBack.setConfig(config);  
  120.             sessionToBack.connect();  
  121.             //backMysqlShellPath實際上是遊戲伺服器上備份Mysql資料庫的一個腳本,此腳本請您自行實現,網上很多實例。  
  122.             String command = backMysqlShellPath;  
  123.             //打開執行命令的隧道,並執行命令。  
  124.             Channel channel = sessionToBack.openChannel("exec");  
  125.             ((ChannelExec) channel).setCommand(command);  
  126.             channel.setInputStream(null);  
  127.             ((ChannelExec) channel).setErrStream(System.err);  
  128.             InputStream in = channel.getInputStream();  
  129.             channel.connect();  
  130.  
  131.             byte[] tmp = new byte[1024];  
  132.             while (true) {  
  133.                 while (in.available() > 0) {  
  134.                     int i = in.read(tmp, 01024);  
  135.                     if (i < 0)  
  136.                         break;  
  137.                     System.out.print(new String(tmp, 0, i));  
  138.                 }  
  139.                 if (channel.isClosed()) {  
  140.                     System.out.println(remark + "Mysql備份完畢!");  
  141.                     System.out.println("exit-status: " 
  142.                             + channel.getExitStatus());  
  143.                     break;  
  144.                 }  
  145.                 try {  
  146.                     Thread.sleep(1000);  
  147.                 } catch (Exception ee) {  
  148.                 }  
  149.             }  
  150.             channel.disconnect();  
  151.             sessionToBack.disconnect();  
  152.             sessionForBack.disconnect();  
  153.         } catch (Exception e) {  
  154.             System.out.println(e);  
  155.         }  
  156.     }  

原文鏈接:http://www.oschina.net/code/snippet_222919_11734






[火星人 via ] 使用Java管理千台規模Linux伺服器_入門已經有183次圍觀

http://www.coctec.com/docs/net/show-post-68180.html