製作CentOS6.9的OpenStack鏡像

OS : CentOS Linux release 6.9
KVM version: qemu-kvm-1.5.3
鏡像運行環境: OpenStack Mitaka:
本文不去介紹,如何下載iso文件,也不介紹如何安裝虛擬機,不過這裏給大家一個提示吧,安裝的kvm虛擬機,分區最好是 /boot採用 基本分區其他的分區採用lvm的類型

闡述: 本文修改雲主機密碼的方式爲 metadata 注入方式;其原理是在 雲主機內部編寫一個 重置密碼的腳本,達到重置密碼的效果;
該腳本會去查找 “http://169.254.169.254/openstack/latest/meta_data.json” 這個地址的值,只要changePasswd 的值爲True,纔會去修改密碼;
瞭解到前臺傳值,changePasswd=True的狀態至少會保留1分鐘,而我的腳本卻是一直循環着(達到立馬修改密碼的效果),所以,這個密碼至少會被修改20次,雖然密碼一直是那個值,但是在系統裏確實是已經被修改了好多次,爲了排除這種問題,所以下面腳本重置密碼的情況是,當changePasswd=False並且 當changePasswd=True的狀態時,纔會去修改密碼;(你沒有看錯,就是這樣),具體請看下面的腳本

初始密碼的設置: 在openstack 控制節點 執行:
用法:
nova meta 雲主機id 或者 主機名稱 set changePasswd=True admin_pass=密碼

實例:
nova meta 17d96745-63a7-4401-87de-f34ca418a5e6 set changePasswd=True admin_pass=Admin@

下面開始操作

一、配置網卡的配置,保留主要的就ok,把那些些uuid的配置項都刪除,比如下邊的內容都應該保留下來

001_修改網卡的配置文件,修改爲精簡型的網卡配置文件

vim /etc/sysconfig/network-scripts/ifcfg-eth0 
NAME=eth0
DEVICE=eth0
BOOTPROTO=dhcp
TYPE=Ethernet
ONBOOT=yes

闡述:  
        這裏寫eth1 是爲了雲主機對應兩個網卡做的,如果能確保以後只用一個網卡的,可以不用寫eth1;
但是現在的趨勢都是設置的兩個網絡,一個作爲內網,一個作爲外網

vim /etc/sysconfig/network-scripts/ifcfg-eth1
NAME=eth1
DEVICE=eth1
BOOTPROTO=dhcp
TYPE=Ethernet
ONBOOT=yes

002_重新啓動網絡配置
/etc/init.d/network restart

二、安裝一些自己需要的工具
000_添加自己的內部源,沒有的同學,跳過此步驟即可;

001_這裏我只安裝 cloud-init 、acpid 和 jq
acpid服務作用:重新引導或關閉實例
jq 服務作用:處理json數據
cloud-init服務作用: 配置使用metadata(我把官網的簡紹截一下圖)



yum -y install acpid cloud-init  jq

chkconfig acpid on

chkconfig cloud-init on

禁用zeroconf路由,實例訪問元數據,必須要禁用默認的zeroconf路由
echo "NOZEROCONF=yes" >> /etc/sysconfig/network

002_修改內核參數,並更新內核配置
vim /boot/grub/menu.lst 

default=0
timeout=5
serial --unit=0 --speed=115200
terminal --timeout=10 console serial
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.32-431.el6.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD rd_LVM_LV=VolGroup/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=VolGroup/lv_root  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb console=tty0 console=ttyS0,115200n8 quiet
        initrd /initramfs-2.6.32-431.el6.x86_64.img


提示操作:
比如你想做centos6.6的鏡像,但是你還在考慮要不要 yum update 的時候,我的答案是  實驗證明千萬別 yum update ; 不過update過之後kernel的配置也會同之前對內核操作過一樣,都會給你添加上的



003_修改cloud.cfg配置文件 這裏,就直接把需要修改的地方用 紅色字體標註出來啦,當然也會把 替換的命令貼出來
sed -i 's/disable_root: 1/disable_root: 0/g' /etc/cloud/cloud.cfg
sed -i 's/ssh_pwauth: 0/ssh_pwauth: 1/g' /etc/cloud/cloud.cfg
sed -i 's/name: centos/name: root/g' /etc/cloud/cloud.cfg

下面編輯 cloud.cfg 部分僅供參考
vim /etc/cloud/cloud.cfg 

users:
 - default

disable_root: 0
ssh_pwauth:   1

locale_configfile: /etc/sysconfig/i18n
mount_default_fields: [~, ~, 'auto', 'defaults,nofail', '0', '2']
resize_rootfs_tmp: /dev
ssh_deletekeys:   0
ssh_genkeytypes:  ~
syslog_fix_perms: ~

cloud_init_modules:
 - migrator
 - bootcmd
 - write-files
 - growpart
 - resizefs
 - set_hostname
 - update_hostname
 - update_etc_hosts
 - rsyslog
 - users-groups
 - ssh
 - resolv-conf

cloud_config_modules:
 - mounts
 - locale
 - set-passwords
 - yum-add-repo
 - package-update-upgrade-install
 - timezone
 - puppet
 - chef
 - salt-minion
 - mcollective
 - disable-ec2-metadata
 - runcmd

cloud_final_modules:
 - rightscale_userdata
 - scripts-per-once
 - scripts-per-boot
 - scripts-per-instance
 - scripts-user
 - ssh-authkey-fingerprints
 - keys-to-console
 - phone-home
 - final-message

system_info:
  default_user:
    name: root
    lock_passwd: true
    gecos: Cloud User
    groups: [wheel, adm]
    sudo: ["ALL=(ALL) NOPASSWD:ALL"]
    shell: /bin/bash
  distro: rhel
  paths:
    cloud_dir: /var/lib/cloud
    templates_dir: /etc/cloud/templates
  ssh_svcname: sshd

# vim:syntax=yaml



004_添加修改、重置密碼的腳本(這些操作均由下面的腳本一鍵執行添加)
將下面的內容複製到一個文件,並賦予執行的權限即可  自動添加寫好的服務腳本,並且自己添加爲開機啓動,還會把 /sbin 對應的文件加密 

vim meta_centos69.sh
#!/bin/bash
cat > /etc/init.d/meta_data_service << END
#!/bin/bash
#
# meta_data_service Start up meta_data_service the server daemon
#
# chkconfig: 2345 98 98
# description: meta_data_service sspaas-cloud daemon
#
BASE_DIR=/sbin
ARGV="\$@"
start()
{
echo "START meta_data SERVERS"
\$BASE_DIR/meta_data > /dev/null 2>&1 &
}
stop()
{
#meta_data.pid
echo "STOP meta_data SERVERS"
meta_datapid=\`ps -ef|grep meta_data|grep -v grep|awk '{ print\$2 }'\`
for i in \$meta_datapid
do
 kill -9 \$meta_datapid
done
}
case \$ARGV in
start)
start
ERROR=\$?
;;
stop)
stop
ERROR=\$?
;;
restart)
stop
start
ERROR=\$?
;;
*)
echo "meta_data [start|restart|stop]"
esac
exit \$ERROR
END

cat > /etc/init.d/meta_network_service << END
#!/bin/bash
#
# meta_network_service Start up meta_network_service the server daemon
#
# chkconfig: 2345 99 99
# description: meta_network_service sspaas-cloud daemon
#
BASE_DIR=/sbin
ARGV="\$@"
start()
{
echo "START meta_data SERVERS"
\$BASE_DIR/meta_network > /dev/null 2>&1 &
}
stop()
{
#meta_data.pid
echo "STOP meta_data SERVERS"
meta_networkpid=\`ps -ef|grep meta_network|grep -v grep|awk '{ print\$2 }'\`
for i in \$meta_networkpid
do
 kill -9 \$meta_networkpid
done
}
case \$ARGV in
start)
start
ERROR=\$?
;;
stop)
stop
ERROR=\$?
;;
restart)
stop
start
ERROR=\$?
;;
*)
echo "meta_network [start|restart|stop]"
esac
exit \$ERROR
END

cat > /sbin/meta_data << END
#!/bin/bash
m=\`curl http://169.254.169.254/openstack/latest/meta_data.json | jq '.meta'\`
   status=\`echo \$m | jq '.changePasswd' | sed 's/"//g'\`
   password=\`echo \$m | jq '.admin_pass' | sed 's/"//g'\`
     if [ \$status == True ];then
       echo root:\$password | chpasswd
     fi

while true
  do
    m1=\`curl http://169.254.169.254/openstack/latest/meta_data.json | jq '.meta' | jq '.changePasswd' | sed 's/"//g'\`
    sleep 3
    m2=\`curl http://169.254.169.254/openstack/latest/meta_data.json | jq '.meta'\`
       changepw=\`echo \$m2 | jq '.changePasswd' | sed 's/"//g'\`
       pass=\`echo \$m2 | jq '.admin_pass' | sed 's/"//g'\`

    if [ \$m1 == False ] && [ \$changepw == True ];then
      echo root:\$pass | chpasswd
    else
      echo "noting to do" >/dev/null
    fi
  done
END

cat > /sbin/meta_network << END
#!/bin/bash
while true
  do
     temp=\`ifconfig eth0 | grep broadcast | awk '{ print \$2 }' | awk -F "." 'BEGIN{ OFS="." }{ print \$1,\$2,\$3 }'\`
     ip0=\`ip a | grep eth0: | wc -l\`
     ip1=\`ip a | grep eth1: | wc -l\`
     route0=\`route -n | grep "^0.0.0.0" | grep \$temp.254 |wc -l\`

     if [ \$ip0 -eq 1 ] && [ \$ip1 -eq 1 ] && [ \$route0 -eq 1 ];then
      route del default gw \$temp.254
     elif [ \$ip0 -eq 1 ] && [ \$ip1 -eq 0 ] && [ \$route0 -eq 0 ];then
      route add default gw \$temp.254
     fi
  sleep 3
  done
END

chmod +x /sbin/meta_data
chmod +x /sbin/meta_network
chmod +x /etc/init.d/meta_data_service
chmod +x /etc/init.d/meta_network_service
#
gzexe /sbin/meta_data
rm -f /sbin/meta_data~
gzexe /sbin/meta_network
rm -f /sbin/meta_network~
#
chkconfig --add meta_data_service
chkconfig --add meta_network_service

下面 005 的操作僅僅用作刪除上面meta_centos69.sh 的執行結果
005_刪除上面腳本添加的內容,可以執行下面的操作
chkconfig --del meta_data_service
chkconfig --del meta_network_service
rm -f /sbin/meta_data
rm -f /sbin/meta_network
rm -f /etc/init.d/meta_data_service 
rm -f /etc/init.d/meta_network_service

006_刪除之前添加的不必要的信息
rm -f anaconda-ks.cfg 
rm -f meta_centos69.sh

007_關機即可
poweroff

到這裏 openstack 的centos6.9鏡像就做完成啦
下面的操作,主要是吧 大的鏡像進行壓縮,並進行上傳,下面的操作均在做鏡像的服務器(宿主機)上操作

三、技能擴展:

001_顯示kvm中所有虛擬機
virsh list --all

002_執行清理任務,如,之前的歷史命令,mac地址,ip地址等 
virt-sysprep -d CentOS6

003_在kvm中刪除虛擬機,僅僅刪除xml文件,不會刪除鏡像文件
virsh undefine CentOS6

004_將鏡像壓縮
qemu-img convert -c -O qcow2    壓縮之前的路徑+名字 壓縮之後的路徑+名字





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章