OpenStack利用puppet構建自動化部署環境

wKioL1kWrjjhlGAgAABfa5Meq-Y607.jpg


0. 環境介紹

0.1 Puppet介紹

Puppet是一個基於Ruby,並使用GPLv2協議授權的開源軟件,是一個C/S架構的配置管理工具,在中央服務器上安裝puppet-server軟件包(被稱作Puppetmaster)。在需要管理的目標主機上安裝puppet客戶端軟件(被稱作PuppetClient)。

wKioL1kWrw3C8VllAAFMvbWP6KU733.jpg

當客戶端連接上Puppetmaster後,定義在Puppetmaster上的配置文件會被編譯,然後在客戶端上運行。每個客戶端默認每半個小時和服務器進行一次通信,確認配置信息的更新情況。如果有新的配置信息或者配置信息已經改變,配置將會被重新編譯併發布到各客戶端執行。也可以在服務器上主動觸發一個配置信息的更新,強制各客戶端進行配置。如果客戶端的配置信息被改變了,它可以從服務器獲得原始配置進行校正。

目前,puppet作爲企業運維自動化的重要工具被廣泛地應用,對於openstack來說,通過puppet來實現自動化部署及節點添加,將會大大提高運維效率。


0.2 系統架構說明

我們本次的puppet自動化部署實驗在虛擬機中進行,使用3臺虛擬機作爲openstack3個節點,具體架構如下:

wKioL1kWr3ix-KKAAAAwe1l9h-U530.png

如上圖,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,即需要被部署的機器。

wKioL1kWsHbBAP_GAAEtb0kJ288770.jpg

對於大型的商業應用來說,上面所示的架構顯然不能滿足企業對服務高可用的要求,所以企業往往會採用雙SVN服務器及雙puppet master的架構,下面是京東商城openstack自動化部署的架構圖:

wKioL1kWsKGTZBNHAAS1OG7aCXA686.png


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,即控制節點可以爲自己做自動化部署。

對於所有需要被管理的從節點,只需要安裝puppetagent端軟件:

# 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


4. 使用測試

4.1 測試連接master節點

此時,我們可以在任意一個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


4.2 master節點簽發證書

通過以上的報錯信息,我們可以知道是由於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端,並根據需要簽發認證。


4.3 部署測試

此時,master節點與agent節點已經認證成功了,以後的部署工作都不在需要簽發證書了,只需要master端發出指令就能在所有的agent節點上實施部署。

master節點上執行以下命令:

# puppet agent -vt --waitforcert 60

此命令會向所有的agent節點推送部署信息,延時時間設置爲60秒,由於我們之前已經通過了認證,所以執行該命令就開始部署了。

查看/tmp/test.txt文件是否存在,內容是否一致,查看文件的權限是不是之前設置的600


5. 部署多節點OpenStack

5.1 配置openstack部署環境

在開始部署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-openstackpuppetlabs針對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


5.2 部署openstack控制節點

至此,puppet的部署環境以及puppetlabs-openstack模塊都已經全部配置完成,接下來我們開始部署openstack控制節點,在我們本次測試的環境中,openstack控制節點部署在puppetmaster節點上,即master節點同時也是agent節點。

# puppet agent -vt --waitforcert 60 --certnameopenstack_controller

注意:

其中,“--certnameopenstack_controller”參數項指定的是本次部署的證書名,我們在master端可以查看簽發證書請求來查看是否通過認證。

我們需要在master端再開一個終端,簽發證書:

# puppetca sign -a

證書籤發之後就開始進行部署工作,我們需要等待一段時間,等部署完成後,我們就可以通過之前設置好的控制節點IP進入DashBoard查看詳情。


5.3 部署openstack運算節點

在控制節點部署完成之後,我們就開始部署運算節點,按照我們的架構設計,我們會在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分鐘就能完成全部的部署工作。


5.4 OpenStack使用測試

5.4.1 配置客戶端環境

在開始測試本次部署的openstack系統的正確性之前,我們需要配置一下客戶端機器的環境,這裏我們使用一臺Ubuntu系統的PC客戶機。

安裝novaglancekeystone等客戶端軟件包:

# 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


5.4.2 查看各組件狀態

配置完上面客戶端的認證信息之後,我們就可以在客戶端查看雲中的很多信息。下面我們使用nova-manage命令查看各組件的狀態:

# nova-manage service list

wKiom1kWtafzmAFGAAAfBFQGBzo073.png


5.4.3 創建安全策略組

下面,我們在命令行下,爲“secgroup-test”安全策略組添加兩條策略,它們分別是開放用於ssh遠程連接的22號端口,以及開放icmp協議使得可以ping虛擬機實例。

wKioL1kWtdngpm4MAAEgouJKZqo369.png

wKioL1kWtdrgKJJaAAEaAqM45nc665.png


5.4.4 導入鏡像

接下來,我們在客戶端使用命令行工具導入鏡像文件,這裏我們導入的是OpenStack官方推薦的專用於測試的鏡像Cirros,鏡像格式爲qcow2

wKioL1kWtfriMXYAAACpvB37RUE922.png

導入完成之後,我們可以查看鏡像池中是否存在該鏡像。

# glance index


5.4.5 啓動實例

接下來,我們就可以利用前面導入的鏡像啓動一個虛擬機實例,首先,查看當前openstack實例的規格:

# nova flavor-list

wKiom1kWtjTDJKYkAAFlyok6idU328.png

下面使用nova命令行工具創建一個實例:

# nova boot --flavor 1 --image <image ID> --key_name 140key --security_group default cirros-cli-test

wKiom1kWt6ejzYfuAAMPk-ejV_g151.png

創建一個實例大概需要幾分鐘的時間,但是由於這個鏡像是測試鏡像,所以創建速度會非常地快,我們可以登錄Dashboard查看實例的啓動情況,也可以通過命令行查看實例。

# nova list

wKioL1kWt9Gxg5Z6AAGlhVCb_B0188.png

我們可以看到“Status”項,當實例創建完成後該項會顯示“Active”,即該實例可用。


6. 總結

根據以上的puppet部署測試,我們可以知道以此來實現openstack的自動化部署環境是非常實用且高效的。在京東商城的OpenStack自動化部署環境中,其利用了Cobler作爲系統部署的工具,並結合了puppet來實現從裸主機直接安裝系統並部署openstack服務。

這樣的自動化安裝部署的環境是值得我們借鑑的,在本次測試中,我們可以看到puppet在部署上的優勢,只要再結合KickStartCobler之類的系統部署工具,就能在一個私有云中快速地增加運算節點,真正地實現了雲的高速拓展,也減輕了運維人員的工作量,實現了自動化運維的目的。



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