Einführung in die Server-Bereitstellung mit CloudInit

Diesen Monat gaben wir eine sehr spannende Partnerschaft mit Canonical, den Sponsoren von Ubuntu, bekannt. Ein Schlüsselelement bei dieser Partnerschaft ist die Einführung einer vollständigen CloudInit-Unterstützung zwischen der CloudSigma-Cloud und Ubuntu.

Einstieg in CloudInit

Falls Sie CloudInit nicht kennen – es ist der Industriestandard für Cloud-Server-Bootstrapping. Durch die Nutzung einer einfachen DSL wird es möglich, Arbeitsschritte beim ersten Hochfahren ganz einfach auszuführen. Es lohnt sich auch darauf hinzuweisen, dass CloudInit nicht auf Ubuntu begrenzt ist. Heutzutage werden Sie CloudInit-Support bei den meisten modernen Linux-Distributionen finden (die unterstützten Clouds werden jedoch variieren).

Bevor wir mit CloudInit starten ist es wichtig festzustellen, wo CloudInit ins Bereitstellungs-Ecosystem hineinpasst. Während es möglich ist, CloudInit als ein eigenständiges Bereitstellungssystem laufen zu lassen, wird es allerdings viel häufiger in Verbindung mit anderen Bereitstellungssystemen wie Ansible, Chef, Puppet oder Salt genutzt. In diesem Fall würden Sie einfach CloudInit dazu nutzen, um Ihren neuen Server auf einen aktuellen Status zu bringen, von wo er das Bereitstellungssystem übernehmen kann. Ich persönlich nutze häufig CloudInit in Verbindung mit Ansible.

CloudInit auf CloudSigma

CloudInit auf CloudSigma zu nutzen ist sehr einfach.

Damit Sie CloudInit auf einem Ubuntu 14.04-Server nutzen können, führen Sie die folgenden Schritte aus:

  • Klonen Sie das Laufwerk „Ubuntu 14.04 Cloud Image“ vom Marktplatz (es ist aktuell das einzige komplett unterstützte Laufwerk mit CloudInit). Stellen Sie sicher, dass Sie das geklonte Laufwerk skalieren und es wird automatisch das Dateisystem beim ersten Hochfahren vergrößern.
  • Erstellen sie einen neuen Server.
  • Beim erstellten Server werden Sie unter dem Server-Status einen CloudInit-Button sehen.
  • CloudInit

  • Wenn Sie auf diesen Button klicken, wird der folgende Dialog erscheinen:
  • CloudInit_activate

  • Fügen Sie einfach Ihre CloudInit-Daten ein und klicken Sie ‘Aktivieren’ an.
  • Sie können Ihren Server starten und das Skript wird beim ersten Hochfahren laufen.

Installation von SSH-Schlüsseln mit CloudInit

Jetzt, wenn Sie wissen, wie Sie CloudInit auf unserer Cloud nutzen können, setzen wir dieses neuentdeckte Wissen ein, um zwei SSH-Schlüssel zu installieren. Die zwei funktionellen Public-SSH-Schlüssel, die wir nutzen werden, sind ‘‘ssh-rsa AAA[…] user1@host‚ und ‚ssh-rsa AAA[…] user2@host‚. (Um mehr über SSH-Schlüssel-Generierung zu erfahren, bitte schauen Sie sich diese Seite auf Github an.)

Auf Ubuntu Cloud-Images, der vorgegebene Benutzername ist ‘ubuntu’. Daher werden die Schlüssel in diesen Account installiert.

Die CloudInit-Konfigurierung dafür würde folgendermaßen aussehen:
[ruby] #cloud-config
ssh_authorized_keys:
– ssh-rsa AAA[…] user1@host
– ssh-rsa AAA[…] user2@host
[/ruby]

Bitte beachten Sie, dass Leerzeichen von Bedeutung sind. Es gibt zwei Leerzeichen vor dem ‘-‘. Falls Sie nur eins setzen, es könnte vom Server nicht gelesen werden.

Einmal Sie die CloudInit-Konfigurierung gespeichert und den Server gebootet haben, sollten Sie in der Lage sein, in den Server mit einem SSH-Schlüssel einzuloggen, indem Sie den ‘ubuntu’-User nutzen:

[bash light=“true“] $ ssh ubuntu@aaa.bbb.ccc.ddd
Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-36-generic x86_64)

* Dokcmentation: https://help.ubuntu.com/

System information as of Sun Oct 19 21:51:54 UTC 2014

System load: 0.0 Users logged in: 0
Usage of /: 77.4% of 39.34GB IP address for eth0: aaa.bbb.ccc.ddd
Memory usage: 26%
Swap usage: 0%
Processes: 113

Graph this data and manage this system at:
https://landscape.canonical.com/

Get cloud support with Ubuntu Advantage Cloud Guest:
http://www.ubuntu.com/business/services/cloud

0 packages can be updated.
0 updates are security updates.
[…] ubuntu@myserver:~$
[/bash]

Installation von System-Updates mit CloudInit

Was darüber hinaus sehr nutzbar und mit CloudInit zu erreichen ist, ist die System-Updates beim ersten Hochfahren laufen zu lassen. Obwohl wir unsere Festplatten-Images häufig aktualisieren lassen, ist es dennoch eine gute Idee, zusätzliche Vorsichtsmaßnahmen zu treffen, um sicherzustellen, dass Ihre Systeme up-to-date sind.

Um System-Updates beim ersten Hochfahren zu installieren, fügen Sie das Folgende hinzu:

[ruby] #cloud-config
apt_update: true
apt_upgrade: true
[/ruby]

Vielleicht bemerken Sie, dass es eine ähnliche Option gibt, unter dem Namen ‘package_update,’ was eine Distribution von neutralen alias für ‘apt_update’ auf Ubuntu darstellt.

Zudem wird ‘apt_update’ automatisch als true gesetzt, falls ‘packages’ (unten) gesetzt ist. Ich habe es jedoch oben beigefügt, um es expliziter zu machen.

Pakete mit CloudInit installieren

Ein fundamentaler Teil beim System-Bootstrapping ist es, imstande zu sein, Pakete beim Boot zu installieren. Glücklicherweise macht es CloudInit ebenfalls einfach. Alles, was wir machen brauchen, ist eine Liste von Pakete zu spezifizieren, die wir unter ‘packages’ installieren wollen. Zum Beispiel, falls wir ‘python-pip,’ ‘fail2ban’ und ‘vim’ installieren möchten, würde es folgendermaßen aussehen:

[ruby] #cloud-config
packages:
– python-pip
– fail2ban
– vim
[/ruby]

Bitte beachten Sie nochmal, dass Leerzeichen von Bedeutung sind. Es gibt zwei Leerzeichen vor dem ‘-‘.

Den Hostnamen durch CloudInit festlegen

Wenn Sie einen neuen Server erstellen, wollen Sie vielleicht auch den Hostnamen dafür festlegen.

[ruby] #cloud-config
hostname: mynode
fqdn: mynode.example.com
manage_etc_hosts: true
[/ruby]

Befehle beim ersten Hochfahren mit CloudInit laufen lassen

Angenommen Sie machen etwas Komplizierteres mit Ihren Servern, aller Wahrscheinlichkeit nach haben Sie manchen Befehl, welchen Sie beim ersten Hochfahren laufen lassen wollen.

Hier kommen ‘runcmd’ und ‘bootcmd’ ins Spiel. Beide ermöglichen, dass Sie Befehle beim ersten Hochfahren laufen lassen. Der Unterschied ist, dass ‘bootcmd’ früher im Boot-Prozess ausführt als ‘runcmd.’

Um eine der beiden Befehle zu nutzen, fügen Sie zu Ihrem CloudInit das Folgende hinzu:

[ruby] #cloud-config
runcmd:
– ls -l /root
– [ wget, "https://news.ycombinator.com", -O, /tmp/index.html ] [/ruby]

Nutzung von CloudInit mit einem Konfigurierungs-Manager

Schließlich, falls Sie ein verfeinerter Cloud-User sind, nutzen Sie höchstwahrscheinlich einen Konfigurierungs-Manager. Glücklicherweise ist CloudInit darauf vorbereitet. Es ist jedoch ein ziemlich kompliziertes Thema, um es durchzunehmen, angesichts der mehreren Variablen.

Hier sind einige Beispiele, die Sie in der richtigen Richtung zeigen:

Die mehreren Elemente in Verbindung bringen

Für diejenigen, die mit YAML-Stil-Dateien nicht vertraut sind, könnte es nicht offensichtlich sein, wie Sie mehreren CloudInit-Elemente miteinander verknüpfen. Es ist jedoch unkompliziert. In der ersten Zeile brauchen Sie ‚#cloud-config‚. Danach, fügen Sie einfach Ihre Konfigurierung hinzu.

Zum Beispiel, die Kombination aller der oben genannten Beispiele in einer Konfigurierung würde folgendermaßen aussehen:

[ruby] #cloud-config
ssh_authorized_keys:
– ssh-rsa AAA[…] user1@host
– ssh-rsa AAA[…] user2@host
hostname: mynode
fqdn: mynode.example.com
manage_etc_hosts: true
apt_update: true
apt_upgrade: true
packages:
– python-pip
– fail2ban
– vim
runcmd:
– ls -l /root
– [ wget, "https://news.ycombinator.com", -O, /tmp/index.html ] [/ruby]

Zusätzliche Ressourcen

In diesem Artikel bleiben wir tatsächlich nur an der Oberfläche davon, wozu CloudInit imstande ist. Es gibt eine Tonne anderer Sachen, die Sie ausführen können, wie User und Gruppen anlegen, Dateien auf Disk brennen und URLs beim Abschluss aufrufen (um andere Systeme darüber zu benachrichtigen).

Falls Sie mehr über CloudInit erfahren möchten, empfehle ich die folgenden Quellen:

About Viktor Petersson

Former VP of Business Development at CloudSigma. Currently CEO at WireLoad and busy making a dent in the Digital Signage industry with Screenly. Viktor is a proud geek and loves playing with the latest technologies.