【譯】OpenStack Heat基礎介紹

 

原文:http://blog.scottlowe.org/2014/05/01/an-introduction-to-openstack-heat/git

本文將簡要地介紹OpenStack Heat. Heat項目提供協做服務,容許咱們能夠自動地建立多個計算實例,邏輯網絡,以及對其餘的雲服務的操做。請注意,這只是一個簡要介紹—我不是Heat的專家,我只是想要分享一些基本信息以便讀者能夠更快的使用Heat.github

爲了在如下的具體的例子中不至於產生困擾,咱們先從術語開始。數據庫

  • Stack(棧): 在Heat領域,Stack是多個由Heat建立的對象或者資源的集合。它包含實例(虛擬機),網絡,子網,路由,端口,路由端口,安全組(Security Group),安全組規則,自動伸縮等。
  • Template(模板): Heat使用template的概念來定義一個Stack. 若是你想要一個由私有網鏈接的2個實例,那麼你的template須要包括2個實例,一個網絡,一個子網和2個網絡端口的定義。既然template是Heat工做的中心點,本文在後面將會展現一些例子。
  • Parameters(參數):Heat template有三個部分,而其中的一個就是要定義template的參數。參數包含一些基本信息,好比具體的鏡像ID,或者特定網絡ID。他們將由用戶輸入給template. 這種參數機制容許用戶建立一個通常的template,它可能潛在使用不一樣的具體資源。
  • Resources(資源):Resource就是由Heat建立或者修改的具體的資源。它是Heat template的第二個重要部分。
  • Output(輸出):Heat template的第三個和最後一個重要部分就是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。

之後這些介紹應該足以支持咱們下面的介紹。(OpenStack Heat文檔有一個優秀的術語介紹)json

從架構來看,Heat有一些重要的組件:api

Heat-api組件實現OpenStack自然支持的REST API。該組件經過把API請求經由AMQP傳送給Heat engine來處理API請求。安全

Heat-api-cfn組件提供兼容AWS CloudFormation的API,同時也會把API請求經過AMQP轉發給heat engine。服務器

Heat-engine組件提供Heat最主要的協做功能。網絡

全部這些組件一般安裝在OpenStack的控制節點上,該節點同時也是Nova, Glance,Neutron等其餘服務的API服務器。然而,據我所知,並無客觀要求必要安裝這些服務在同一個節點上。與其餘多數的OpenStack服務相似,Heat也使用後臺數據庫來維護狀態信息。架構

既然如今你已經對Heat的架構也有一個大概瞭解,讓咱們來看一個我在本身的OpenStack環境裏建立並測試過的一個Heat template的例子(在Ubuntu 12.04上運行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 rawheat-json-example.json hosted with ❤ by GitHub

下面咱們一塊兒快速地過一下這個template。

  • 首先,注意我指定該template的版本爲」AWSTemplateFormatVersion」。這邊有個讓我一開始感到困惑的事情是template格式(CFN和HOT)以及資源類型的之間的關係。事實證實,他們相互獨立。就像我在這裏所作,你能夠在一個CFN template裏使用HOT資源類型(例如OS::Neutron::Net)。顯然,若是你一旦使用HOT資源類型,你的template將不會跟AWS兼容。如我前面所指出的,CFN template一般使用JSON格式。Heat的確在CFN裏支持YAML,可是你須要犧牲AWS兼容性。
  • 你將會注意到個人template跳過參數的使用而直接到Resource(資源)部分。這麼作沒有任何問題,可是這也意味着直接把一些可變的參數的值(如邏輯路由器向上級聯的共享公共網和安全組(Security Group))直接寫到template裏。
  • Template格式限制某些句法。例如,你注意到例子中使用了」Resources」,「Type」,「Properties」。在其餘的一些格式中,這些關鍵字一般指定爲小寫字母。
  • 該template定義的第一個資源是邏輯網絡,類型爲OS::Neutron::Net。
  • 接下來的資源是子網(類型爲OS::Neutron::Subnet)。它經過使用內建函數Ref與以前所定義的邏輯網絡進行關聯。內建函數是template格式的另外一個關鍵。因此當你想引用一個CFN template裏的其餘對象時,你就能夠像我這樣使用內建函數Ref。它將改子網的network ID同以前所定義的邏輯網絡進行關聯。你應該也已經注意到子網資源(subnet)有不少個與之關聯的屬性:CIDR,DNS Name Server,DHCP,網關IP地址。
  • 第三個資源是邏輯路由器。
  • 緊隨邏輯路由器定義以後,該template經過一個OS::Neutron::RouterGateway類型的資源把邏輯路由器鏈接到已經建立好的邏輯網絡上。這裏列出的UUID是已經建立好的邏輯網絡的UUID。請注意又使用了Ref函數把改資源鏈接到邏輯路由器。
  • 接下來該template在邏輯路由器上建立2個interface,並使用2次Ref把路由器interface鏈接到邏輯路由器和以前建立的子網。這意味着咱們正在給制定子網上的路由器添加interface(並且該interface將使用Subnet裏的gateway_ip所定義的IP地址。
  • 而後該template建立了2個Neutron端口(Port),把它們鏈接到默認的安全組(security group)。請注意若是你再建立Neutron端口時不指定security group,它將沒有任何東西,並且沒有數據從該端口經過。
  • 最後,Heat template建立了2個實例(類型爲OS::Nova::Server),它使用了m1.xsmall的flavor和寫好的 Glance Image ID. 這些實例又一次經過Ref函數鏈接到以前建立的Neutron端口。

若是你想使用JSON,那麼我推薦你收藏一個JSON檢查的網站,好比jsonlint.com

一旦你定義好Heat template,你可使用這個template經過Heat CLI或者dashboard來建立一個stack. 下面是個人一個stack在dashboard上的截圖。

 

 

仍是不錯的吧?你以爲呢?我但願這個Heat介紹對你有所幫助。我確實有計劃想在最近介紹一個OpenStack Heat的其餘方面,因此保持聯繫。若是有任何問題,更正,或者澄清,請不吝賜教。

相關文章
相關標籤/搜索