使用結構定義

結構定義的用途是說明 Deployment Manager 範本的規格。如果範本存在結構定義,Deployment Manager 會使用該結構定義來強制實行使用者與對應範本互動的方式。結構定義會定義一組規則,設定檔必須符合這些規則,才能使用特定範本。

除了定義範本的規則外,結構定義也可讓使用者透過介面來連接您編寫的範本,而不必查看及瞭解範本的每一層。使用者只需查看結構定義中所定義的要求即可,無須瞭解各個範本能設定或需要哪些屬性。

舉例來說,您可以建立一個結構定義,其中對應的範本一律必須定義一組特定的必要屬性,而且每個屬性都必須具有自己的規格。某一個屬性必須是字串,而另一個則必須是小於 100 的整數,依此類推。如果使用者想要在其設定中套用您的範本,該使用者必須查看結構定義,並在設定中設定正確的屬性。

事前準備

結構定義範例

範例結構定義是為 Jinja 範本引擎編寫。如果您使用其他範本引擎,副檔名會有所不同,範本語法也可能不同。

以下是名為 vm-instance-with-network.jinja.schema 的簡單結構定義檔案:

info:
  title: VM Template
  author: Jane
  description: Creates a new network and instance
  version: 1.0

imports:
- path: vm-instance.jinja # Must be a relative path

required:
- IPv4Range

properties:
  IPv4Range:
    type: string
    description: Range of the network

  description:
    type: string
    default: "My super great network"
    description: Description of network

該結構定義適用於以下範本 (vm-instance-with-network.jinja):

resources:
- name: vm-1
  type: vm-instance.jinja

- name: a-new-network
  type: compute.v1.network
  properties:
    IPv4Range: {{ properties['IPv4Range'] }}
    description: {{ properties['description'] }}

如果使用者想要在自己的設定中使用此範本,透過查看結構定義即可瞭解必須定義一個必要屬性 (IPv4Range),以及一個可省略或包含的選用屬性 (description)。使用者接著能夠建立類似的設定檔,並確保提供名為 IPv4Range 的屬性:

imports:
- path: vm-instance-with-network.jinja

resources:
- name: vm-1
  type: vm-instance-with-network.jinja
  properties:
    IPv4Range: 10.0.0.1/16

結構定義的架構

以下是結構定義文件的範例。Deployment Manager 建議使用 YAML 格式的結構定義,但您也能以 JSON 編寫結構定義,Deployment Manager 也接受該格式。

Deployment Manager 接受根據 JSON 結構定義規格第 4 版草稿所編寫的結構定義。

<mongodb.py.schema>
info:
  title: MongoDB Template
  author: Jane
  description: Creates a MongoDB cluster
  version: 1.0

imports:
  - path: helper.py
    name: mongodb_helper.py

required:
  - name

properties:
  name:
    type: string
    description: Name of your Mongo Cluster

  size:
    type: integer
    default: 2
    description: Number of Mongo Slaves

  zone:
    type: string
    default: us-central1-a
    description: Zone to run
    metadata: gce-zone

有效的結構定義檔案是 JSON 結構定義檔案,並新增 infoimports 這兩個頂層欄位。以下是各個欄位及其有效內容的簡短說明。

資訊

info 屬性包含有關結構定義的中繼資訊,當中包含標題、版本編號和說明等資訊。

請至少在這項屬性中提供標題和說明。

imports

imports 欄位含有一份清單,當中列出使用此結構定義的範本所需的對應檔案。隨著範本上傳的結構定義具有匯入項目清單時,Deployment Manager 會檢查 imports 屬性中的所有檔案是否已經與範本一併上傳。

在這個 imports 欄位中指定檔案時,您可以從設定的 imports 欄位中省略該檔案。在上述範例中,imports 欄位會匯入名為 vm-instance.jinja 的檔案:

imports:
- path: vm-instance.jinja

在對應的設定檔中,使用者可以省略匯入 vm-instance.jinja 檔案的程序,因為當 Deployment Manager 檢查範本的結構定義時,該檔案將會自動匯入。

匯入路徑必須與結構定義檔案的位置相關。這樣可讓您將範本、結構定義和設定均儲存在同一個目錄中,並確保在共用或移動目錄時,這些檔案能具備有效的匯入項目。

必填

required 欄位包含一份清單,其中列出在使用結構定義的範本中必要屬性欄位的元素。未在這個 required 欄位中指定的任何元素皆視為選用元素。

屬性

properties 欄位包含此文件的 JSON 結構定義規則。範本的使用者可設定 properties 欄位中說明的元素。您可以針對這些屬性使用所有支援的 JSON 結構定義驗證,例如:

  • type (字串、布林、整數、數字等)
  • default
  • minimum / exclusiveMinimum / maximum / exclusiveMaximum
  • minLength / maxLength
  • pattern
  • not X / allOf X, Y / anyOf X, Y / oneOf X, Y

建議您至少提供欄位的 typedescription,以便使用者瞭解屬性可接受的值。如為選用屬性,最好也包含 default 值。

如需驗證關鍵字的清單,請參閱 JSON 結構定義驗證說明文件

設定任意中繼資料

根據預設,Deployment Manager 會忽略任何無效的 JSON 結構定義欄位。如需擴充結構定義來包含專用欄位或屬性,您可以任意建立需要的屬性並將其加入結構定義,只要該欄位或屬性不會與任何 JSON 結構定義驗證關鍵字重疊即可。

例如,您可以加入用來註解您其中一個屬性的中繼資料欄位:

properties:
  zone:
    type: string
    default: us-central1-a
    description: Zone to run
    metadata: a-special-property

或者,您也能建立可能會在 Deployment Manager 以外的其他應用程式中使用的特殊變數:

properties:
  size:
    type: integer
    default: 2
    description: Number of Mongo Slaves
    variable-x: ultra-secret-sauce

建立結構定義

結構定義是一個獨立文件,並以其說明的範本命名。結構定義必須使用與對應範本相同的名稱來命名,並且在結尾附加 .schema

TEMPLATE_NAME.EXTENSION.schema

舉例來說,如果範本名為 vm-instance.py,對應的結構定義檔案就必須命名為 vm-instance.py.schema。每個範本只能有一個結構定義。

結構定義可以包含結構定義的結構一節中說明的一或多個欄位。或者,您也可以使用 JSON 來編寫結構定義。如需 JSON 結構定義的範例,請參閱 JSON 結構定義說明文件。

使用結構定義

gcloud


使用 Google Cloud CLI 建立部署作業時,Deployment Manager 會自動為您上傳所有與設定相關的範本。 同樣地,如果存在任何結構定義檔案 (可由附加的 .schema 格式識別),Deployment Manager 在嘗試建立任何資源之前,會先上傳該結構定義並根據該結構定義來驗證部署作業。

如要使用結構定義,只要將其加入與範本和設定相同的本機目錄中,並像平常一樣建立部署作業即可。gcloud CLI 會偵測結構定義檔案,並將該檔案傳送至 Deployment Manager。

API


按照操作說明透過 API 建立部署作業,並包含內嵌在要求主體的結構定義檔案,方式與包含範本相同。

後續步驟