openstack成长之旅 - 3 image创建及批量创建的脚本详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了openstack成长之旅 - 3 image创建及批量创建的脚本详解相关的知识,希望对你有一定的参考价值。

 本文是虚拟化讲解的最后一篇,内容的不是很深入,只为给后面的openstack做铺垫,烦请勿忘吐槽哈。 

 接下来我们就开始了。

 制作一个带系统的image大致分为两种方法,virt-managervirshvirt-manager是需要通过桌面才能使用的,而virsh可以直接在命令行完成操作,对于linux运维来说,图形化界面的创建方式在自动化运维的实现上比较困难,因此在这里主要是讲解下virsh创建虚拟机的方式,而且自我感觉好像图形化的创建方式真心的没啥可说的,哈哈。

 

  使用vrish创建KVM虚拟机

  1. 首先需要定义一个虚拟机配置文件模板,我就直接采用 openstack成长之旅 番外篇” 中的这个配置文件了,将这个配置文件命名为template.xml,因为配置文件中的一些参数没有明确制定,那么就需要修改一下。

           修改配置文件中UUID

           UUID=`uuidgen`

           sed -i "s,%UUID%,$UUID,g" centos-7.xml        

           # 设置虚拟硬盘

           qemu-img create -f raw centos-7.raw 20G

           sed -i "s,%IMAGE_PATH%,/root/image/centos-7.raw,g" centos-7.xml

           # 修改ISO光盘镜像的路径

           sed -i "s,%ISO_PATH%,/root/image/CentOS-7-x86_64-DVD-1511.iso,g" centos-7.xml

           设置虚拟网卡

           MAC="fa:95:$(dd if=/dev/urandom count=1 2>/dev/null |md5sum|sed ‘s/^\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4/‘)"

           sed -i "s,%MAC%,$MAC,g" centos-7.xml

           MAC2="52:54:$(dd if=/dev/urandom count=1 2>/dev/null |md5sum|sed ‘s/^\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4/‘)"

           sed -i "s,%MAC2%,$MAC2,g" centos-7.xml 

           启动虚拟机

           virsh define centos-7.xml

           # 查看所有的虚拟机

           virsh list --all 

           # 开启虚拟机

           virsh start centos-7-test

           # vnc 查看虚拟机端口

           vrish vncdisplay centos-7-test

       

       虚拟机配置文件配置了,那么想要批量创建虚拟机的话,就需要利用脚本来实现,我这里有一个写好的shell脚本,可以参考下,请根据自身环境来使用,直接上脚本了。

#!/bin/bash
# 两个set是用来调试脚本的
set -e          # 当脚本出错的时候,就会立即停止,不会在执行后续的命令
set -o xtrace   # 跟踪脚本的执行过程,有利于调试

# 设置一些全局变量
temp_dir=`mktemp`; rm -rf $temp_fir; mkdir -p $temp_dir  # 创建存放临时文件的文件夹	
TOPDIR=$(cd $(dirname "$0") && pwd) #保存脚本所在路径

# 下面首先来配置下MAC,我们通过配置文件来实现设定
function create_mac_file(){    # 这个函数只要是创建MAC配置模板
    mac_temp=$TOPDIR/mac_temp
    cat << EOF > $mac_temp
    SUBSYSTEN=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="%MAC%", ATTR{type}=="1", KERNEL="eth*", NAME="eth0"
    SUBSYSTEN=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="%MAC2%", ATTR{type}=="1", KERNEL="eth*", NAME="eth1"
    EOF
    #在这里是用了两个网卡,若是只要一个网卡,那么把eth1注释掉就好了,注意:不同的系统网卡的名字, 也是相同的,自定哈
}

# IP配置模板
function create_net_file(){
    net_temp=$TOPDIR/net_temp
    cat << EOF >$net_temp
    auto lo
    iface lo inet loopback
    auto eth0
    iface eth0 inet dhcp 
    auto eth1
    iface eth1 inet static   # 这里网络信息比如,IP地址,掩码等,要根据实际情况惊醒设置
    address 192.168.1.%IP%
    netmask 255.255.255.0
    gateway 192.168.1.1
    broadcast 192.168.1.1
    EOF
    # 在这里虚拟机的eth0是基于网桥实现的,采用了DHCP自动获取IP的方式,不需要进行配置
}

# 挂载/卸载qcow2文件
# 挂载
function mount_qcow2_disk(){  #挂在qcow2文件的话,函数需要一个参数:qocw2文件名
    modprobe nbd max_part=63
    qemu-nbd -c /dev/nbd0 $TOPDIR/ubuntu-$1.qcow2
    sleep 1
    kpartx -a /dev/nbd0
    sleep 1
    mount /dev/mapper/nbd0p1 $temp_dir  #在这里/dev/mapper/nbd0p1是根据qcow2文件来决定的
}
# 卸载
function umount_qcow2_disk(){  #卸载qcow2文件,函数不需要参数
    umount $temp_dir
    qemu-nbd -d /dev/nbd0
    for n in `ls /dev/mapper |grep -v control|grep -v nbd`;do
        dmsetup clear /dev/mapper/$n #清除挂载过的nbd设备
        dmsetup remove /dev/mapper/$n 
    done
    # 注意这里两个for循环不能一起使用,分开写
    for n in `ls /dev/mapper |grep -v control|sort -r`;do
        dmsetup clear /dev/mapper/$n #清除挂载过的nbd设备
        dmsetup remove /dev/mapper/$n 
    done
    rmmod nbd
}


# 创建及修改虚拟磁盘
function create_image(){ # 在这里需要接收三个参数,分别是:IP地址,eth0的mac地址以及eth1的mac地址
    ip=$1;mac=$2;mac2=$3;HOST_NAME=ubuntu-${ip}
    qemu-img create -f qcow2 -o cluster_size=2M,backing_file=$TOPDIR/ubuntu-16.04.raw ubuntu-$ip.qcow2 20G
    mount_qcow2_disk $ip    #这里提供这挂载qcow2文件的函数
    mac_file=$temp_dir/etc/udev/rules.d/70-persistent-net.rules
    net_file=$temp_dir/etc/network/interfaces
    cp -rf $TOPDIR/mac_temp $mac_file    #利用mac地址模板替换qcow2磁盘中的文件
    cp -rf $TOPDIR/net_temp $net_file    #利用IP信息模板替换qcow2磁盘中的文件
    sed -i "s,%MAC%,$mac,g" $mac_file   #替换相应的mac地址信息
    sed -i "s,%MAC2%,$mac2,g" $mac_file
    sed -i "s,%IP%,$ip,g" $net_file  #替换相应的IP信息
    sed -i "s,127.0.0.1 *,127.0.0.1 $HOST_NAME,g" $temp_dir/etc/hosts  #替换主机
    echo "$HOST_NAME" > $temp_dir/etc/hostname
    umount_qcow2_disk    #调用函数,卸载qcow2磁盘
}

#创建及修改xml文件
function create_xml(){
    ip=$1
    xml_file=ubuntu-${ip}.xml   #为了方便自动化,xml文件需要以动态方式命名
    cp -rf $TOPDIR/template.xml $xml_file   #把xml的模板文件复制为本虚拟机的配置文件
    sed -i "s,%VM_NAME%,ubuntu-${i},g" $xml_file   #修改虚拟机名字
    UUID=`uuidgen`
    sed -i "s,%UUID%,$UUID,g" $xml_file   #修改虚拟机UUID
    MAC="fa:95:$(dd if=/dev/urandom count=1 2>/dev/null |md5sum|sed ‘s/^\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4/‘)"
    sed -i "s,%MAC%,$MAC,g" $xml_file
    MAC2="52:54:$(dd if=/dev/urandom count=1 2>/dev/null |md5sum|sed ‘s/^\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4/‘)"
    sed -i "s,%MAC2%,$MAC2,g" $xml_file
    create_image $ip $MAC $MAC2  # 创建并修改qcow2文件中的网络信息
    IMAGE_PATH="${TOPDIR}/ubuntu-${ip}.qcow2"
    sed -i "s,%IMAGE_PATH%,$IMAGE_PATH,g" $xml_file
}

# 下面就是创建虚拟机的操作了
create_mac_ile   #创建MAC信息模板
create_net_file   #创建IP信息模板
for i in 233 235 190;do     #IP地址的最后一位,自己定义吧
    create_xml $i   #创建虚拟机配置文件
    virsh define ubuntu-${i}.xml  #定义虚拟机
    virsh start ubuntu-${i}   #启动虚拟机
done

set +o xtrace #关闭命令执行跟踪,与脚本开头的set -o xtrace成对使用

      

     若发现本脚本有问题,请及时留言告知,以免误人,谢谢


     虚拟化的介绍就到这里了,因为主要是要讲解openstack因为对于虚拟化没有过多深入的讲解,接下来会详细的说说openstack组件的介绍及安装,例如:Keystone安全认证服务,Swift存储服务,Glance镜像服务等等,哈哈,好了,等啥呢?,关注我吧,后面的会更加精彩的。



本文出自 “11283981” 博客,请务必保留此出处http://11293981.blog.51cto.com/11283981/1792809

以上是关于openstack成长之旅 - 3 image创建及批量创建的脚本详解的主要内容,如果未能解决你的问题,请参考以下文章

openstack成长之旅 - 番外篇

openstack成长之旅 - 4 keystone的介绍及安装

openstack成长之旅 - 5 Swift介绍安装及作者的反思

openstack成长之旅 - 2 虚拟化技术介绍及KVM安装

我与 OpenStack 的五年:一个 OpenStacker 的开源之旅

看,2021年,一个普通应届生的成长之旅