openstack成長之旅 - 3 image建立及批量建立的腳本詳解

 本文是虛擬化講解的最後一篇,內容的不是很深刻,只爲給後面的openstack作鋪墊,煩請勿忘吐槽哈。 linux

 接下來咱們就開始了。shell

 製做一個帶系統的p_w_picpath大體分爲兩種方法,virt-managervirshvirt-manager是須要經過桌面才能使用的,而virsh能夠直接在命令行完成操做,對於linux運維來講,圖形化界面的建立方式在自動化運維的實現上比較困難,所以在這裏主要是講解下virsh建立虛擬機的方式,並且自我感受好像圖形化的建立方式真心的沒啥可說的,哈哈。ubuntu

 

  使用vrish建立KVM虛擬機centos

  1. 首先須要定義一個虛擬機配置文件模板,我就直接採用 openstack成長之旅 番外篇」 中的這個配置文件了,將這個配置文件命名爲template.xml,由於配置文件中的一些參數沒有明確制定,那麼就須要修改一下。安全

           修改配置文件中UUIDbash

           UUID=`uuidgen`網絡

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

           # 設置虛擬硬盤運維

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

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

           # 修改ISO光盤鏡像的路徑

           sed -i "s,%ISO_PATH%,/root/p_w_picpath/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_dir; mkdir -p $temp_dir  # 建立存放臨時文件的文件夾	
TOPDIR=$(cd $(dirname "$0") && pwd) #保存腳本所在路徑

# 下面首先來配置下MAC,咱們經過配置文件來實現設定
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配置模板
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文件
# 掛載
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/nbd0 $temp_dir  #在這裏/dev/mapper/nbd0p1是根據qcow2文件來決定的
}
# 卸載
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
}


# 建立及修改虛擬磁盤
create_p_w_picpath(){ # 在這裏須要接收三個參數,分別是: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文件
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_p_w_picpath $ip $MAC $MAC2  # 建立並修改qcow2文件中的網絡信息
    IMAGE_PATH="${TOPDIR}/ubuntu-${ip}.qcow2"
    sed -i "s,%IMAGE_PATH%,$IMAGE_PATH,g" $xml_file
}

# 下面就是建立虛擬機的操做了
create_mac_file   #建立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鏡像服務等等,哈哈,好了,等啥呢?,關注我吧,後面的會更加精彩的。

相關文章
相關標籤/搜索