需求:定期自动获取Vm在VCenter中对应的cluster、ESX、Datastore信息,同时将变化或者新增的数据上传到数据库中
1 首先使用VMware的powerCLI工具通过任务计划程序,定期抓取上述所需信息
2 然后通过文件比较差异,将新增或者修改了的数据提取出来
3 将差异结果放到指定位置,或者数据库中
下面详细说一下我的解决步骤
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
获取得到的数据格式如下:
我通过任务计划程序自动运行该脚本并将其上传至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
--建表,表中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;
这个过程是在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主键自增长及自动生成策略