在本地KVM中使用cloud-init
cloud-init是一個Linux虛擬機的初始化工具,被廣泛應用在AWS和OpenStack等雲平臺中,用於在新建的虛擬機中進行時間設置、密碼設置、擴展分區、安裝軟件包等初始化設置。本文主要研究在本地KVM虛擬機,也就是沒有云平臺的情況下,如何使用cloud-init進行初始化工作。示例虛擬機的操作系統是centos7.1。
安裝
在虛擬機內安裝cloud-init:
yum install cloud-init -y |
安裝完後,配置文件在/etc/cloud目錄,主配置文件爲/etc/cloud/cloud.cfg
DataSource
要讓cloud-init能夠順利完成初始化工作,必須把一些數據傳給cloud-init,例如讓cloud-init設置root密碼,必須要告訴cloud-init密碼是什麼。Cloud-init支持很多種數據來源,常見的有metadata service、config drive和nocloud等。
l metadata service提供一個可以獲取數據的url,例如OpenStack中的nova-api-metadat提供的http://169.254.169.254,虛擬機開機後cloud-init在完成網絡配置後,會向這個url發起請求。因此這種模式需要先配置好網絡;
l Config drive 把數據封裝進一個iso9660(也支持vfat,但是不常見)文件系統的鏡像中,然後把這個鏡像以光驅(ide接口)的形式掛載到虛擬機中,虛擬機開機後cloud-init會自動去該鏡像中獲取數據。文件結構一般如下:
openstack/ - 2012-08-10/ or latest/ - meta_data.json - user_data (not mandatory) - content/ - 0000 (referenced content files) - 0001 - .... ec2 - latest/ - meta-data.json (not mandatory) |
l Nocloud 這種模式與config drive類似,只是文件結構不同,一般由user-data和meta-data兩個文本文件構成。並且鏡像以普通磁盤(virtio接口)的方式掛載。
本文主要試驗nocloud模式。
封裝數據
製作鏡像需要cloud-localsd命令,默認沒有安裝,安裝命令如下:
yum install cloud-utils -y |
編寫user-data:
cat << EOF > my-user-data #cloud-config chpasswd: list: | root:123456 expire: false ssh_pwauth: true EOF |
cloud-init也支持多種數據格式,我們使用的是cloud-config格式,這種格式必須是以#cloud-config開頭的yaml格式。上面這段的意思是把root的密碼設置爲“123456”,然後配置ssh允許密碼登錄。
製作img:
cloud-localds -m local my-seed.img my-user-data |
-m指定的cloud-init的工作模式,local的意思是不需要依賴網絡,我們沒有使用metadata service,所以不需要網絡。
掛載數據
編輯虛擬機的libvirt xml配置文件,掛載鏡像:
<disk type='file' device='disk'> <driver name='qemu' type='raw' cache='none' io='native'/> <source file='/path/to/my-seed.img'/> <target dev='vdb' bus='virtio'/> <readonly/> </disk> |
修改cloud-init配置
在/etc/cloud/cloud.cfg最後一行添加以下內容,這句的意思是讓cloud-init接受NoCloud來源的數據:
datasource_list: ["NoCloud"] |
重啓虛擬機
在虛擬機內執行rm -rf /var/lib/cloud,不刪除這個目錄,cloud-init不會執行。
硬重啓虛擬機
virsh destroy vm virsh start vm |
虛擬機開機後,會發現root密碼變成了“123456”
查看數據
在虛擬機內mount /dev/vdb /mnt,可以查看數據的內容。
ls /mnt meta-data user-data cat user-data #cloud-config chpasswd: list: | root:123456 expire: false ssh_pwauth: true |
總結
本文測試了在無雲平臺管理的本地KVM虛擬機上使用cloud-init修改root密碼的功能。cloud-init還有很多功能和技術細節,後續會繼續研究。