0. 環境介紹
0.1 Puppet介紹
Puppet是一個基於Ruby,並使用GPLv2協議授權的開源軟件,是一個C/S架構的配置管理工具,在中央服務器上安裝puppet-server軟件包(被稱作Puppetmaster)。在需要管理的目標主機上安裝puppet客戶端軟件(被稱作PuppetClient)。
當客戶端連接上Puppetmaster後,定義在Puppetmaster上的配置文件會被編譯,然後在客戶端上運行。每個客戶端默認每半個小時和服務器進行一次通信,確認配置信息的更新情況。如果有新的配置信息或者配置信息已經改變,配置將會被重新編譯併發布到各客戶端執行。也可以在服務器上主動觸發一個配置信息的更新,強制各客戶端進行配置。如果客戶端的配置信息被改變了,它可以從服務器獲得原始配置進行校正。
目前,puppet作爲企業運維自動化的重要工具被廣泛地應用,對於openstack來說,通過puppet來實現自動化部署及節點添加,將會大大提高運維效率。
0.2 系統架構說明
我們本次的puppet自動化部署實驗在虛擬機中進行,使用3臺虛擬機作爲openstack的3個節點,具體架構如下:
如上圖,3臺虛擬機分別作爲1個控制節點,其中用於運行除nova-compute之外的全部openstack組件服務,同時,該節點也是puppet的服務器端;其餘兩個節點作爲openstack的運算節點。
每臺虛擬機均配置了2個網卡,一個連接管理網絡,一個是虛擬機內網,同時也用於openstack內部組件之前的通信。具體網絡信息如下:
·控制節點:eth0:192.168.17.133 eth1:10.120.17.133 ·運算節點:eth0:192.168.17.134 eth1:10.120.17.134 ·運算節點:eth0:192.168.17.135 eth1:10.120.17.135
0.3 puppet架構說明:
下圖是一個比較常見且實用性較強的puppet配置架構:
圖中1臺機器作爲puppet master,一臺是SVN服務器,用於管理puppet配置所需的腳本等文件,其餘3臺則是puppet agent,即需要被部署的機器。
對於大型的商業應用來說,上面所示的架構顯然不能滿足企業對服務高可用的要求,所以企業往往會採用雙SVN服務器及雙puppet master的架構,下面是京東商城openstack自動化部署的架構圖:
1. 系統準備
1.1 系統選型與安裝
由於puppetlabs提供了基於Ubuntu的完全的puppet腳本,我們本次實驗將使用Ubuntu12.04 server作爲節點系統,等在Ubuntu上成功實現了自動化部署之後再對puppet腳本進行自定義的修改,實現在Debian上的部署。
值得注意的是:由於控制節點上既運行了openstack服務,也運行了puppetmaster服務器端,所以需要設置比較大的內存,同時應該預留一個空閒分區,用於nova-volume創建服務。
1.2 網絡設置
在開始puppet部署之前,我們首先需要把各節點的網絡部分完成,下面我們首先配置網卡部分:
# vi /etc/network/interfaces auto lo iface lo inet loopback auto eth0 iface eth0 inet static address192.168.17.133 netmask255.255.255.0 network192.168.17.0 gateway192.168.17.1 auto eth1 iface eth1 inet manual upifconfig eth1 up
從以上配置可知,我們需要把eth2啓動起來,重啓網絡之後,我們使用ifconfig命令應該能看到eth2網卡的信息。
接下來是重要的一步,由於puppet的主客服務器之間的通信是通過FQDN來通信的,所以我們需要在各節點上設置/etc/hosts文件,使得各節點之間的puppet程序能正常通信。
# vi /etc/hosts 127.0.0.1 localhost.example.com. localhost.example.com localhost 192.168.17.133 node1.example.com. node1.example.com control-01 192.168.17.134 node2.example.com. node2.example.com compute-01 192.168.17.135 node3.example.com. node3.example.com compute-02
2. 部署puppet agent從節點
2.1 安裝相關軟件包
對於puppet來說,只要是安裝了agent並註冊進了puppetmaster端的節點都是可以被部署配置的。本例中,我們的控制節點既是puppetmaster服務器端,同時也部署了puppetagent,即控制節點可以爲自己做自動化部署。
對於所有需要被管理的從節點,只需要安裝puppet的agent端軟件:
# apt-get install puppet augeas-tools
2.2 預先設置動態遷移環境
爲了能在配置好的openstack集羣中能使用動態遷移(LiveMigration)功能,我們需要預先在各節點中創建相關的用戶和組,使得虛擬機動態遷移能順利地進行,openstack在創建過程中會創建這些用戶和組,但是我們這裏直接指定用戶或組的ID,使得各節點保持一致。
創建相關組:
# addgroup --system --gid 999 kvm # addgroup --system --gid 998 libvirtd # addgroup --system --gid 997 nova
創建相關用戶:
# adduser --system --home /var/lib/libvirt --shell/bin/false --uid 999 --gid 999 --disabled-password libvirt-qemu # adduser --system --home/var/lib/libvirt/dnsmasq --shell /bin/false --uid 998 --gid 998--disabled-password libvirt-dnsmasq # adduser --system --home /var/lib/nova--shell /bin/false --uid 997 --gid 997 --disabled-passwordnova # adduser nova libvirtd
2.3 啓用pluginsync插件
我們需要在所有的agent節點上啓用pluginsync插件,並需要設置puppetmaster節點的hostname指向,使得節點間順利通信。
# augtool<< EOF set/files/etc/puppet/puppet.conf/agent/pluginsync true set/files/etc/puppet/puppet.conf/agent/server node1.example.com Save EOF
3. 部署puppet master控制節點
3.1 安裝相關軟件包
首先,需要安裝puppetmaster相關軟件包:
# apt-get install git # apt-get install puppetmaster sqlite3libsqlite3-ruby libactiverecord-ruby rake
接下來,使用gem工具安裝puppetlabs的幫助工具:
# gem install puppetlabs_spec_helper
3.2 配置數據庫
接下來,我們需要在master節點上開啓storedconfig功能,並配置puppet使用的數據庫類型,指向數據庫存儲位置。在這裏我們使用的是sqlite數據庫,所以我們將dbadapter設置爲sqlite3,並指向默認的sqlite文件所在路徑。
# augtool << EOF set/files/etc/puppet/puppet.conf/master/storeconfigs true set/files/etc/puppet/puppet.conf/master/dbadapter sqlite3 set/files/etc/puppet/puppet.conf/master/dblocation /var/lib/puppet/server_data/storeconfigs.sqlite save EOF
3.4 創建第一個manifest
接下來,我們創建一個用於測試的manifest,通過這個簡單的manifest我們可以初步瞭解一下puppet部署腳本的語法,最重要的是,我們可以測試master節點agent節點的配置是否正確無誤。
# vi /etc/puppet/manifests/site.pp node default { file{"/tmp/test.txt": mode => 600 } }
上面腳本內容是比較好理解的,表示我們需要部署/tmp/test.txt文件到所有的agent節點,並且該文件的權限設爲600。
3.5 重啓服務
接下來,我們需要重啓master節點上的服務,第一次啓動時puppet會自動創建所需的文件,包括一系列的證書文件等。
# /etc/init.d/puppetmaster restart
此時,我們可以在任意一個agent節點上使用命令行工具測試一下與master節點之間的通信是否正常。
# puppetd --test --server node1.example.com
我們會看在如下報錯信息:
Warning: peer certificate won't be verifiedin this SSL session Info: Caching certificate for ca ... Info: creating a new SSL certificaterequest for node1.example.com Info: certificate Request fingerprint(md5): S2:D1:E3:U8:C8:C9:B6:61:86:D0 ... Exiting: no certificate found andwaitforcet is disabled
通過以上的報錯信息,我們可以知道是由於master節點和agent節點之間的通信不能獲得master節點簽發的證書,所以我們需要用以下命令在puppetmaster節點上籤發證書:
# puppetca sign -a
此時,會有如下的信息:
Notice: Signed certificate request fornode1.example.com Notice: Removing filePuppet::SSL::CertificateReguest node1.example.com at ...
根據以上的信息,可以知道已經認證成功。
此命令表示接受全部的認證請求,但是在大型的部署環境中不建議這樣的操作,我們可以使用puppetca--list命令查看所有需要認證的agent端,並根據需要簽發認證。
此時,master節點與agent節點已經認證成功了,以後的部署工作都不在需要簽發證書了,只需要master端發出指令就能在所有的agent節點上實施部署。
在master節點上執行以下命令:
# puppet agent -vt --waitforcert 60
此命令會向所有的agent節點推送部署信息,延時時間設置爲60秒,由於我們之前已經通過了認證,所以執行該命令就開始部署了。
查看/tmp/test.txt文件是否存在,內容是否一致,查看文件的權限是不是之前設置的600。
在開始部署openstack模塊之前,建議重啓一下puppetmaster節點,主要是因爲puppet自身的一些問題。
接下來,我們從Github上下載最新版本的puppetlabs-openstack模塊到/etc/puppet/modules/openstack目錄:
# cd /etc/puppet/modules # git clone git://github.com/puppetlabs/puppetlabs-openstackopenstack
注意:
git://github.com/puppetlabs/puppetlabs-openstack是puppetlabs針對openstack寫的部署模塊,由openstack社區及puppet進行維護,我們在下載之後需要做一些基本的改動,如節點IP,實例網絡,是否設置組件HA等。
修改完成後,進入openstack目錄,使用rake命令把openstack中所有的組件模塊加載進來。
# cd openstack # rake modules:clone
此時,我們的/etc/puppet/modules目錄應該有如下模塊:
# ls -al /etc/puppet/modules/ total 80 drwxr-xr-x 2 0 root root 4096Jun 19 11:55 . drwxr-xr-x 6 root root 4096 Jun 19 11:46 .. drwxr-xr-x 7 root root 4096 Jun 19 11:55 apt drwxr-xr-x 7 root root 4096 Jun 19 11:54 concat drwxr-xr-x 5 root root 4096 Jun 19 11:55 git drwxr-xr-x 9 root root 4096 Jun 19 11:55 glance drwxr-xr-x 6 root root 4096 Jun 19 11:55 horizon drwxr-xr-x 9 root root 4096 Jun 19 11:55 keystone drwxr-xr-x 7 root root 4096 Jun 19 11:54 memcached drwxr-xr-x 9 root root 4096 Jun 19 11:55 mysql drwxr-xr-x 1 1 root root 4096Jun 19 11:55 nova drwxr-xr-x 7 root root 4096 Jun 19 11:54 openstack drwxr-xr-x 9 root root 4096 Jun 19 11:55 rabbitmq drwxr-xr-x 8 root root 4096 Jun 19 11:55 rsync drwxr-xr-x 7 root root 4096 Jun 19 11:55 ssh drwxr-xr-x 7 root root 4096 Jun 19 11:55 stdlib drwxr-xr-x 1 0 root root 4096Jun 19 11:55 swift drwxr-xr-x 5 root root 4096 Jun 19 11:55 sysctl drwxr-xr-x 6 root root 4096 Jun 19 11:55 vcsrepo drwxr-xr-x 8 root root 4096 Jun 19 11:55 xinetd
接下來,我們將openstack的模塊加入到manifest中:
# rm -f /etc/puppet/manifests/site.pp # ln -s /etc/puppet/modules/openstack/examples/site.pp/etc/puppet/manifests/site.pp
至此,puppet的部署環境以及puppetlabs-openstack模塊都已經全部配置完成,接下來我們開始部署openstack控制節點,在我們本次測試的環境中,openstack控制節點部署在puppetmaster節點上,即master節點同時也是agent節點。
# puppet agent -vt --waitforcert 60 --certnameopenstack_controller
注意:
其中,“--certnameopenstack_controller”參數項指定的是本次部署的證書名,我們在master端可以查看簽發證書請求來查看是否通過認證。
我們需要在master端再開一個終端,簽發證書:
# puppetca sign -a
證書籤發之後就開始進行部署工作,我們需要等待一段時間,等部署完成後,我們就可以通過之前設置好的控制節點IP進入DashBoard查看詳情。
在控制節點部署完成之後,我們就開始部署運算節點,按照我們的架構設計,我們會在3臺主機上部署運算節點,即控制節點上也部署運算節點。
分別到各需要部署的節點主機上執行:
# puppet agent -vt --waitforcert 60--certname openstack_compute_node1 # puppet agent -vt --waitforcert 60--certname openstack_compute_node2 # puppet agent -vt --waitforcert 60--certname openstack_compute_node3 在puppetmaster端簽發證書: # puppetca sign -a
運算節點的部署相對會比較快,所以我們大概只需要等待5分鐘就能完成全部的部署工作。
在開始測試本次部署的openstack系統的正確性之前,我們需要配置一下客戶端機器的環境,這裏我們使用一臺Ubuntu系統的PC客戶機。
安裝nova、glance、keystone等客戶端軟件包:
# apt-get install nova-common # apt-get install glance-common # apt-get install python-keystoneclient
以上的軟件安裝完成後,就需要我們配置一些用於認證的信息,即我們客戶端需要指定keystone併發送請求,得到keystone的認證之後才能查看openstack雲中的信息。
我們編輯客戶端用戶的.bashrc文件,指定所需的認證信息:
# vi .bashrc export SERVICE_ENDPOINT="http://123.58.xxx.xxx:35357/v2.0" export OS_AUTH_URL="http://123.58.xxx.xxx:5000/v2.0/" export OS_REGION_NAME=REGION01 export OS_TENANT_NAME=admin export SERVICE_TOKEN=admin export ADMIN_TOKEN=admin export OS_USERNAME=admin export OS_PASSWORD=admin
使用source命令使以上的環境變量生效:
# source .bashrc
配置完上面客戶端的認證信息之後,我們就可以在客戶端查看雲中的很多信息。下面我們使用nova-manage命令查看各組件的狀態:
# nova-manage service list
下面,我們在命令行下,爲“secgroup-test”安全策略組添加兩條策略,它們分別是開放用於ssh遠程連接的22號端口,以及開放icmp協議使得可以ping虛擬機實例。
接下來,我們在客戶端使用命令行工具導入鏡像文件,這裏我們導入的是OpenStack官方推薦的專用於測試的鏡像Cirros,鏡像格式爲qcow2。
導入完成之後,我們可以查看鏡像池中是否存在該鏡像。
# glance index
接下來,我們就可以利用前面導入的鏡像啓動一個虛擬機實例,首先,查看當前openstack實例的規格:
# nova flavor-list
下面使用nova命令行工具創建一個實例:
# nova boot --flavor 1 --image <image ID> --key_name 140key --security_group default cirros-cli-test
創建一個實例大概需要幾分鐘的時間,但是由於這個鏡像是測試鏡像,所以創建速度會非常地快,我們可以登錄Dashboard查看實例的啓動情況,也可以通過命令行查看實例。
# nova list
我們可以看到“Status”項,當實例創建完成後該項會顯示“Active”,即該實例可用。
6. 總結
根據以上的puppet部署測試,我們可以知道以此來實現openstack的自動化部署環境是非常實用且高效的。在京東商城的OpenStack自動化部署環境中,其利用了Cobler作爲系統部署的工具,並結合了puppet來實現從裸主機直接安裝系統並部署openstack服務。
這樣的自動化安裝部署的環境是值得我們借鑑的,在本次測試中,我們可以看到puppet在部署上的優勢,只要再結合KickStart或Cobler之類的系統部署工具,就能在一個私有云中快速地增加運算節點,真正地實現了雲的高速拓展,也減輕了運維人員的工作量,實現了自動化運維的目的。