Erstellen von Skripts für Cloudaufgaben
- 12 Minuten
Das Konzept der Skripterstellung ist beinahe so alt wie Computer. Jahrzehntelang haben IT-Mitarbeiter mit Computern interagiert, indem sie Befehle in eine Konsole eingegeben haben. Bis zum heutigen Tag bevorzugen einige Benutzer eine Befehlszeilenschnittstelle (CLI) gegenüber einer grafischen Benutzeroberfläche (GUI). Die Skripterstellung ermöglicht es, ansonsten unabhängige Befehle in einer oder mehreren Textdateien („Skripts“) zusammenzuführen und als Gruppe auszuführen. Skriptsprachen wie Bash erlauben es Skripts, mehr zu tun als Befehlsfolgen blind auszuführen. Skripts können Anweisungen wie if und for enthalten, die Befehle bedingt oder wiederholt ausführen. Sie können Eingaben von Benutzern anfordern und symbolische Variablen enthalten.
Die einfachste Möglichkeit, Cloudbereitstellungen zu automatisieren, besteht darin, die für die Erstellung und Konfiguration einer Ressourcengruppe erforderlichen Befehle in einem Skript zusammenzufassen. Beliebte Cloudplattformen unterstützen Befehlszeilenschnittstellen (CLIs) und Cloudshells (in einem Browser ausgeführte CLIs), die Befehle bieten, die in diesen Skripts verwendet werden können. Azure bietet beispielsweise den Befehl az, während AWS den Befehl aws und Google den Befehl gcloud unterstützt.
Skriptsprachen
Eine Skriptsprache ist eine Programmiersprache, die zur Automatisierung der Ausführung von Aufgaben verwendet wird. Es gibt keinen Mangel an Skriptsprachen, aus denen Sie wählen können. Wikipedia listet fast 200 auf1. Nicht alle sind für Cloudplattformen geeignet. Aus Sicht eines Administrators, dessen Ziel es ist, Aktivitäten zu automatisieren, die Cloudressourcen betreffen, lassen sich Skriptsprachen im Allgemeinen in zwei Kategorien einteilen:
- Allgemeine Skriptsprachen, wie z. B. Bash und PowerShell
- Voll ausgestattete Programmiersprachen, wie z. B. Python, die auch für die Skripterstellung verwendet werden können
Allgemeine Skriptsprachen bieten Möglichkeiten der Verzweigung, Schleifenbildung und Entscheidungsfindung. Sie sind jedoch auf Betriebssystembefehle oder Befehle von Add-Ons wie Cloud-CLIs angewiesen, um den Großteil der Aufgaben zu erledigen. Bash bietet beispielsweise keine Befehle zum Erstellen von VMs in AWS oder Azure, kann aber CLI-Befehle dafür aufrufen. Und ein einzelnes Bash-Skript kann beliebig viele CLI-Befehle enthalten. Ein Befehl in einem Bash-Skript unterscheidet sich nicht von einem Befehl, den ein Administrator in die Befehlszeile eingibt.
Skripterstellung mit Bash
Bash, kurz für „Bourne-again shell“, gehört zu den weltweit beliebtesten Skriptsprachen. Sie ist für System- und Cloudadministratoren gleichermaßen ein unersetzliches Tool. Bash bietet native Unterstützung für Linux und macOS und ist auch für Windows verfügbar. Außerdem wird sie in Cloudshells wie Azure Cloud Shell unterstützt.
Das folgende Bash-Skript nutzt z. B. den Befehl az der Azure CLI, um eine Ressourcengruppe in Azure und eine Ubuntu-VM innerhalb der Ressourcengruppe zu erstellen:
az group create --name cmu-rg --location eastus
az vm create --resource-group cmu-rg \
--name cmu-vm --image Ubuntu2204 \
--admin-username cmu-admin \
--admin-password Micr0s0ft** \
--location eastus
PowerShell-Skripterstellung
Ein weiteres bei Cloudadministratoren beliebtes Tool zur Skripterstellung ist PowerShell. Microsoft hat PowerShell als die neueste Generation der Windows-Befehlszeile und auch als eine sicherere Alternative zum ursprünglich für Windows Server entwickelten Windows Script Host (WSH) entwickelt. Inzwischen ist PowerShell ein Open-Source-Projekt geworden und funktioniert unter Windows und Linux.
Anstatt mit Betriebssystembefehlen zu arbeiten, bietet PowerShell eigene Befehle und eine eigene Terminologie. Fast jeder PowerShell-Befehl bzw. jedes Cmdlet (ausgesprochen „Command-let“ und als ein kleines Programm für sich selbst definiert) ist ein englischsprachiges Verb, das mit einem Bindestrich an ein Objekt angefügt wird. Beispielsweise Get-Location, um den Inhalt des aktuellen Verzeichnisses aufzulisten, Copy-Item, um eine Datei zu kopieren und Start-Process, um ein Programm zu starten. Die Sprache PowerShell vermeidet die Verwendung undurchsichtiger Abkürzungen wie die von Linux sudo zugunsten von Menschen lesbarer, wenn auch mitunter etwas langer, Ausdrücke.
Was PowerShell einzigartig macht, ist die Tatsache, dass eine Sprache, die ursprünglich für die Verwendung mit einzelnen Computern und lokalen Netzwerken gedacht war, für die Arbeit mit Cloudplattformen weiterentwickelt wurde. Obwohl es möglich ist, einfach Azure CLI-Anweisungen in ein PowerShell-Skript einzufügen, bietet Microsoft ein Modul namens Azure PowerShell, das PowerShell mit Azure-spezifischen Cmdlets erweitert. Amazon bietet ein ähnliches Modul mit dem Namen AWS-Tools für PowerShell. Nachstehend finden Sie ein PowerShell-Skript, das dem obigen Bash-Skript entspricht:
$VMAdmin = "cmu-admin"
$VMPassword = ConvertTo-SecureString "Micr0s0ft**" -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential `
($VMAdmin, $VMPassword)
New-AzResourceGroup -Name cmu-rg -Location EastUS
New-AzVm -ResourceGroupName "cmu-rg" `
-Name "cmu-vm" `
-Location "East US" `
-image Ubuntu2204 `
-Credential $Cred
Python-Entwicklung
Administratoren können auch voll ausgestattete Programmiersprachen wie z. B. Python einsetzen, um Cloudressourcen zu erstellen und zu verwalten. Diese Sprachen bieten keine eigenen cloudspezifischen Funktionen, können aber Bibliotheken und Software Development Kits (SDKs) enthalten, die dies tun. Die meisten großen Cloud-Dienstanbieter bieten kostenlose SDKs in verschiedenen Sprachen als Schnittstelle zu ihren Plattformen. Microsoft bietet z. B. Azure SDKs für C#, Go, Java, Python, Node.js und andere verbreitete Programmiersprachen. Gleiches gilt für AWS. Auch ohne SDKs können Programmierer die REST-APIs der wichtigsten Cloudplattformen nutzen, um Clouddienste aufzurufen. SDKs und Bibliotheken machen das Schreiben solcher Programme wesentlich einfacher.
Als Beispiel bietet AWS ein Python SDK namens Boto, das Python-Funktionen enthält, die die AWS CLI-Anweisungen exakt widerspiegeln. Die Syntax dieser Methoden ist an den nativen Stil von Python angepasst. Das folgende Python-Skript verwendet Boto, um eine EC2-Instanz in der Region „East 1“ von Amazon zu erstellen:
import boto3
try:
ec2 = boto3.client('ec2', region_name='us-east-1')
key_pair = ec2.create_key_pair(KeyName='ec2-key-pair')
ec2.run_instances(
ImageId='ami-00b6a8a2bd28daf19',
InstanceType='t2.micro',
KeyName='ec2-key-pair',
Placement='AvailabilityZone=us-east-1d',
MinCount=1,
MaxCount=1)
except ClientError as e:
print(e)
Einer der Vorteile des Einsatzes einer Programmiersprache für die Skripterstellung ist die zuverlässige Unterstützung der Behandlung von Fehlern und ihrer Behebung. Der Nachteil ist allerdings, dass Sie Programmierer benötigen, die mit der jeweiligen Sprache vertraut sind und sich mit Cloudplattformen und Cloud SDKs auskennen.
Erweitern des Skripts
Die folgenden Bash-Befehle, die nacheinander in die Azure CLI oder Cloud Shell eingegeben werden, erstellen eine Ressourcengruppe in der Azure-Region „USA, Osten“ und eine Ubuntu-VM, die darin enthalten ist. Diese sind identisch mit den obigen az-Befehlen mit Ausnahme des Schalters --generate-ssh-keys, der für zusätzliche Sicherheit die Anmeldekennwörter durch Paare aus öffentlichen und privaten Schlüsseln ersetzt:
az group create --name cmu-rg --location eastus
az vm create --resource-group cmu-rg \
--name cmu-lamp-vm --image Ubuntu2204 \
--admin-username lamp-admin \
--generate-ssh-keys \
--location eastus
Nachdem die VM erstellt wurde, kann ein Administrator mit diesem Befehl über Secure Shell (SSH) eine sichere Verbindung mit ihr herstellen. Dabei ist „IP_ADDRESS“ die öffentliche IP-Adresse, die der VM zugewiesen und mit dem Befehl az vm create ausgegeben wird:
ssh lamp-admin@IP_ADDRESS
Innerhalb der SSH-Sitzung kann der Administrator mit den folgenden Befehlen einen LAMP-Stapel (Linux/Apache/MySQL/PHP) in der VM installieren und dann die SSH-Sitzung beenden:
sudo apt update
sudo apt install lamp-server^
exit
Das sind ganz schön viele Schritte, insbesondere, wenn Sie sie nicht nur einmal, sondern mehrmals ausführen müssen. Als Alternative zur manuellen Eingabe dieser Befehle kann ein Administrator ein Skript erstellen, indem er eine Textdatei namens ccvm.sh (kurz für „create and configure VM“ [VM erstellen und konfigurieren]) erstellt, die die Anweisungen in Abbildung 2 enthält.
Das Skript rezitiert nicht nur die Befehle, die ein Bediener in die Konsole eingeben würde. Beachten Sie den Aufruf des Befehls az vm show, um die öffentliche IP-Adresse der VM abzurufen und sie der Variablen mit dem Namen $IP_ADDRESS zuzuweisen, die Verwendung der Umleitung zu (<<), um Befehle in die SSH-Sitzung einzufügen, und das Hinzufügen von Befehlszeilenschaltern (z. B. -y in sudo apt -y install), um Bestätigungsaufforderungen zu unterdrücken, damit das Skript von Anfang bis Ende ohne menschliches Eingreifen ausgeführt werden kann:
az group create --name cmu-rg --location eastus
az vm create --resource-group cmu-rg \
--name cmu-lamp-vm --image Ubuntu2204 \
--admin-username lamp-admin \
--generate-ssh-keys
IP_ADDRESS=$(az vm show --show-details \
--resource-group cmu-rg --name cmu-lamp-vm \
--query publicIps -o tsv)
ssh -o 'StrictHostKeyChecking no' lamp-admin@$IP_ADDRESS << EOF
sudo apt update
sudo apt -y install lamp-server^
exit
EOF
Abbildung 2: Bash-Skript zum Erstellen einer Azure-VM und Installieren eines LAMP-Stapels
Mit diesem Skript kann ein Administrator mit einem einzigen Befehl eine VM erstellen und einen LAMP-Stapel installieren:
bash ccvm.sh
Der Vorteil dieses Ansatzes besteht darin, dass viele Befehle auf einen einzigen reduziert werden, wodurch die Möglichkeit menschlicher Fehler nahezu ausgeschlossen ist. Aber das Ganze ist alles andere als perfekt. Bei jeder Ausführung versucht das Skript, die gleiche VM und die gleiche Ressourcengruppe in der gleichen Azure-Region (USA, Osten) zu erstellen. Wenn das Ziel ist, schnell und einfach identische VMs in n verschiedenen Regionen erstellen zu können, muss das Skript intelligenter sein.
Wir können dies in den Griff bekommen, indem wir das Skript so ändern, dass es eine Variable enthält, die die Azure-Region angibt, und die Variable jedes Mal, wenn wir das Skript ausführen, so ändern, dass es auf eine andere Region abzielt. Alternativ könnten wir den Namen der Region in einer Umgebungsvariablen platzieren und auf diese im Skript verweisen, oder besser noch, den Namen der Region in einem Befehlszeilenparameter übergeben. Doch dann würden wir sofort auf andere Probleme stoßen, wie z. B. die Tatsache, dass sich zwei VMs oder zwei Ressourcengruppen mit gleichem Namen nicht in zwei verschiedenen Regionen erstellen lassen. Doch auch dies ist lösbar. Wir könnten zum Beispiel den Namen der Region an den Namen der VM und der Ressourcengruppe anfügen, um eindeutige Namen für jede Region zu generieren.
Herausforderungen bei der Verwendung von Skripts zum Automatisieren von Cloudressourcen
Der Punkt ist, dass das Erstellen von Skripts für Cloud CLI-Befehle einen gewissen Grad an Automatisierung bietet. Doch in der Praxis können Skripts schnell an Komplexität gewinnen und mehr zu einer Programmierung- als zu einer Verwaltungsübung werden. Es folgen vier Gründe, warum Skripterstellung allein keine ideale Lösung für die Automatisierung der Verwaltung von Cloudressourcen ist.
Komplexität
Skripts sind ausnahmslos komplexer als die entsprechenden Befehle, die in eine Konsole eingegeben werden. Dies liegt in erster Linie daran, dass sie alles erledigen müssen, was ein menschlicher Bediener erledigen würde, und dass sie jede Bedingung antizipieren müssen, auf die ein Mensch stoßen könnte. Darüber hinaus müssen Skripts parametrisiert werden, damit ein Skript beispielsweise dieselbe Lösung in verschiedenen Regionen bereitstellen kann, oder damit ein Administrator, der das Skript ausführt, Ressourcennamen angeben und deren Eindeutigkeit sicherstellen kann.
Idempotenz
Skripts benötigen zusätzliche Logik, wenn sie idempotent sein sollen, was bedeutet, dass bei wiederholter Ausführung desselben Skripts dasselbe Ergebnis geliefert wird. Was soll zum Beispiel geschehen, wenn ein Skript versucht, eine Ressourcengruppe zu erstellen, die bereits existiert? Skripts können (und sollten) so flexibel sein, dass sie solche Umstände berücksichtigen. Die Flexibilität geht jedoch auf Kosten von erhöhter Länge und Komplexität. Idempotenz ist eine wichtige Anforderung, wenn Skripts vorhandene Cloudressourcen aktualisieren und neue bereitstellen müssen.
Cloudspezifität
Das in Abbildung 2 gezeigte Skript muss stark modifiziert – ja sogar neu geschrieben – werden, um auf anderen Cloudplattformen wie AWS und GCP funktionieren zu können. Das Skript kann so geschrieben werden, dass es auf eine Weise für Azure, auf eine andere Weise für AWS und auf eine weitere Weise für GCP ausgeführt wird (vielleicht gesteuert durch eine Umgebungsvariable oder einen Befehlszeilenparameter), aber das Skript würde zwangsläufig komplexer werden.
Versionskontrolle
Skripts sind Programme und sollten ebenso wie Anwendungscode der Versionskontrolle unterliegen. Wie können Sie sonst wissen, wann und warum ein Skript geändert wurde, und zu einer früheren Version zurückkehren, wenn die aktuelle Version nicht funktioniert? Dies erhöht die administrative Komplexität und auch die Kosten.
Interaktion mit anderer Automatisierung
Eine zusätzliche Schwierigkeit besteht darin, dass der Nutzen solcher Skripts davon abhängt, wie gut sie ineinandergreifen und wie sie sich in einer Umgebung verhalten, in der sie gleichzeitig ausgeführt werden könnten. Wenn Skripts auf Ad-hoc-Basis geschrieben und ohne angemessene Planung und Vorausschau bereitgestellt werden (was oft der Fall ist), gibt es häufig weder Zeit noch Gelegenheit, sie in einer sicheren Umgebung zu testen, in der sie sich nicht auf bereits in der Produktionsumgebung eingesetzte Dienste auswirken. Dann wird deutlich, dass eine Koordination auf einer viel höheren Ebene erforderlich ist, die nicht nur die IT-Plattformen und die Infrastruktur, sondern auch die für deren Wartung und Verwaltung zuständigen Personen einbezieht.
Was also eigentlich eine Vereinfachung bringen soll, führt häufig zu mehr Komplexität. Die gute Nachricht ist, dass das noch nicht das Ende vom Lied ist. In der nächsten Lektion führen wir den Begriff einer Rechenzentrumsumgebung ein, in der die Koordination prinzipiell erfolgt und Infrastruktur auf Grundlage explizit definierter Anforderungen bereitgestellt und aktualisiert wird.
Literatur
- Wikipedia. Skriptsprachen https://en.wikipedia.org/wiki/Category:Scripting_languages.
Überprüfen Sie Ihr Wissen
Feedback
War diese Seite hilfreich?
No
Benötigen Sie Hilfe zu diesem Thema?
Möchten Sie versuchen, Ask Learn zu verwenden, um Sie durch dieses Thema zu klären oder zu leiten?