OS : openSUSE 13.2 (Harlequin) (x86_64)
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的配置項都刪除,比如下邊的內容都應該保留下來
000_修改網卡配置文件名稱(你沒有看錯,因爲在雲主機裏linux系統都是 eth 的效果)
mv /etc/sysconfig/network/ifcfg-ens3 /etc/sysconfig/network/ifcfg-eth0 |
001_修改網卡的配置文件,修改爲精簡型的網卡配置文件
vim /etc/sysconfig/network/ifcfg-eth0
BOOTPROTO=dhcp STARTMODE=onboot |
闡述: 這裏寫eth1 是爲了雲主機對應兩個網卡做的,如果能確保以後只用一個網卡的,可以不用寫eth1; 但是現在的趨勢都是設置的兩個網絡,一個作爲內網,一個作爲外網 |
vim /etc/sysconfig/network/ifcfg-eth1
BOOTPROTO=dhcp STARTMODE=onboot |
注: 這裏提示一下,現在還是在kvm虛擬機裏,所以網卡名還是 ens 的方式; 所以千萬不要重新啓動網卡,要是需要重啓的話,請保留ens 的網卡配置文件, 然後再重新啓動即可 systemctl restart network.service |
二、配置系統允許遠程登錄
001_修改系統防火牆配置,允許遠程ssh登錄
grep "FW_SERVICES_EXT_TCP" /etc/sysconfig/SuSEfirewall2
FW_SERVICES_EXT_TCP="ssh" |
rcSuSEfirewall2 restart |
002_關閉祕鑰登錄,開啓密碼登錄
vim /etc/ssh/sshd_config
#AuthorizedKeysFile .ssh/authorized_keys PasswordAuthentication yes |
003_重新啓動ssh服務
systemctl restart sshd |
三、安裝一些自己需要的工具
添加自己的內部源,沒有的同學,跳過此步驟即可;
000_擴展技能
/etc/zypp/repos.d/ opensuse 源的位置
zypper install 軟件包名 安裝軟件包,類似centos系統的yum
zypper repos --url 顯示repo源信息
zypper modifyrepo --disable/enable openSUSE-13.2-0 開啓/關閉repo源
zypper refresh 刷新全部源
zypper removerepo 名稱 移除一個指定的源
zypper renamerepo old_name new_name 修改一個指定源的名字
zypper ps 顯示使用已經刪除文件的進程
yast 一個字符的圖形管理工具
zypper addrepo -f[表示軟件源自動刷新] url 別名 添加一個源
eg:
zypper addrepo -f http://mirrors.ustc.edu.cn/opensuse/distribution/13.2/repo/oss/ ustc-oss
001_安裝需要的軟件包
zypper install python-configobj python-yaml python-Cheetah acpid cloud-init jq |
問題解決方案:
002_修改內核參數,並更新內核配置(配置顯示 nova console-log )
添加,直接添加就好,如下圖
vim /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT=" resume=/dev/system/swap splash=silent console=ttyS0 quiet showopts" |
grub2-mkconfig -o /boot/grub2/grub.cfg |
003_修改cloud.cfg配置文件 這裏,就直接把需要修改的地方用 紅色字體標註出來啦,當然也會把 替換的命令貼出來
sed -i 's/disable_root: false/disable_root: true/g' /etc/cloud/cloud.cfg |
下面編輯 cloud.cfg 部分僅供參考
vim /etc/cloud/cloud.cfg
# Adapted default config for (open)SUSE systems
users:
- root
disable_root:true
preserve_hostname:false
syslog_fix_perms: root:root
mount_default_fields: [~, ~, 'auto', 'defaults', '0', '2']
# The modules that run in the 'init' stage
cloud_init_modules:
- migrator
- bootcmd
- write-files
- growpart
- resizefs
- set_hostname
- update_hostname
- update_etc_hosts
- ca-certs
- rsyslog
- users-groups
- ssh
# The modules that run in the 'config' stage
cloud_config_modules:
- mounts
- ssh-import-id
- locale
- set-passwords
- package-update-upgrade-install
- timezone
- puppet
- chef
- salt-minion
- mcollective
- disable-ec2-metadata
- runcmd
- byobu
# The modules that run in the 'final' stage
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
- power-state-change
# System and/or distro specific settings
system_info:
distro: opensuse
paths:
cloud_dir: /var/lib/cloud/
templates_dir: /etc/cloud/templates/
ssh_svcname: sshd
004_添加修改、重置密碼的腳本(這些操作均由下面的腳本一鍵執行添加)
將下面的內容複製到一個文件,並賦予執行的權限即可 自動添加寫好的服務腳本,並且自己添加爲開機啓動,還會把 /sbin 對應的文件加密
vim meta_opensuse132.sh
#!/bin/bash cat > /etc/init.d/meta_data_service << END #!/bin/bash # ### BEGIN INIT INFO # Provides: meta_data_service # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: # Short-Description: meta_data_service sspaas-cloud daemon ### END INIT INFO # 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 # ### BEGIN INIT INFO # Provides: meta_network_service # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: # Short-Description: meta_network_service sspaas-cloud daemon ### END INIT INFO # 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_opensuse123.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 meta_opensuse123.sh |
007_關機即可
poweroff
到這裏 openstack 的 opensuse13.2 鏡像就做完成啦
下面的操作,主要是吧 大的鏡像進行壓縮,並進行上傳,下面的操作均在做鏡像的服務器(宿主機)上操作
三、技能擴展:
001_顯示kvm中所有虛擬機
virsh list --all
002_執行清理任務,如,之前的歷史命令,mac地址,ip地址等
virt-sysprep -d opensuse132
003_在kvm中刪除虛擬機,僅僅刪除xml文件,不會刪除鏡像文件
virsh undefine opensuse132
004_將鏡像壓縮
qemu-img convert -c -O qcow2 壓縮之前的路徑+名字 壓縮之後的路徑+名字