openstack- 自动化创建虚机脚本

工作中需要经常创建虚机、 网络、 检查虚机网络等操作,这样需要多次执行的操作,而且命令比较多使用起来需要查看命令帮助的操作,或者需要多次执行的命令我们可以脚本化

这里我写了一个shell 脚本,

1. 创建一个网络               (需要自己去填写固定的网络名,网段信息)

2. 创建一个虚机               (更加自己的需求选择网络、镜像、flavor、az域 来创建虚机)

3. 检查虚机的网络             (这个根据环境选择,检查创建的虚机网络的连通性)

4.快速创建一个虚机             (根据提前的自定义的网络虚机名镜像来创建虚机,不需要我们选择)

5.退出

#!/bin/bash
while :
do
echo -e "################################ "
echo -e "TEST YK SHELL Script "
echo -e "################################ "

#VM_NAME=Test-vm-1234
#NET_NAME=Test-net-yk
#SUBNET_NAME=Test-subnet-yk
#NETWORK="199.199.1.0/24"
#IMAGE_NAME=TestVM

source /root/openrc
cat<<EOF
    1. create new network
    2. create new vm
    3. check vm network
4. quickly create testvm
    q. exit
EOF

read -p "Please enter an option:" volume
case $volume in
1) echo "create new network"
openstack network list
echo -e "--------------------Network name cannot be repeated ---------------- "
read -p "Please enter an network name:" NET_NAME
read -p "Please enter an subnet name:" SUBNET_NAME
read -p "Please enter an nework: eg:192.168.1.0/24:" NETWORK
echo -e "-----------Create Test Network------------ "
source /root/openrc
Net_id=$(openstack network list | grep $NET_NAME | awk -F "|" '{print $2}' | tr '/n' ' ' | sed -e 's/^ //g' )

#openstack network list | grep $NET_NAME | awk -F "|" '{print $2}' > /dev/null 2>&1
openstack network list | grep $NET_NAME >> /dev/null 2>&1
if [ $? == 0 ] ; then
# openstack network delete $Net_id
# openstack network create $NET_NAME
# neutron subnet-create --name $SUBNET_NAME $NET_NAME $NETWORK
# echo "create network success "
openstack network list | grep $NET_NAME
echo -e "-------------33[42m $NET_NAME33[0m 33[31m network already exists 33[0m------------- "
Net_id=$(openstack network list | grep $NET_NAME | awk -F "|" '{print $2}' | tr '/n' ' ' | sed -e 's/^ //g' )

else
openstack network create $NET_NAME
neutron subnet-create --name $SUBNET_NAME $NET_NAME $NETWORK
if [ $? -ne 0 ]; then
openstack network list
echo -e "-------------- 33[31m create network failed 33[0m ----------------- "
Net_id=$(openstack network list | grep $NET_NAME | awk -F "|" '{print $2}' | tr '/n' ' ' | sed -e 's/^ //g' )
openstack network delete $Net_id
openstack network list
echo -e "--------------- Delete failed network --------------------- "
else
# openstack subnet create $SUBNET_NAME --network $NET_NAME --subnet-range $NETWORK
echo -e "-------------33[32m create network success 33[0m------------ "
fi
fi


;;
2)
echo -e "-----------Create VM------------ "
source /root/openrc

read -p "Please enter an VM name:" VM_NAME
openstack server list | awk -F "|" '{print $3}'| sed 's/ //g' |grep -x $VM_NAME > /dev/null 2>&1
if [ $? == 0 ]
then
openstack server list | grep $VM_NAME
echo -e "----------------33[31m $VM_NAME VM already exists 33[0m------------- "

else


echo -e "Create VM Please enter the relevant information "
while :
do
echo -e "Please enter an VM use flavor: "
openstack flavor list
read -p "Please enter an VM use flavor ID/NAME:" FLAVOR_NAME
FLAVOR=$(openstack flavor list | awk -F "|" 'NR>2{print $2,$3}' )
flag=1
for a in $FLAVOR
do
if [ "$FLAVOR_NAME" = "$a" ]; then
flag=0
break;
fi
done

if [ $flag -ne 0 ];then
echo "There is no flavor $FLAVOR_NAME ,Please select the correct one flavor name/id "
else
break
fi

done

while :
do
echo -e "Please enter an VM use Network: "
openstack network list
read -p "Please enter an VM use Network ID/NAME:" NETWORK_NAME
NETWORK=$(openstack network list | awk -F "|" 'NR>2{print $2,$3}' )
flag=1
for b in $NETWORK
do
if [ "$NETWORK_NAME" = "$b" ]; then
flag=0
break;
fi
done

if [ $flag -ne 0 ];then
echo "There is no network $NETWORK ,Please select the correct one network name/id "
else
break
fi
done

while :
do
echo -e "Please enter an VM use Image: "
openstack image list
read -p "Please enter an VM use Image ID/NAME:" IMAGE_NAME
IMAGE=$(openstack image list | awk -F "|" 'NR>2{print $2,$3}' )
flag=1
for c in $IMAGE
do
if [ "$IMAGE_NAME" = "$c" ]; then
flag=0
break;
fi
done

if [ $flag -ne 0 ];then
echo "There is no image $IMAGE ,Please select the correct one image name/id "
else
break
fi
done

while :
do
echo -e "Please enter an VM use AZ Zone:"
openstack availability zone list | grep -vE 'internal|test-az|nova'
read -p " Please enter an VM use AZ Zone Name:" AZ_NAME
AZ=$(openstack availability zone list | grep -vE 'internal|test-az|nova' |awk -F "|" 'NR>2{print $2}')
flag=1
for d in $AZ
do
if [ "$AZ_NAME" = "$d" ]; then
flag=0
break
fi
done

if [ $flag -ne 0 ];then
echo -e "There is no AZ $AZ ,Please select the correct one az name "
else
break
fi
done


echo -e "-----------------Create VM------------------- "
openstack server create --image $IMAGE_NAME --flavor $FLAVOR_NAME --nic net-id=$NETWORK_NAME --availability-zone $AZ_NAME $VM_NAME
if [ $? -ne 0 ]; then
echo -e " 33[31m Create VM Failed 33[0m"
else
echo -e "-------------33[32m Create VM Success 33[0m------------ "
fi
sleep 10
echo -e "---------------Check VM Status----------------- "
openstack server list | grep $VM_NAME
fi

sleep 10
;;
3)
source /root/openrc
echo -e "-----------------Check VM Networking----------------- "
openstack server list
read -p "Please Enter VM ID/NAME:" VM_ID
openstack server list | grep $VM_ID >> /dev/null 2>&1

if [ $? == 0 ] ; then
VM_IP=`openstack server list | grep $VM_ID | awk -F "|" '{print $5}' | sed 's/ //g' | awk -F "=" '{print $2}'`
VM_NETWORK=`openstack server list | grep $VM_ID | awk -F "|" '{print $5}' | sed 's/ //g' | awk -F "=" '{print $1}'`
Net_id=$(openstack network list | grep $VM_NETWORK | awk -F "|" '{print $2}' | tr '/n' ' ' | sed -e 's/^ //g' )
IP_NETNS=`ip netns list | grep $Net_id`
echo $VM_IP
echo $IP_NETNS
ip netns exec $IP_NETNS ping -c 3 $VM_IP > /dev/null 2>&1
if [ $? == 0 ]
then
ip netns exec $IP_NETNS ping -c 3 $VM_IP
echo -e "-------------33[32m Check VM networking is OK 33[0m------------- "
else
ip netns exec $IP_NETNS ping -c 3 $VM_IP
echo -e "-------------33[31m Please Check VM network or Check VM Status 33[0m------------- "
fi
else
echo -e "-------33[31m Please Check If The VM Exists 33[0m-------- "

fi

;;


4)
echo -e "--------Quickly Create Test VM --------- "
VM_NAME=Lab-Test-VM
NET_NAME=Lab-Test-net
SUBNET_NAME=Lab-Test-subnet
NETWORK="199.199.1.0/24"
IMAGE_NAME=TestVM

source /root/openrc
#####Create network#####
source /root/openrc
Net_id=$(openstack network list | grep $NET_NAME | awk -F "|" '{print $2}' | tr '/n' ' ' | sed -e 's/^ //g' )
#openstack network list | grep $NET_NAME | awk -F "|" '{print $2}' > /dev/null 2>&1
openstack network list | grep $NET_NAME >> /dev/null 2>&1
if [ $? == 0 ] ; then
# openstack network delete $Net_id
# openstack network create $NET_NAME
# neutron subnet-create --name $SUBNET_NAME $NET_NAME $NETWORK
# echo "create network success "
openstack network list | grep $NET_NAME
echo -e "-------------33[42m $NET_NAME33[0m 33[31m network already exists 33[0m------------- "
Net_id=$(openstack network list | grep $NET_NAME | awk -F "|" '{print $2}' | tr '/n' ' ' | sed -e 's/^ //g' )

else
openstack network create $NET_NAME
neutron subnet-create --name $SUBNET_NAME $NET_NAME $NETWORK
if [ $? -ne 0 ]; then
openstack network list
echo -e "-------------- 33[31m create network failed 33[0m ----------------- "
Net_id=$(openstack network list | grep $NET_NAME | awk -F "|" '{print $2}' | tr '/n' ' ' | sed -e 's/^ //g' )
openstack network delete $Net_id
openstack network list
echo -e "--------------- Delete failed network --------------------- "
else
# openstack subnet create $SUBNET_NAME --network $NET_NAME --subnet-range $NETWORK
echo -e "-------------33[32m create network success 33[0m------------ "
fi
fi


echo -e "-----------Create VM------------ "
####Create VM#####
source /root/openrc
AZ_ZONE=`openstack availability zone list | grep available |grep -vE '(internal|test-az)' | awk -F "|" 'NR==1{print $2}' | sed -e 's/ //g'` > /dev/null 2>&1
Net_id=$(openstack network list | grep $NET_NAME | awk -F "|" 'NR=1{print $2}' | tr '/n' ' ' | sed -e 's/^ //g' )

openstack server list | grep $VM_NAME > /dev/null 2>&1
if [ $? == 0 ]
then
openstack server list | grep $VM_NAME
VM_ID=`openstack server show $VM_NAME |grep -w id | awk -F "|" '{print $3 }' | sed 's/ //g'`
echo -e "----------------33[31m $VM_NAME VM already exists 33[0m------------- "

else
VM_ID=`openstack server create --image $IMAGE_NAME --flavor 3 --nic net-id=$Net_id --availability-zone $AZ_ZONE $VM_NAME | grep -w id | awk -F "|" '{print $3 }' | sed 's/ //g'i`
openstack server show $VM_ID
echo -e "----------------33[32m Create Test VM Success 33[0m------------- "
fi

sleep 20

echo -e "-----------------Check VM Networking----------------- "
source /root/openrc
VM_IP=`openstack server list | grep $VM_ID | awk -F "|" '{print $5}' | sed 's/ //g' | awk -F "=" '{print $2}'`
Net_id=$(openstack network list | grep $NET_NAME | awk -F "|" 'NR=1{print $2}' | tr '/n' ' ' | sed -e 's/^ //g' )
IP_NETNS=`ip netns list | grep $Net_id`
openstack server list | grep $VM_NAME
echo $VM_IP
echo $Net_id
ip netns exec $IP_NETNS ping -c 3 $VM_IP > /dev/null 2>&1
if [ $? == 0 ]
then
ip netns exec $IP_NETNS ping -c 3 $VM_IP
echo -e "-------------33[32m Check VM networking is OK 33[0m------------- "

else
ip netns exec $IP_NETNS ping -c 3 $VM_IP
echo -e "-------------33[31m Please Check VM network 33[0m------------- "

fi
;;


q)
exit 0
;;

*)

echo -e " Input error ,Please Check "
;;


esac


done

原文地址:https://www.cnblogs.com/yk0625/p/14078432.html