?
原文:http://blog.scottlowe.org/2014/05/01/an-introduction-to-openstack-heat/
本文將簡要地介紹OpenStack Heat. Heat項(xiàng)目提供協(xié)作服務(wù),允許我們可以自動地創(chuàng)建多個(gè)計(jì)算實(shí)例,邏輯網(wǎng)絡(luò),以及對其他的云服務(wù)的操作。請注意,這只是一個(gè)簡要介紹—我不是Heat的專家,我只是想要分享一些基本信息以便讀者可以更快的使用Heat.
為了在以下的具體的例子中不至于產(chǎn)生困擾,我們先從術(shù)語開始。
- Stack(棧): 在Heat領(lǐng)域,Stack是多個(gè)由Heat創(chuàng)建的對象或者資源的集合。它包含實(shí)例(虛擬機(jī)),網(wǎng)絡(luò),子網(wǎng),路由,端口,路由端口,安全組(Security Group),安全組規(guī)則,自動伸縮等。
- Template(模板): Heat使用template的概念來定義一個(gè)Stack. 如果你想要一個(gè)由私有網(wǎng)連接的2個(gè)實(shí)例,那么你的template需要包括2個(gè)實(shí)例,一個(gè)網(wǎng)絡(luò),一個(gè)子網(wǎng)和2個(gè)網(wǎng)絡(luò)端口的定義。既然template是Heat工作的中心點(diǎn),本文在后面將會展示一些例子。
- Parameters(參數(shù)):Heat template有三個(gè)部分,而其中的一個(gè)就是要定義template的參數(shù)。參數(shù)包含一些基本信息,比如具體的鏡像ID,或者特定網(wǎng)絡(luò)ID。他們將由用戶輸入給template. 這種參數(shù)機(jī)制允許用戶創(chuàng)建一個(gè)一般的template,它可能潛在使用不同的具體資源。
- Resources(資源):Resource就是由Heat創(chuàng)建或者修改的具體的資源。它是Heat template的第二個(gè)重要部分。
- Output(輸出):Heat template的第三個(gè)和最后一個(gè)重要部分就是Output(輸出)。它是通過OpenStack Dashboard或者Heat stack-list/stack-show命令來顯示給用戶。
- HOT: Heat Orchestration Template的縮寫,是Heat template使用的兩種格式的一種。HOT并不與AWS CloudFormation template格式兼容,只能被OpenStack使用。HOT格式的template,通常但不是必須使用YAML。
- CFN:AWS CloudFormation的縮寫,Heat支持的第二種格式。CFN格式的template通常使用JSON。
以后這些介紹應(yīng)該足以支持我們下面的介紹。(OpenStack Heat文檔有一個(gè)優(yōu)秀的術(shù)語介紹)
從架構(gòu)來看,Heat有一些重要的組件:
Heat-api組件實(shí)現(xiàn)OpenStack天然支持的REST API。該組件通過把API請求經(jīng)由AMQP傳送給Heat engine來處理API請求。
Heat-api-cfn組件提供兼容AWS CloudFormation的API,同時(shí)也會把API請求通過AMQP轉(zhuǎn)發(fā)給heat engine。
Heat-engine組件提供Heat最主要的協(xié)作功能。
所有這些組件通常安裝在OpenStack的控制節(jié)點(diǎn)上,該節(jié)點(diǎn)同時(shí)也是Nova, Glance,Neutron等其他服務(wù)的API服務(wù)器。然而,據(jù)我所知,并沒有客觀要求必要安裝這些服務(wù)在同一個(gè)節(jié)點(diǎn)上。與其他多數(shù)的OpenStack服務(wù)類似,Heat也使用后臺數(shù)據(jù)庫來維護(hù)狀態(tài)信息。
既然現(xiàn)在你已經(jīng)對Heat的架構(gòu)也有一個(gè)大概了解,讓我們來看一個(gè)我在自己的OpenStack環(huán)境里創(chuàng)建并測試過的一個(gè)Heat template的例子(在Ubuntu 12.04上運(yùn)行OpenStack Havana版本,使用KVM和VMware NSX)。下面是完整的template。
|
{ ? "AWSTemplateFormatVersion" : "2010-09-09", ? "Description" : "Sample Heat template that spins up multiple instances and a private network (JSON)", ? "Resources" : { ??? "heat_network_01" : { ????? "Type" : "OS::Neutron::Net", ????? "Properties" : { ??????? "name" : "heat-network-01" ????? } ??? }, ? ??? "heat_subnet_01" : { ????? "Type" : "OS::Neutron::Subnet", ????? "Properties" : { ??????? "name" : "heat-subnet-01", ??????? "cidr" : "10.10.10.0/24", ?????? ?"dns_nameservers" : ["172.16.1.11", "172.16.1.6"], ??????? "enable_dhcp" : "True", ??????? "gateway_ip" : "10.10.10.254", ??????? "network_id" : { "Ref" : "heat_network_01" } ????? } ??? }, ? ??? "heat_router_01" : { ????? "Type" : "OS::Neutron::Router", ????? "Properties" : { ??????? "admin_state_up" : "True", ??????? "name" : "heat-router-01" ????? } ??? }, ? ??? "heat_router_01_gw" : { ????? "Type" : "OS::Neutron::RouterGateway", ????? "Properties" : { ??????? "network_id" : "604146b3-2e0c-4399-826e-a18cbc18362b", ??????? "router_id" : { "Ref" : "heat_router_01" } ????? } ??? }, ? ??? "heat_router_int0" : { ????? "Type" : "OS::Neutron::RouterInterface", ????? "Properties" : { ??????? "router_id" : { "Ref" : "heat_router_01" }, ??????? "subnet_id" : { "Ref" : "heat_subnet_01" } ????? } ??? }, ? ??? "instance0_port0" : { ????? "Type" : "OS::Neutron::Port", ????? "Properties" : { ??????? "admin_state_up" : "True", ??????? "network_id" : { "Ref" : "heat_network_01" }, ??????? "security_groups" : ["b0ab35c3-63f0-48d2-8a6b-08364a026b9c"] ????? } ??? }, ? ??? "instance1_port0" : { ????? "Type" : "OS::Neutron::Port", ????? "Properties" : { ??????? "admin_state_up" : "True", ??????? "network_id" : { "Ref" : "heat_network_01" }, ???? ???"security_groups" : ["b0ab35c3-63f0-48d2-8a6b-08364a026b9c"] ????? } ??? }, ? ??? "instance0" : { ????? "Type" : "OS::Nova::Server", ????? "Properties" : { ??????? "name" : "heat-instance-01", ??????? "image" : "73669ac0-8677-498d-9d97-76af287bcf32", ? ??????"flavor": "m1.xsmall", ??????? "networks" : [{ ????????? "port" : { "Ref" : "instance0_port0" } ??????? }] ????? } ??? }, ? ??? "instance1" : { ????? "Type" : "OS::Nova::Server", ????? "Properties" : { ??????? "name" : "heat-instance-02", ??????? "image" : "73669ac0-8677-498d-9d97-76af287bcf32", ??????? "flavor": "m1.xsmall", ??????? "networks" : [{ ????????? "port" : { "Ref" : "instance1_port0" } ??????? }] ????? } ??? } ? } } |
view raw heat-json-example.json ?hosted with ? by? GitHub
下面我們一起快速地過一下這個(gè)template。
- 首先,注意我指定該template的版本為”AWSTemplateFormatVersion”。這邊有個(gè)讓我一開始感到困惑的事情是template格式(CFN和HOT)以及資源類型的之間的關(guān)系。事實(shí)證明,他們相互獨(dú)立。就像我在這里所做,你可以在一個(gè)CFN template里使用HOT資源類型(例如OS::Neutron::Net)。顯然,如果你一旦使用HOT資源類型,你的template將不會跟AWS兼容。如我前面所指出的,CFN template通常使用JSON格式。Heat的確在CFN里支持YAML,但是你需要犧牲AWS兼容性。
- 你將會注意到我的template跳過參數(shù)的使用而直接到Resource(資源)部分。這么做沒有任何問題,但是這也意味著直接把一些可變的參數(shù)的值(如邏輯路由器向上級聯(lián)的共享公共網(wǎng)和安全組(Security Group))直接寫到template里。
- Template格式限制某些句法。例如,你注意到例子中使用了”Resources”,“Type”,“Properties”。在其他的一些格式中,這些關(guān)鍵字通常指定為小寫字母。
- 該template定義的第一個(gè)資源是邏輯網(wǎng)絡(luò),類型為OS::Neutron::Net。
- 接下來的資源是子網(wǎng)(類型為OS::Neutron::Subnet)。它通過使用內(nèi)建函數(shù)Ref與之前所定義的邏輯網(wǎng)絡(luò)進(jìn)行關(guān)聯(lián)。內(nèi)建函數(shù)是template格式的另一個(gè)關(guān)鍵。所以當(dāng)你想引用一個(gè)CFN template里的其他對象時(shí),你就可以像我這樣使用內(nèi)建函數(shù)Ref。它將改子網(wǎng)的network ID同之前所定義的邏輯網(wǎng)絡(luò)進(jìn)行關(guān)聯(lián)。你應(yīng)該也已經(jīng)注意到子網(wǎng)資源(subnet)有很多個(gè)與之關(guān)聯(lián)的屬性:CIDR,DNS Name Server,DHCP,網(wǎng)關(guān)IP地址。
- 第三個(gè)資源是邏輯路由器。
- 緊隨邏輯路由器定義之后,該template通過一個(gè)OS::Neutron::RouterGateway類型的資源把邏輯路由器連接到已經(jīng)創(chuàng)建好的邏輯網(wǎng)絡(luò)上。這里列出的UUID是已經(jīng)創(chuàng)建好的邏輯網(wǎng)絡(luò)的UUID。請注意又使用了Ref函數(shù)把改資源連接到邏輯路由器。
- 接下來該template在邏輯路由器上創(chuàng)建2個(gè)interface,并使用2次Ref把路由器interface連接到邏輯路由器和之前創(chuàng)建的子網(wǎng)。這意味著我們正在給制定子網(wǎng)上的路由器添加interface(而且該interface將使用Subnet里的gateway_ip所定義的IP地址。
- 然后該template創(chuàng)建了2個(gè)Neutron端口(Port),把它們連接到默認(rèn)的安全組(security group)。請注意如果你再創(chuàng)建Neutron端口時(shí)不指定security group,它將沒有任何東西,而且沒有數(shù)據(jù)從該端口通過。
- 最后,Heat template創(chuàng)建了2個(gè)實(shí)例(類型為OS::Nova::Server),它使用了m1.xsmall的flavor和寫好的 Glance Image ID. 這些實(shí)例又一次通過Ref函數(shù)連接到之前創(chuàng)建的Neutron端口。
如果你想使用JSON,那么我推薦你收藏一個(gè)JSON檢查的網(wǎng)站,比如jsonlint.com
一旦你定義好Heat template,你可以使用這個(gè)template通過Heat CLI或者dashboard來創(chuàng)建一個(gè)stack. 下面是我的一個(gè)stack在dashboard上的截圖。
?
?
還是不錯的吧?你覺得呢?我希望這個(gè)Heat介紹對你有所幫助。我確實(shí)有計(jì)劃想在最近介紹一個(gè)OpenStack Heat的其他方面,所以保持聯(lián)系。如果有任何問題,更正,或者澄清,請不吝賜教。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

