PowerCLI: One-Liner to get VMs, Clusters, ESX Hosts and Datastores并导入数据库中

需求:定期自动获取Vm在VCenter中对应的cluster、ESX、Datastore信息,同时将变化或者新增的数据上传到数据库中

解决思路分析:

1 首先使用VMware的powerCLI工具通过任务计划程序,定期抓取上述所需信息

2 然后通过文件比较差异,将新增或者修改了的数据提取出来

3 将差异结果放到指定位置,或者数据库中

详细解决步骤:

下面详细说一下我的解决步骤

1 通过PowerCLI抓取所需信息,并上传

1.1首先安装PowerCLI工具(在win7或者windows2008上安装,参考附录)

1.2然后编写自动获取数据的脚本,脚本VMInfo.ps1示例如下,对应这个脚本的解释 ,请参考附录

#这个脚本获取VMname,vmid,ESXname,ESXID,Cluster,Datastore
Connect-VIServer -server ip -user 用户名l -password 密码
Get-VM | Select Name,id,@{N="ESXIP";E={(Get-VMHost -VM $_).name}}, `
@{N="ESXID";E={(Get-VMHost -VM $_).id}}, `
@{N="Cluster";E={Get-Cluster -VM $_}}, `
@{N="Datastore";E={Get-Datastore -VM $_}},`
Time | Export-Csv -NoTypeInformation c:\VMInfo\"Export67VMinfo$(Get-Date -Format 'yyyyMMdd').csv"
Disconnect-VIServer -server * -force  -Confirm:$false

获取得到的数据格式如下:

小Q截图-20151230124737

我通过任务计划程序自动运行该脚本并将其上传至FTP服务器

1.3创建任务计划程序脚本CreateTask.bat

schtasks /create /ru system /tn "VMInfo" /tr "C:\VMInfo\VMInfoBat.bat" /sc daily /st 11:00

1.4任务计划程序引用的脚本VMInfoBat.bat,这个脚本会调用PowershellCLI脚本,并输出日志

set datevar=%date:~0,4%%date:~5,2%%date:~8,2%
echo -------------%datevar%-log------------- >> c:\VMInfo\Running.log
if exist c:\VMInfo\Export* del /q c:\VMInfo\Export*.csv
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -psconsolefile "C:\Program Files (x86)\VMware\Infrastructure\vSphere PowerCLI\vim.psc1" -command  c:\VMInfo\VMInfo.ps1  >> c:\VMInfo\Running.log 2>&1
c:\VMInfo\runftp.bat >> c:\VMInfo\Running.log  2>&1

1.5使用FTP上传

::UploadFtp.bat,上传文件至FTP
open 10.200.169.2
用户名
密码
binary
cd VMdata
put C:\VMInfo\Export*.csv
bye

::runftp.bat通过命令执行上面的ftp脚本
ftp -s:c:\VMInfo\UploadFtp.bat

 

2 提前在数据库上创建好对应的表,注意一般都需要有主键列和时间列,免得后面再添加更改

--建表,表中uuid是主键,会顺序加1,IMTIME是每次插入的时间
CREATE  TABLE ARADMIN.VM_INFO_Dayly
   (UUID int  primary key,
   VMNAME VARCHAR2(255), 
  VMID VARCHAR2(255),
  ESXIP VARCHAR2(255), 
  ESXID VARCHAR2(255) ,
  CLUSTERNAME VARCHAR2(512),  
  DATASTORE VARCHAR2(512),
  IMTIME date default sysdate not null,
STATUS varchar2(128)
) --建立序列 CREATE SEQUENCE VM_ID_SEQ INCREMENT BY 1 START WITH 1;
--或者如下建立序列
/*
create sequence VM_ID_SEQ
minvalue 1
maxvalue 9999999999999999999999999999
start with 1
increment by 1
nocache;
*/
 
  

 

 
--建立一个触发器: 
 CREATE OR REPLACE TRIGGER TRG_VM
   BEFORE INSERT ON VM_INFO_Dayly
   FOR EACH ROW
 BEGIN
   SELECT VM_ID_SEQ.NEXTVAL INTO :NEW.UUID FROM DUAL;
 END TR_VM;

3 比对今天和昨天的文件,并将差异结果写入数据库

这个过程是在linux机器上完成的,毕竟linux命令毕竟熟悉一些

比较用到的命令是 :

grep -vxFf file1 file2 >a.txt  #比较存在于file2中而不在file1中的行
grep -xFf file1 file2 >b.txt  #比较file1 和file2 的交集,具体参考附录

数据上传使用的是sqlload

运行下面命令提前看一下数据库的字符集,并修改下面文件中的字符集,以便不出现乱码

select userenv('language') from dual;

1 脚本sqlload.sh

好了下面把我的脚本sqlload.sh放上来,这个脚本实现今日和昨日数据比较,并把差异放入数据库

 1 #!/bin/bash
 2 # Description:
 3 #    Program download the VMinfo csv data
 4 #      And then compair with yesterday's data 
 5 #    At the End sqlload the diff to Oracle
 6 #2015-12-29    lizhaoxian
 7 
 8 PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
 9 ORACLE_HOME=/oracle/app/oracle/product/11.2.0.3/db_1
10 export ORACLE_HOME
11 export PATH=$PATH:$ORACLE_HOME/bin
12 ddate=`date +%Y%m%d`
13 ydate=`date --date='1 days ago' +%Y%m%d`
14 yydate=`date --date='2 days ago' +%Y%m%d`
15 
16 #1 Log File
17 LOGFILE=/Vminfo/Vminfo.log
18 cat /dev/null > ${LOGFILE}
19 
20 #2 DownLoad From FTP
21 echo ${ddate} >> ${LOGFILE}
22 FileName=`echo "Export67VMinfo${ddate}.csv"`
23 ftp -i -n 10.200.169.2 << ! >> ${LOGFILE} 2>&1
24 user administrator abcde@123
25 cd VMdata
26 lcd /Vminfo
27 binary
28 mget ${FileName}
29 bye
30 !
31 #3 文件格式转换
32 dos2unix /Vminfo/Export* >> ${LOGFILE} 2>&1
33 
34 #4 文件处理和比较
35 sed -i 's/硬盘\ /Disk/g;s/\ Disk/;Disk/g' /Vminfo/Export67VMinfo${ddate}.csv 
36 grep -vxFf /Vminfo/Export67VMinfo${ydate}.csv /Vminfo/Export67VMinfo${ddate}.csv |sed  's/^\"/,/g' | sed 's/\"//g' > /Vminfo/Vmdata${ddate}.txt
37 
38 #5 sqlload导入数据库
39 export ORACLE_SID=ARDB
40 export NLS_LANG=american_america.AL32UTF8
41 
42 #数据库结构控制文件
43 CTL_FILE=/Vminfo/Vmdata.ctl
44 #sqlload输出日志文件
45 LOG_FILE=/Vminfo/sqlload.log
46 #数据文件
47 DATA_FILE=/Vminfo/Vmdata${ddate}.txt
48 
49 sqlldr ARADMIN/clmAdm1n@10.200.243.85/ARDB control=${CTL_FILE} data=${DATA_FILE} log=${LOG_FILE}
50 
51 #6 Clean log files
52 # clear yesterday's data
53 rm -f /Vminfo/Vmdata${yydate}.txt /Vminfo/Vmdata${ydate}.bad /Vminfo/Export67VMinfo${yydate}.csv

 

3 都写好了,那就添加到crontab中,让系统自动运行吧

#备份系统crontab
crontab -u root -l > crontab.bak

#修改系统定时任务
crontab -e

#添加一行到文件末,每天八点,定时跑
0 8 * * * /Vminfo/sqlload.sh

大功告成,查看下数据库有没有数据就行了

 

参考附录:

vSphere PowerCLI安装及命令

求一份比较2个文件内容相同和不同的shell脚本

PowerCLI: One-Liner to get VMs, Clusters, ESX Hosts and Datastores

powercli script to get cluster name, datastore name, total size & free space on DS for a VM

Oracle主键自增长及自动生成策略

你可能感兴趣的:(PowerCLI: One-Liner to get VMs, Clusters, ESX Hosts and Datastores并导入数据库中)