标签为 XCP 的文章

XCP/XenServer自动化部署脚本分享

之前我曾经写过两篇关于XCP/XenServer的文章:
XCP/XenServer命令行方式自动化安装VM:http://heylinux.com/archives/2795.html
XCP/XenServer自动化创建并初始化VM:http://heylinux.com/archives/2768.html

在这两篇文章中,详细介绍了如何自动化安装VM,创建模板并初始化VM。
在实际的工作中,我编写了相应的脚本来完成这些工作,并在6个小时内批量创建了400+个不同配置的VM。
具体的脚本路径为:
自动化安装初始VM
https://github.com/mcsrainbow/shell-scripts/blob/master/scripts/xcp_ksinstvm/ksinstvm.sh
自动化批量创建VM
https://github.com/mcsrainbow/python-demos/blob/master/demos/xenserver.py
自动化VM网络配置
https://github.com/mcsrainbow/shell-scripts/blob/master/scripts/xcp_bootstrap/bootstrap.sh
自动化VM磁盘扩容
https://github.com/mcsrainbow/shell-scripts/blob/master/scripts/xcp_extendlv.sh
查看当前所有VM以及各个XenServer的使用情况
https://github.com/mcsrainbow/shell-scripts/blob/master/scripts/xcp_monitor.sh
获取指定VM的VNC终端,用于脚本故障时连接到本地终端进行调试(效果相当于Windows上XenCenter Console)
https://github.com/mcsrainbow/shell-scripts/blob/master/scripts/xcp_getvnc.sh

, ,

No Comments

XCP/XenServer命令行方式自动化安装VM

背景介绍:
前面我的一篇文章《XCP/XenServer自动化创建并初始化虚拟机》中,讲解了如何通过传递内核参数,来克隆VM并以新的主机名,IP地址等进行初始化。
但是在这之前其实应该还有另外一个问题,就是第一个VM怎样才能自动化创建呢?为了解决这个问题,我咨询了不少的人,但是他们大多数给我的回答的都是,使用XenCenter。
但这并不是我们想要的,经过不断的试错之后,终于成功的完成了第一个VM的自动化安装,其实原理也很简单,就是通过命令行将VM初始化,绑定虚拟硬盘,网络,然后通过httprepo来网络加载ISO,再配合kickstart进行自动化安装。但是在很多具体的步骤上,却又是步步陷阱,一些很小的参数方面设置不正确都会导致失败,而这些,在官方文档中基本上算是被忽略了的。
下面是相关的具体步骤:

环境介绍:
httprepo: 192.168.92.128
xenserver: 192.168.92.140
vm: 192.168.92.142

1. 创建 http repo
# yum install httpd
# wget http://linux.mirrors.es.net/centos/6/isos/x86_64/CentOS-6.4-x86_64-minimal.iso

# mkdir -p /var/www/html/repo/centos/6
# mkdir /var/www/html/repo/ks
# mount -o loop CentOS-6.4-x86_64-minimal.iso /var/www/html/repo/centos/6/

# service httpd start

2. 创建 kickstart 配置文件
# vi /var/www/html/repo/ks/centos-6.4-x86_64-minimal.ks

 
cmdline
skipx
install
cdrom
lang en_US.UTF-8
keyboard us

network --onboot yes --device eth0 --bootproto=static --ip=192.168.92.142 --netmask=255.255.255.0 --gateway=192.168.92.2 --nameserver=192.168.92.2 --noipv6

rootpw mypasswd

firewall --service=ssh
authconfig --enableshadow --passalgo=sha512
selinux --disabled
timezone --utc Etc/UTC

bootloader --location=mbr --driveorder=xvda --append="crashkernel=auto"

zerombr
clearpart --all --initlabel
autopart

reboot

%packages --nobase
@core
%end

3. 自动安装VM
获取Local storage uuid
# xe sr-list | grep -C 1 "Local"

                uuid ( RO): fbeda99f-b5a7-3100-5e3d-fbb48a46fca0
          name-label ( RW): Local storage
    name-description ( RW): 

阅读全文 »

, , ,

No Comments

XCP/XenServer自动化创建并初始化VM

参考资料:http://wiki.xenproject.org/wiki/XCP_Beginners_Guide

在我们的生产环境中,之前一直使用的是EC2的Instances做的前端服务器,在访问量增加的时候,通过设置一个阈值,超过阈值的就自动触发创建一定数量的新的Instances,在访问量低于某一个值的时候,就自动删除一定数量的Instances;由于AWS可以根据设置好的模板复制出一个新主机并且给予一个新的IP地址,所以只需要管理好主机名就是了;这方面,我们通过一个Redis数据库来管理主机名的ID,创建主机的时候会自动根据最大的ID依次递增,而删除主机的时候会自动根据最大的ID依次递减。
但这并不是我这篇文章要讲的重点,要实现这种自动伸缩,方法有很多,我们就是通过很多简单的脚本来实现的。

后来,我们建立了本地机房,购买了一定数量的物理服务器,每台服务器安装了XCP,并打算在上面创建虚拟机。之前我们一直通过的是XenCenter的方式,图形化的操作来创建,但是要实现和上面EC2一样的自动化创建主机的话,我们遇到了一个问题,那就是,每台新建的VM,其IP地址与主机名等在复制之后,不能自动更新。我请教过一些同行,可能是他们并没有这样大规模的使用XCP/XenServer,所以都是在XenCenter里面创建好机器,然后通过console进去修改IP地址和主机名等等。

于是乎,我就在Google上反复搜索,最终找到了一个解决办法。那就是通过修改VM的内核引导程序,将自定义的参数传递给一个叫PV-args的内核参数,这样在VM启动之后就可以通过/proc/cmdline中获取到参数了,在获取到之后,VM在第一次启动时,会执行一个Shell脚本,来根据自定义的参数更新IP地址和主机名等;这样,一台新创建好的VM就可以自动连接到Puppet这样的管理工具了,接着再自动拉取最新的配置,完成整个服务器的自动化配置,然后上线。

环境介绍:
xenhost1 一台物理XCP/XenServer主机
vm-template 之前定义好的模板
vm-host-1 将要创建的VM

以下,就是我的具体操作记录:
获取vm-template的uuid
[root@xenhost1 ~]# xe vm-list | grep -B 1 vm-template

uuid ( RO)           : c77040ae-3a50-9217-ff03-41992c34d1ec
     name-label ( RW): vm-host-1

修改内核启动方式,并传递自定义参数
[root@xenhost1 ~]# xe vm-param-set uuid=c77040ae-3a50-9217-ff03-41992c34d1ec HVM-boot-policy=""
[root@xenhost1 ~]# xe vm-param-set uuid=c77040ae-3a50-9217-ff03-41992c34d1ec PV-bootloader="pygrub"
[root@xenhost1 ~]# xe vm-param-set uuid=c77040ae-3a50-9217-ff03-41992c34d1ec PV-args="_hostname=vm-template _ipaddr=192.168.1.121 _netmask=255.255.255.0 _gateway=192.168.1.1"

启动vm-template
[root@xenhost1 ~]# xe vm-start vm=vm-template

获取自定义参数
[root@vm-template ~]# cat /proc/cmdline

ro root=/dev/mapper/vg_t-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 rd_LVM_LV=vg_t/lv_root crashkernel=129M@0M  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet  _hostname=vm-template _ipaddr=192.168.1.121 _netmask=255.255.255.0 _gateway=192.168.1.1

定义初始化脚本
[root@vm-template ~]# cat /etc/rc.local

#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local
/root/bootstrap.sh

创建具体的脚本
[root@vm-template ~]# touch /root/bootstrap.sh
[root@vm-template ~]# chmod +x /root/bootstrap.sh
阅读全文 »

, , ,

8 Comments

XCP/XenServer资源监控脚本分享[原创]

一直以来我都以每个月至少一篇原创技术文章来要求自己,不过有的时候真的太懒了,在这里鄙视一下自己。
今天已经是这个月的最后一天了,其实近期的工作,有很多东西都是可以总结成文章分享给大家的。

有一些用Python和Shell写的脚本,我都放到了GitHub上,其中一个就是XCP/XenServer资源监控的脚本。
XCP/XenServer的XenCenter只有Windows下的客户端,命令行要获取可用的CPU,内存以及磁盘,并没有那么方便,需要通过各个命令行去获取。有的命令还必须在host主机本身运行才可以,比如 xl,因此我在各个XCP/XenServer的宿主OS之间都配置了ssh-key的信任。

我们的环境是由10多台物理服务器装上XCP构成的一个Pool,Pool的Manager是第一个XCP,然后存储是用的每台服务器本身的硬盘。
脚本的输出结果如下:

[root@xen1 ~]# vm_monitor
-------------------------------------------------------
Host xen1: vm-server1 vm-server2
Available: Mem=13/95G  Disk=6/1108G  CPU=18/24Cores
-------------------------------------------------------
Host xen2: vm-server3 vm-server4
Available: Mem=13/95G  Disk=6/1108G  CPU=18/24Cores
-------------------------------------------------------
Host xen3: vm-server5 vm-server6 vm-server7 vm-server8 vm-server9 vm-server10
Available: Mem=13/63G  Disk=151/549G  CPU=8/24Cores
-------------------------------------------------------
Host xen4: vm-server11 vm-server12 vm-server13 vm-server14
Available: Mem=22/63G  Disk=11/549G  CPU=12/24Cores

具体的脚本内容如下:

#!/bin/bash

function get_info(){
  host_name=$1
  host_uuid=$(xe host-list |grep -w ${host_name} -B1 |grep -w uuid |awk '{print $NF}')
  guest_vm=$(xe vm-list resident-on=${host_uuid} is-control-domain=false |grep -w name-label |awk '{print $NF}' |sort -n |xargs)
   
  t_mem_b=$(xe host-param-list uuid=${host_uuid} |grep -w memory-total |awk '{print $NF}')
  f_mem_b=$(xe host-param-list uuid=${host_uuid} |grep -w memory-free-computed |awk '{print $NF}')
  t_mem_g=$(($t_mem_b/1024/1024/1024))
  f_mem_g=$(($f_mem_b/1024/1024/1024))

  xe sr-list |grep -A2 -B3 -w ${host_name} |grep -A1 -B4 -Ew 'lvm|ext' |grep -w name-label |awk -F ': ' '{print $2}' > /tmp/sr_items.tmp
  disk_info=""
  while read sr_name
  do
    disk_uuid=$(xe sr-list |grep -A 2 -B 1 "$sr_name" |grep -B 3 -w "$host" |grep uuid |awk -F ": " '{print $2}')
    t_disk_b=$(xe sr-param-list uuid=$disk_uuid |grep physical-size |cut -d : -f 2)
    u_disk_b=$(xe sr-param-list uuid=$disk_uuid |grep physical-utilisation |cut -d : -f 2)
    f_disk_b=$(($t_disk_b-$u_disk_b))
    t_disk_g=$(($t_disk_b/1024/1024/1024))
    f_disk_g=$(($f_disk_b/1024/1024/1024))
    disk_info="${f_disk_g}/${t_disk_g}G $disk_info"
  done < /tmp/sr_items.tmp

  t_cpu_num=$(xe host-param-list uuid=${host_uuid} |grep -w 'cpu_count' |awk '{print $4}' |cut -d";" -f1)
  v_cpu_sum=0
  for vm in $guest_vm
  do
    vm_uuid=$(xe vm-list |grep -B 1 -w $vm |head -n 1 |awk -F ": " '{print $2}')
    v_cpu_num=$(xe vm-list params=VCPUs-number uuid=${vm_uuid} |grep -w VCPUs |awk -F ": " '{print $2}')
    v_cpu_sum=$(($v_cpu_sum+$v_cpu_num))
  done
  f_cpu_num=$(($t_cpu_num-$v_cpu_sum))
   
  echo "Host $host_name: \"$guest_vm\""
  echo "Available: \"Mem=${f_mem_g}/${t_mem_g}G  Disk=${disk_info} CPU=${f_cpu_num}/${t_cpu_num}Cores\""
}

if [ $# == 0 ]; then
  host_list=$(xe host-list |grep name-label |awk '{print $4}' |cut -d. -f1 |sort -n)
  for host_name in $host_list
  do
    echo "-------------------------------------------------------"
    get_info ${host_name}
  done
else
  get_info $1
fi

,

No Comments