Configuration Opennebula3.8 & 4.x Virtual Machines Contextualizing

    之前有个朋友告诉我,初始化配置脚本在windows下无法正确执行,当时我没有给与他明确的答复,后来经过测试发现了不同,如下所示:

Nebula3.8的Context.sh文件:

1
2
3
4
5
6
7
8
9
10
# Context variables generated by OpenNebula
DISK_ID="1"
DNS_A="202.106.0.20"
DNS_B="202.96.69.38"
DRIVER="file:"
GATEWAY="192.168.10.1"
HOSTNAME="centos6.3"
IP="192.168.10.60"
NETMASK="255.255.255.0"
TARGET="hdb"

Nebula4.x的Context.sh文件:

1
2
3
4
5
6
7
8
9
# Context variables generated by OpenNebula
DISK_ID='1'
ETH0_DNS='202.106.0.20'
ETH0_GATEWAY='192.168.10.1'
ETH0_IP='192.168.10.2'
ETH0_MASK='255.255.255.0'
ETH0_NETWORK='192.168.10.0'
NETWORK='YES'
TARGET='vdb'


    在此,原nebula3.8的初始化脚本可继续使用,后面添加了nebula4.x下的初始化脚本。    细心的朋友会发现,nebula3.8的变量使用“双引号”,而nebula4.x版本的变量使用“单引号”,在原3.8的windows初始化脚本中有去除双引号的步骤,但是无法去除单引号,而windows系统认为set 变量“=”号后面的值都为变量值,如去除双引号后:set ETH0_IP='192.168.10.2'系统任务赋予ETH0_IP的值为'192.168.10.2'而非192.168.10.2,结果导致错误。另外变量定义也发生的改变,3.8中我以"IP"定义IP变量,而4.x中系统以"ETH0_IP"定义IP变量。


一、nebula3.8初始化脚本

1、Linux虚拟机:


(1).Linux虚拟机镜像配置:

[root@VM ~]# cd /tmp

[root@VM tmp]# vi contextualizing.sh


#!/bin/bash

for CDROM in $(ls /dev | grep "cdrom" | awk 'END{print}')

do

mount /dev/$CDROM /mnt

    if [ -f /mnt/CentOS_init.sh ]; then

        sh /mnt/CentOS_init.sh

    fi

        umount /mnt

done

# sed -i "/^sh/d"   /etc/rc.local


[root@VM tmp]# vi /etc/rc.local

加入一行:

sh /tmp/contextualizing.sh

********************************************************************************************

(2).Opennebula管理端配置init.sh脚本:

[oneuser@master ~]$ mkdir scripts

[oneuser@master ~]$ cd scripts

[oneuser@master scripts]$ vi CentOS_init.sh

#!/bin/bash

# By chensh at 2013/08/26

# This script for CentOS6

   

#Define...................

   

       HOSTS_NAME="/etc/hosts"

       NETWORK_HOSTS_NAME="/etc/sysconfig/network"

       INTERFACE="/etc/sysconfig/network-scripts/ifcfg-eth0"

       CFG_DNS="/etc/resolv.conf"

   

#Scripts start..............

   

if [ -f /mnt/context.sh ]; then

   

       . /mnt/context.sh

   

fi

   

    

   

if [ -n "$HOSTNAME" ]; then

   

       sed -i "/localhost/! d" $HOSTS_NAME

       echo "$IP $HOSTNAME" >> $HOSTS_NAME

       sed -i "/^HOSTNAME/d" $NETWORK_HOSTS_NAME

       echo "HOSTNAME=$HOSTNAME"  >> $NETWORK_HOSTS_NAME

   

fi

   

    

   

if [ -n "$IP" ]; then

   

       echo "DEVICE=eth0" > $INTERFACE

       echo "BOOTPROTO=static" >> $INTERFACE

       echo "ONBOOT=yes" >> $INTERFACE

       echo "IPADDR=$IP"  >> $INTERFACE

   

fi

   

    

   

if [ -n "$NETMASK" ]; then

   

       echo "NETMASK=$NETMASK" >> $INTERFACE

   

fi

   

   

   

if [ -n "$GATEWAY" ]; then

   

       echo "GATEWAY=$GATEWAY" >> $INTERFACE

       echo "TYPE=Ethernet" >> $INTERFACE

   

fi

    

   

if [ -n "$DNS_A" ]; then

   

       echo "nameserver  $DNS_A" > $CFG_DNS

   

fi

   

   

if [ -n "$DNS_B" ]; then

       sed -i "/nameserver/! d" $CFG_DNS

       echo "nameserver  $DNS_B" >> $CFG_DNS

   

fi

   

    

   

if [ -f /mnt/id_rsa.pub ]; then

   

       cat /mnt/id_rsa.pub > /root/.ssh/authorized_keys

   

fi

   

reboot

****************************************************************************************

(3).Opennebula Linux VM模版添加内容:




CONTEXT=[

  DNS_A="$NETWORK[DNS_A,NETWORK_ID=1]",

  DNS_B="$NETWORK[DNS_B,NETWORK_ID=1]",

  DRIVER="file:",

  FILES="/srv/cloud/one/scripts/CentOS_init.sh",

  GATEWAY="$NETWORK[GATEWAY,NETWORK_ID=1]",

  HOSTNAME="$NAME",

  IP="$NIC[IP]",

  NETMASK="$NETWORK[NETWORK_MASK,NETWORK_ID=1]",

  TARGET="hdb" ]

*NETWORK_ID为虚拟网络的ID号。

******************************************************************************

(4).Opennebula虚拟网络附加设置:


该附加设置便于虚拟机获取网关和DNS。

******************************************************************************



2、Windows虚拟机:


(1).Windows虚拟机镜像配置:

在C盘根目录下创建Windows_init.bat,内容如下:


@echo off


%开启变量延迟%

setlocal enabledelayedexpansion


for /f "eol=# delims=" %%a in (D:context.sh) do set "_%%a"


%判断context.sh传递的变量是否存在,定义变量%


%主机名%

if defined _HOSTNAME (

set HOSTNAME=%_HOSTNAME%&set HOSTNAME=!HOSTNAME:"=!

) else (

echo "No HOSTNAME Defined~!"

)


%Administrator用户密码%

if defined _PASSWD (

set PASSWD=%_PASSWD%&set PASSWD=!PASSWD:"=!

) else (

echo "No passwd Defined~!"

)


%IP地址%

if defined _IP (

set IP=%_IP%&set IP=!IP:"=!

) else (

echo "No IP Defined~!"

)


%掩码%

if defined _NETMASK (

set NETMASK=%_NETMASK%&set NETMASK=!NETMASK:"=!

) else (

echo "No NETMASK Defined~!"

)


%网关%

if defined _GATEWAY (

set GATEWAY=%_GATEWAY%&set GATEWAY=!GATEWAY:"=!

) else (

echo "No GATEWAY Defined~!"

)


%第一个DNS地址%

if defined _DNS_A (

set DNS_A=%_DNS_A%&set DNS_A=!DNS_A:"=!

) else (

echo "No DNS_A Defined~!"

)

%第二个DNS地址%

if defined _DNS_B (

set DNS_B=%_DNS_B%&set DNS_B=!DNS_B:"=!

) else (

echo "No DNS_B Defined~!"

)


%在没有主机名的情况下以MAC作为主机名,并定义变量%

for /f "delims=: tokens=1-2" %%a in ('ipconfig /all^|findstr "Physical"') do set mac=%%b

set MAC=%mac:~7,2%%mac:~10,2%%mac:~13,2%%mac:~16,2%

set HOSTNM=VM-%MAC%


%配置主机名,如果传递变量存在按其名称配置主机名,如不存在以MAC地址的方式配置主机名%

if defined HOSTNAME (

reg add "HKEY_LOCAL_MACHINESYSTEMControlSet001ControlComputerNameComputerName" /v "ComputerName" /d "%HOSTNAME%" /f

reg add "HKEY_LOCAL_MACHINESYSTEMControlSet001ServicesTcpipParameters" /v "NV Hostname" /d "%HOSTNAME%" /f

reg add "HKEY_LOCAL_MACHINESYSTEMControlSet001ServicesTcpipParameters" /v "Hostname" /d "%HOSTNAME%" /f

reg add "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlComputerNameComputerName" /v "ComputerName" /d "%HOSTNAME%" /f

reg add "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters" /v "NV Hostname" /d "%HOSTNAME%" /f

reg add "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters" /v "Hostname" /d "%HOSTNAME%" /f

) else (

reg add "HKEY_LOCAL_MACHINESYSTEMControlSet001ControlComputerNameComputerName" /v "ComputerName" /d "%HOSTNM%" /f

reg add "HKEY_LOCAL_MACHINESYSTEMControlSet001ServicesTcpipParameters" /v "NV Hostname" /d "%HOSTNM%" /f

reg add "HKEY_LOCAL_MACHINESYSTEMControlSet001ServicesTcpipParameters" /v "Hostname" /d "%HOSTNM%" /f

reg add "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlComputerNameComputerName" /v "ComputerName" /d "%HOSTNM%" /f

reg add "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters" /v "NV Hostname" /d "%HOSTNM%" /f

reg add "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters" /v "Hostname" /d "%HOSTNM%" /f

)


%配置IP、掩码、网关信息%

if defined IP (

if defined NETMASK (

netsh interface ip set address name="本地连接" source=static addr=%IP% mask=%NETMASK%

if defined GATEWAY (

netsh interface ip set address name="本地连接" gateway=%GATEWAY% gwmetric=1

) else (

      echo "No GATEWAY Information"

)

) else (

echo "No NETMASK Information"

)

) else (

echo "No IP Information"

)


%配置DNS信息%

if defined DNS_A (

netsh interface ip set dns name="本地连接" source=static addr=%DNS_A%

if defined DNS_B (

netsh interface ip add dns "本地连接" %DNS_B% index=2

) else (

echo "No Second DNS Information"

)

) else (

echo "No DNS Information"

)


%删除计划任务%

del C:WINDOWSTasksWindows_init.job


%配置Administrator用户密码%

if defined PASSWD (

net user administrator %PASSWD%

) else (

echo "No Password Information"

)


%删除bat脚本%

if exist D:context.sh (

del C:Windows_init.bat

shutdown -r -t 0

) else (

shutdown -r -t 0

)


pause>nul

******************************************************************************


(2).Opennebula Windows VM模版添加内容:


CONTEXT=[

  DNS_A="$NETWORK[DNS_A,NETWORK_ID=1]",

  DNS_B="$NETWORK[DNS_B,NETWORK_ID=1]",

  DRIVER="file:",

  GATEWAY="$NETWORK[GATEWAY,NETWORK_ID=1]",

  HOSTNAME="$NAME",

  IP="$NIC[IP]",

  NETMASK="$NETWORK[NETWORK_MASK,NETWORK_ID=1]",

  TARGET="hdb" ]

******************************************************************************

(3).Opennebula虚拟网络附加设置:


该附加设置便于虚拟机获取网关和DNS。

******************************************************************************

二、nebula4.x初始化脚本

1、Linux虚拟机:

(1).Linux虚拟机镜像配置初始化执行脚本:

[root@VM ~]# cd /tmp

[root@VM tmp]# vi CentOS_init.sh

#!/bin/bash

# By chensh at 2013/11/01

# This script by CentOS6


#Define...................


       HOSTS_NAME="/etc/hosts"

       NETWORK_HOSTS_NAME="/etc/sysconfig/network"

       INTERFACE="/etc/sysconfig/network-scripts/ifcfg-eth0"

       INTERFACE1="/etc/sysconfig/network-scripts/ifcfg-eth1"

       INTERFACE2="/etc/sysconfig/network-scripts/ifcfg-eth2"

       INTERFACE3="/etc/sysconfig/network-scripts/ifcfg-eth3"

       CFG_DNS="/etc/resolv.conf"


#Scripts start..............

for CDROM in $(ls /dev | grep "cdrom" | awk 'END{print}')

do

mount /dev/$CDROM /mnt

done

sleep 2


if [ -f /mnt/context.sh ]; then


       . /mnt/context.sh


fi


#check network ip,if exist do exit 0


SIP=`cat "$INTERFACE" | grep IPADDR |cut -d "=" -f 2`


if [ "$ETH0_IP" = "$SIP" ] ;then


exit 0


fi


###############################


if [ -n "$HOSTNAME" ]; then


       sed -i "/localhost/! d" $HOSTS_NAME

       echo "$ETH0_IP $HOSTNAME" >> $HOSTS_NAME

       sed -i "/^HOSTNAME/d" $NETWORK_HOSTS_NAME

       echo "HOSTNAME=$HOSTNAME"  >> $NETWORK_HOSTS_NAME


fi


 


if [ -n "$ETH0_IP" ]; then


       echo "DEVICE=eth0" > $INTERFACE

       echo "BOOTPROTO=static" >> $INTERFACE

       echo "ONBOOT=yes" >> $INTERFACE

       echo "IPADDR=$ETH0_IP"  >> $INTERFACE


fi


 


if [ -n "$ETH0_MASK" ]; then


       echo "NETMASK=$ETH0_MASK" >> $INTERFACE


fi


if [ -n "$ETH0_NETWORK" ]; then


       echo "NETWORK=$ETH0_NETWORK" >> $INTERFACE


fi



if [ -n "$ETH0_GATEWAY" ]; then


       echo "GATEWAY=$ETH0_GATEWAY" >> $INTERFACE

       echo "TYPE=Ethernet" >> $INTERFACE


fi 

 


if [ -n "$ETH0_DNS" ]; then


       echo "nameserver  $ETH0_DNS" > $CFG_DNS


fi



if [ -n "$DNS_B" ]; then

       sed -i "/nameserver/! d" $CFG_DNS

       echo "nameserver  $DNS_B" >> $CFG_DNS


fi


##########################################################


if [ -n "$ETH1_IP" ]; then

       touch /etc/sysconfig/network-scripts/ifcfg-eth1

       echo "DEVICE=eth1" > $INTERFACE1

       echo "BOOTPROTO=static" >> $INTERFACE1

       echo "ONBOOT=yes" >> $INTERFACE1

       echo "IPADDR=$ETH1_IP"  >> $INTERFACE1


fi



if [ -n "$ETH1_MASK" ]; then


       echo "NETMASK=$ETH1_MASK" >> $INTERFACE1

fi

#########################################################


if [ -n "$ETH2_IP" ]; then


       touch /etc/sysconfig/network-scripts/ifcfg-eth2

       echo "DEVICE=eth2" > $INTERFACE2

       echo "BOOTPROTO=static" >> $INTERFACE2

       echo "ONBOOT=yes" >> $INTERFACE2

       echo "IPADDR=$ETH2_IP"  >> $INTERFACE2


fi



if [ -n "$ETH2_MASK" ]; then


       touch /etc/sysconfig/network-scripts/ifcfg-eth3

       echo "NETMASK=$ETH2_MASK" >> $INTERFACE2

fi

#########################################################


if [ -n "$ETH3_IP" ]; then


       echo "DEVICE=eth3" > $INTERFACE3

       echo "BOOTPROTO=static" >> $INTERFACE3

       echo "ONBOOT=yes" >> $INTERFACE3

       echo "IPADDR=$ETH3_IP"  >> $INTERFACE3


fi



if [ -n "$ETH3_MASK" ]; then


       echo "NETMASK=$ETH3_MASK" >> $INTERFACE3

fi

#########################################################


if [ -n "$SSH_PUBLIC_KEY" ]; then


       echo "$SSH_PUBLIC_KEY" > /root/.ssh/authorized_keys


fi


if [ -n "$PASSWORD" ]; then

(

sleep 1

echo "$PASSWORD";

sleep 1

echo "$PASSWORD"

sleep 1) | passwd root


fi


sed -i '/CentOS_init.sh/d' /etc/rc.d/rc.local


service network restart


hostname $HOSTNAME && killall login


(2).rc.local添加执行命令:

[root@VM ~]# echo "sh /tmp/CentOS_init.sh" >>  /etc/rc.local

*****************************************************************************

2、Windows虚拟机:


(1).Windows虚拟机镜像配置:

在C盘根目录下创建Windows_init.bat,内容如下:

@echo off


%开启变量延迟%

setlocal enabledelayedexpansion


for /F "eol=# tokens=1,2* delims=' " %%a in (D:context.sh) do set "%%a%%b"


%判断context.sh传递的变量是否存在,定义变量%


%主机名%

if defined HOSTNAME (

set HOSTNAME=%HOSTNAME%&set HOSTNAME=!HOSTNAME:"=!

) else (

echo "No HOSTNAME Defined~!"

)


%Administrator用户密码%

if defined PASSWORD (

set PASSWD=%PASSWORD%&set PASSWD=!PASSWD:"=!

) else (

echo "No passwd Defined~!"

)


%IP地址%

if defined ETH0_IP (

set IP=%ETH0_IP%&set IP=!IP:"=!

) else (

echo "No IP Defined~!"

)


%掩码%

if defined ETH0_MASK (

set NETMASK=%ETH0_MASK%&set NETMASK=!NETMASK:"=!

) else (

echo "No NETMASK Defined~!"

)


%网关%

if defined ETH0_GATEWAY (

set GATEWAY=%ETH0_GATEWAY%&set GATEWAY=!GATEWAY:"=!

) else (

echo "No GATEWAY Defined~!"

)


%第一个DNS地址%

if defined ETH0_DNS (

set DNS_A=%ETH0_DNS%&set DNS_A=!DNS_A:"=!

) else (

echo "No DNS_A Defined~!"

)

%第二个DNS地址%

if defined DNS_B (

set DNS_B=%DNS_B%&set DNS_B=!DNS_B:"=!

) else (

echo "No DNS_B Defined~!"

)


%在没有主机名的情况下以MAC作为主机名,并定义变量%

for /f "delims=: tokens=1-2" %%a in ('ipconfig /all^|findstr "Physical"') do set mac=%%b

set MAC=%mac:~7,2%%mac:~10,2%%mac:~13,2%%mac:~16,2%

set HOSTNM=VM-%MAC%


%配置主机名,如果传递变量存在按其名称配置主机名,如不存在以MAC地址的方式配置主机名%

if defined HOSTNAME (

reg add "HKEY_LOCAL_MACHINESYSTEMControlSet001ControlComputerNameComputerName" /v "ComputerName" /d "%HOSTNAME%" /f

reg add "HKEY_LOCAL_MACHINESYSTEMControlSet001ServicesTcpipParameters" /v "NV Hostname" /d "%HOSTNAME%" /f

reg add "HKEY_LOCAL_MACHINESYSTEMControlSet001ServicesTcpipParameters" /v "Hostname" /d "%HOSTNAME%" /f

reg add "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlComputerNameComputerName" /v "ComputerName" /d "%HOSTNAME%" /f

reg add "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters" /v "NV Hostname" /d "%HOSTNAME%" /f

reg add "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters" /v "Hostname" /d "%HOSTNAME%" /f

) else (

reg add "HKEY_LOCAL_MACHINESYSTEMControlSet001ControlComputerNameComputerName" /v "ComputerName" /d "%HOSTNM%" /f

reg add "HKEY_LOCAL_MACHINESYSTEMControlSet001ServicesTcpipParameters" /v "NV Hostname" /d "%HOSTNM%" /f

reg add "HKEY_LOCAL_MACHINESYSTEMControlSet001ServicesTcpipParameters" /v "Hostname" /d "%HOSTNM%" /f

reg add "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlComputerNameComputerName" /v "ComputerName" /d "%HOSTNM%" /f

reg add "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters" /v "NV Hostname" /d "%HOSTNM%" /f

reg add "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters" /v "Hostname" /d "%HOSTNM%" /f

)


%配置IP、掩码、网关信息%

if defined ETH0_IP (

if defined ETH0_MASK (

netsh interface ip set address name="本地连接" source=static addr=%IP% mask=%NETMASK%

if defined ETH0_GATEWAY (

netsh interface ip set address name="本地连接" gateway=%GATEWAY% gwmetric=1

) else (

      echo "No GATEWAY Information"

)

) else (

echo "No NETMASK Information"

)

) else (

echo "No IP Information"

)


%配置DNS信息%

if defined ETH0_DNS (

netsh interface ip set dns name="本地连接" source=static addr=%DNS_A%

if defined DNS_B (

netsh interface ip add dns "本地连接" %DNS_B% index=2

) else (

echo "No Second DNS Information"

)

) else (

echo "No DNS Information"

)


%配置Administrator用户密码%

if defined PASSWORD (

net user administrator %PASSWD%

) else (

echo "No Password Information"

)


%删除计划任务%

del C:WINDOWSTasksWindows_init.job


%NewSid%


c: ewsid.exe /a


pause>nul

2.拷贝newsid.exe文件到C盘根目录下,传输过程省略。

http://pan.baidu.com/s/15rm9o

3.创建计划任务,开机运行Windows_init.bat


配置完成。



原文地址:https://www.cnblogs.com/myiaas/p/4161357.html