Seit dem Icehouse Release von OpenStack ist die Orchestrierung mit Heat um einige Funktionen erweitert worden. CloudInit-Konfigurationsdaten lassen sich nun direkt im Heat-Template als Resource OS::Heat::CloudConfig einbetten. Im Beispiel Heat-Template werden beliebig viele CoreOS Instanzen gestartet, welche sich mittels CloudInit selbst beim angegebenem etcd Discovery Service bekannt machen.

Der etcd kann von der Anwendung auf den Instanzen für den Austausch von Key/Value Paaren genutzt werden. So können sich die Instanzen nach der Initierung z.B. der Anwendung mit ihrer IP als Datenbanknode oder ähnl. anbieten.

CloudConfig als user_data verwenden

Mit dem Parameter user_data wird der Resource OS::Nova::Server ein Identifier für die OS::Heat::CloudConfig Resource übergeben:

...
user_data_format: RAW
user_data:
  get_resource: coreosInit
...

Der Identifier coreosInit wurde zuvor für die CloudConfig Resource bestimmt:

...
coreosInit:
  type: OS::Heat::CloudConfig
  properties:
    cloud_config:
...

Als Parameter für cloud_config können dann die CloudInit-Parameter ebenfalls im YML-Format angegeben werden. Die gesamte Resource coreosInit sieht wie folgt aus:

...
resources:
  coreosInit:
    type: OS::Heat::CloudConfig
    properties:
      cloud_config:
        coreos:
          etcd:
            discovery: {get_param: discovery}
            addr: $private_ipv4:4001
            peer-addr: $private_ipv4:7001
          units:
            - name: etcd.service
              command: start
            - name: fleet.service
              command: start
...

Automatisierung der discovery-Parameter Abfrage

Wie im obigen Auszug zu sehen muss der Parameter discovery als Benutzereingabe (get_param) beim Launch des Stacks übergeben werden. Aktuell ist es leider nicht möglich dies allein mit Heat vollständig zu automatisieren.

Der Wert für den discovery-Parameter ist eine URL mit einem unique Key, welche vom etcd über die URL https://discovery.etcd.io/new abgerufen werden kann. Über diese URL können sich später die Core OS Instanzen anmelden und miteinander bekannt machen. Um die Abfrage des discovery-Parameters bei der Erstellung des Stacks zu automatisieren müsste Heat erst die URL https://discovery.etcd.io/new aufrufen, den Rückgabewert speichern und diesen Wert anschließend im Template verwenden.

Mit einem Workaround ist eine Automatisierung jedoch bei Verwendung des Kommandozeilenclients möglich. In diesem Fall kann mit einem zusätzlichen Shellscript erst der discovery-Parameter abgerufen und anschließend für die Erstellung des Stacks im Aufruf des Kommandozeilenclients verwendet.

#!/bin/bash
etcdout=$(curl https://discovery.etcd.io/new)
echo $etcdout

Die Variable $etcdout kann beim Aufruf des heat Kommandozeilenclients verwendet werden.

Heat Template für Core OS Instanzen

Das vollständige Beispieltemplate sieht wie folgt aus:

heat_template_version: 2013-05-23

description: Erstellt eine gewünschte Anzahl von Core OS Instanzen.

parameters:
  anzahl:
    description: Anzahl der CoreOS Instancen
    type: number
    default: 3
    constraints:
    - range:
        min: 3
        max: 12
      description: Mindestens 3 maximal 12 Instanzen möglich.
  key-name:
    type: string
    description: Name des Schlüsselpaars
  InstanceType:
    type: string
    description: Wählen Sie den Instanztyp aus.
    default: m1.medium
    constraints:
      - allowed_values: [m1.small, m1.medium,m1.large,m1.xlarge]
        description: Es stehen nur die Typen 'm1.small', 'm1.medium', 'm1.large' oder 'm1.xlarge' zur Verfügung.
  discovery:
    type: string
    description: |
      URL des Discovery von https://discovery.etcd.io/new

resources:
  coreosInit:
    type: OS::Heat::CloudConfig
    properties:
      cloud_config:
        coreos:
          etcd:
            discovery: {get_param: discovery}
            addr: $private_ipv4:4001
            peer-addr: $private_ipv4:7001
          units:
            - name: etcd.service
              command: start
            - name: fleet.service
              command: start

  coreosNodes:
    type: OS::Heat::ResourceGroup
    properties:
      count: {get_param: anzahl}
      resource_def:
        type: OS::Nova::Server
        properties:
          image: CoreOS
          flavor: {get_param: InstanceType}
          key_name: {get_param: key-name}
          config_drive: "true"
          user_data_format: RAW
          user_data:
            get_resource: coreosInit

zurück zur Übersicht