- jsch工具类:
package com.mdl;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Properties;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
public class JSchUtils {
private static JSch jsch;
private static Session session;
/**
* 连接到指定的IP
*
* @throws JSchException
*/
public static void connect(String user, String passwd, String host, int port) throws JSchException {
jsch = new JSch();// 创建JSch对象
session = jsch.getSession(user, host, port);// 根据用户名、主机ip、端口号获取一个Session对象
session.setPassword(passwd);// 设置密码
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);// 为Session对象设置properties
session.connect();// 通过Session建立连接
}
/**
* 关闭连接
*/
public static void close() {
session.disconnect();
}
/**
* 执行相关的命令
*
* @throws JSchException
*/
public static String execCmd(String command) throws JSchException {
String resultStr = "";
BufferedReader reader = null;
Channel channel = null;
try {
if (command != null) {
channel = session.openChannel("exec");
((ChannelExec) channel).setCommand(command);
// ((ChannelExec) channel).setErrStream(System.err);
channel.connect();
InputStream in = channel.getInputStream();
reader = new BufferedReader(new InputStreamReader(in));
String buf = null;
while ((buf = reader.readLine()) != null) {
resultStr = resultStr + "\n" + buf;
// System.out.println("resultStr---" + resultStr);
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (JSchException e) {
e.printStackTrace();
} finally {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
channel.disconnect();
}
return resultStr;
}
}
- main函数:
package com.mdl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.google.gson.Gson;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.SftpException;
import com.mdl.vo.KVM;
import com.mdl.vo.NET;
public class KVMCollectMain {
public static void main(String[] args) throws SftpException {
try {
// 1.连接到指定的服务器
JSchUtils.connect("root", "mdl_12345", "172.*.*.45", 22);
// 2.执行相关的命令,获取主机名称list
String hostsStr = JSchUtils.execCmd("virsh list");
List<String> hostNameList = getHostNameList(hostsStr);
// 3.执行相关的命令,获取每台主机基本信息
Map<String,KVM> hostInfoMap = getHostInfo(hostNameList);
// 4.执行相关的命令,获取存储信息
String storeCommand = "virsh pool-list";
String storeStr = JSchUtils.execCmd(storeCommand);
List<String> storeList = getStoreInfo(storeStr);
// 5.执行相关的命令,获取每个存储池下面的主机信息
Map<String,List<Map<String,KVM>>> mStoreMap = getStoreDetailInfo(storeList);
Map<String,Object> resMap = new HashMap<String,Object>();
// 6.执行相关的命令,获取网络信息
String networkCommand = "virsh net-list";
String networkStr = JSchUtils.execCmd(networkCommand);
HashMap<String,NET> netMapInfo = getNetworkInfo(networkStr);
resMap.put("kvm", hostInfoMap);
resMap.put("store", mStoreMap);
resMap.put("network", netMapInfo);
Gson gs = new Gson();
String mStr = gs.toJson(resMap);
System.out.println(mStr);
// 4.关闭连接
JSchUtils.close();
} catch (JSchException e) {
e.printStackTrace();
}
}
/**
* 返回主机名的list
* @param str
* @return
*/
private static List<String> getHostNameList(String str){
String[] strArr = str.split("\\n");
List<String> hostList = new ArrayList<String>();
List<String> mList;
for(int j=3;j<strArr.length;j++){ //字符串换行分割后,下标0-2的数值是表格名称和分割线
mList = new ArrayList<String>();
String[] arr = strArr[j].split(" ");
for(int i=0;i<arr.length;i++){
if(!arr[i].equals("")){
mList.add(arr[i]);
}
}
hostList.add(mList.get(1));
}
return hostList;
}
/**
* 返回主机的基本信息
* @param str
* @return
*/
private static KVM getHostBaseInfo(String str){
KVM kvm = new KVM();
String[] strArr = str.split("\\n");
kvm.setUuid(formatStr(strArr[3]));
kvm.setInstanceRunningId(formatStr(strArr[1]));// 运行时ID
kvm.setInstanceName(formatStr(strArr[2]));// 虚拟机实例名称
kvm.setInstanceState(formatStr(strArr[5]));// 虚拟机状态
kvm.setOSType(formatStr(strArr[4]));// 系统类型
kvm.setCPUNumber(formatStr(strArr[6]));// CPU数量(个)
kvm.setCPUTime(formatStr(strArr[7]));// CPU时间(s)
kvm.setMAXMemory(formatStr(strArr[8]));// 最大使用内存
kvm.setMemoryUsed(formatStr(strArr[9]));// 已用内存
// String DiskNumber = "";//硬盘数量(个) 返回结果里面没有硬盘个数的显示
return kvm;
}
/**
* 获取每台主机的基本信息
* @param list
* @return
* @throws JSchException
*/
private static Map<String,KVM> getHostInfo(List<String> list) throws JSchException{
Map<String,KVM> map = new HashMap<String,KVM>();
for(int i=0;i<list.size();i++){
String commandStr = "virsh dominfo" + " " + list.get(i);
String hostInfoStr = JSchUtils.execCmd(commandStr);
map.put(list.get(i), getHostBaseInfo(hostInfoStr));
}
return map;
}
/**
* 获取存储池列表
* @return
*/
private static List<String> getStoreInfo(String str){
String[] strArr = str.split("\\n");
List<String> storeList = new ArrayList<String>();
List<String> mList;
for(int j=3;j<strArr.length;j++){ //字符串换行分割后,下标0-2的数值是表格名称和分割线
mList = new ArrayList<String>();
String[] arr = strArr[j].split(" ");
for(int i=0;i<arr.length;i++){
if(!arr[i].equals("")){
mList.add(arr[i]);
}
}
storeList.add(mList.get(0));
}
return storeList;
}
/**
* 获取所有存储池下的每个池中的主机信息
* @param storeList
* @return
* @throws JSchException
*/
private static Map<String,List<Map<String,KVM>>> getStoreDetailInfo(List<String> storeList) throws JSchException{
Map<String,List<Map<String,KVM>>> map = new HashMap<String,List<Map<String,KVM>>>();;
for (String str : storeList) {
String storeDetail = JSchUtils.execCmd("virsh vol-list --details" + " " + str);
List<Map<String,KVM>> list = getStoreHostDetail(storeDetail);
map.put(str, list);
}
return map;
}
/**
* 每个存储池下面包含的主机及主机信息
* @param str
* @return
* @throws JSchException
*/
private static List<Map<String,KVM>> getStoreHostDetail(String str) throws JSchException{
String[] strArr = str.split("\\n");
Map<String,KVM> map = null;
List<Map<String,KVM>> list = new ArrayList<Map<String,KVM>>();
List<String> mList;
for(int j=3;j<strArr.length;j++){ //字符串换行分割后,下标0-2的数值是表格名称和分割线
mList = new ArrayList<String>();
String[] arr = strArr[j].split(" ");
for(int i=0;i<arr.length;i++){
if(!arr[i].equals("")){
mList.add(arr[i]);
}
}
if(mList.get(0).indexOf(".")>0 && mList.get(0).split("\\.")[1].equals("img")){
map = new HashMap<String,KVM>();
String hostName = mList.get(0).split("\\.")[0];
String commandStr = "virsh dominfo" + " " + hostName;
String hostInfoStr = JSchUtils.execCmd(commandStr);
map.put(hostName, getHostBaseInfo(hostInfoStr));
list.add(map);
}
}
return list;
}
/**
* 获取网络信息
* @param str
* @return
* @throws JSchException
*/
private static HashMap<String,NET> getNetworkInfo(String str) throws JSchException{
String[] strArr = str.split("\\n");
List<String> netList = new ArrayList<String>();
List<String> mList;
for(int j=3;j<strArr.length;j++){ //字符串换行分割后,下标0-2的数值是表格名称和分割线
mList = new ArrayList<String>();
String[] arr = strArr[j].split(" ");
for(int i=0;i<arr.length;i++){
if(!arr[i].equals("")){
mList.add(arr[i]);
}
}
netList.add(mList.get(0));
}
HashMap<String,NET> map = null;
for (String mStr : netList) {
String netCommand = "virsh net-info" + " " + mStr;
String networkStr = JSchUtils.execCmd(netCommand);
NET net = operNetInfo(networkStr);
map = new HashMap<String,NET>();
map.put(mStr, net);
}
return map;
}
private static NET operNetInfo(String str){
NET net = new NET();
String[] strArr = str.split("\\n");
net.setActive(formatStr(strArr[3]));
net.setUuid(formatStr(strArr[2]));
net.setAutorun(formatStr(strArr[5]));
net.setBridge(formatStr(strArr[6]));
net.setEnduring(formatStr(strArr[4]));
net.setName(formatStr(strArr[1]));
return net;
}
/**
* 去除字符串中间的空格 将中文:替换为英文:
*
* @param str
* @return
*/
private static String formatStr(String str) {
String result;
if (str.indexOf(":") > 0) {
result = str.replaceAll(" ", "").replaceAll(":", ":");
} else {
result = str.replaceAll(" ", "");
}
return result.split("\\:")[1];
}
}
- KVM实体:
package com.mdl.vo;
public class KVM {
String uuid;
String InstanceRunningId;//运行时ID
String InstanceName;//虚拟机实例名称
String InstanceState;//虚拟机状态
String OSType;//系统类型
String CPUNumber;//CPU数量(个)
String CPUTime;//CPU时间(s)
String MAXMemory;//最大使用内存(MB)
String MemoryUsed;//已用内存(MB)
// String DiskNumber;//硬盘数量(个)
public String getUuid() {
return uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
public String getInstanceRunningId() {
return InstanceRunningId;
}
public void setInstanceRunningId(String instanceRunningId) {
InstanceRunningId = instanceRunningId;
}
public String getInstanceName() {
return InstanceName;
}
public void setInstanceName(String instanceName) {
InstanceName = instanceName;
}
public String getInstanceState() {
return InstanceState;
}
public void setInstanceState(String instanceState) {
InstanceState = instanceState;
}
public String getOSType() {
return OSType;
}
public void setOSType(String oSType) {
OSType = oSType;
}
public String getCPUNumber() {
return CPUNumber;
}
public void setCPUNumber(String cPUNumber) {
CPUNumber = cPUNumber;
}
public String getCPUTime() {
return CPUTime;
}
public void setCPUTime(String cPUTime) {
CPUTime = cPUTime;
}
public String getMAXMemory() {
return MAXMemory;
}
public void setMAXMemory(String mAXMemory) {
MAXMemory = mAXMemory;
}
public String getMemoryUsed() {
return MemoryUsed;
}
public void setMemoryUsed(String memoryUsed) {
MemoryUsed = memoryUsed;
}
}
4.NET实体:
package com.mdl.vo;
public class NET {
private String name;
private String uuid;
private String active;//活跃
private String enduring ;//持久
private String autorun;//自启动
private String bridge;//桥接
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUuid() {
return uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
public String getActive() {
return active;
}
public void setActive(String active) {
this.active = active;
}
public String getEnduring() {
return enduring;
}
public void setEnduring(String enduring) {
this.enduring = enduring;
}
public String getAutorun() {
return autorun;
}
public void setAutorun(String autorun) {
this.autorun = autorun;
}
public String getBridge() {
return bridge;
}
public void setBridge(String bridge) {
this.bridge = bridge;
}
}
相关命令:
1. 存储池列表:
virsh # pool-list
名称 状态 自动开始
-------------------------------------------
data 活动 是
mnt 活动 是
1.1 存储池data:
1.1.1 存储池data基本信息:
virsh # pool-info data
名称: data
UUID: 669e2c02-62ce-4a4e-****-3e11ef2bc7bb
状态: running
持久: 是
自动启动: 是
容量: 1.55 TiB
分配: 623.24 GiB
可用: 966.74 GiB
1.1.2 存储池data详细信息:
virsh # vol-list --details data
名称 路径 类型 Capacity 分配
------------------------------------------------------------------------------------------------------------------------------
bg-119.img /data/bg-119.img 文件 400.00 GiB 93.38 GiB
bg-120.img /data/bg-120.img 文件 400.00 GiB 90.28 GiB
bg-121.img /data/bg-121.img 文件 400.00 GiB 75.76 GiB
bg-122.img /data/bg-122.img 文件 400.00 GiB 8.58 GiB
bg-132.img /data/bg-132.img 文件 400.00 GiB 255.38 GiB
bg-239.img /data/bg-239.img 文件 400.00 GiB 22.37 GiB
bg-240.img /data/bg-240.img 文件 400.00 GiB 7.57 GiB
bg-241.img /data/bg-241.img 文件 400.00 GiB 9.39 GiB
centos7-dvd.iso /data/centos7-dvd.iso 文件 3.86 GiB 3.86 GiB
centos7.img /data/centos7.img 文件 400.00 GiB 2.34 GiB
HDP-pkg /data/HDP-pkg dir 0.00 B 0.00 B
HDP-UTILS-1.1.0.21-centos7.tar.gz.filepart /data/HDP-UTILS-1.1.0.21-centos7.tar.gz.filepart 文件 14.70 MiB 14.70 MiB
network /data/network 文件 337.00 B 4.00 KiB
ocn_build_pkg /data/ocn_build_pkg dir 0.00 B 0.00 B
virt-clone-centos7.sh /data/virt-clone-centos7.sh 文件 1007.00 B 4.00 KiB
virt-install-centos7.sh /data/virt-install-centos7.sh 文件 496.00 B 4.00 KiB
1.2 存储池mnt信息:
1.2.1 存储池mnt基本信息:
virsh # pool-info mnt
名称: mnt
UUID: 35a8f3a4-f0d4-4bbd-****-04d777c5452f
状态: running
持久: 是
自动启动: 是
容量: 1.55 TiB
分配: 623.24 GiB
可用: 966.74 GiB
1.2.2 存储池mnt详细信息:
virsh # vol-list --details mnt
名称 路径 类型 Capacity 分配
---------------------------------------------------------------------------------
centos7-dvd.iso /mnt/centos7-dvd.iso 文件 3.86 GiB 3.86 GiB
centos7.img /mnt/centos7.img 文件 400.00 GiB 2.34 GiB
network /mnt/network 文件 333.00 B 4.00 KiB
virt-clone-centos7.sh /mnt/virt-clone-centos7.sh 文件 1005.00 B 4.00 KiB
2 . 网络
2.1 列表:
virsh # net-list
名称 状态 自动开始 持久
----------------------------------------------------------
default 活动 是 是
2.2 详情:
virsh # net-info default
名称: default
UUID: fb38ae16-a4e2-4875-****-d00cc9d36ba8
活跃: 是
持久: 是
自动启动: 是
桥接: virbr0