edit | blame | history | raw

HSAdmin über Skripte steuern {#kap-hsscript-skript}

In kap-hsadmin-syntax{.interpreted-text role="numref"} wurde die
Option -f{.interpreted-text role="option"} erwähnt, die gesetzt werden
kann, um HSAdmin eine Datei zu übergeben, in der sich die Befehle
befinden. Die Option ermöglicht es, ohne großen Aufwand Skriptdateien zu
pflegen, mit denen wiederkehrende Aufgaben bequem erledigt werden
können. Dieses Kapitel zeigt, wie Sie die Anlage einer neuen
Wordpress-Website mit Hilfe eines solchen Skripts vereinfachen können.

Bevor Sie die eigentliche Wordpress-Software installiert, müssen mehrere
Schritte auf der Hostsharing-Plattform erledigt sein.

  1. Es existiert ein Domain-Admin{.interpreted-text role="role"} bzw.
    es wird ein neuer Domain-Admin angelegt.
  2. Es wird eine Domain erstellt und dem Domain-Admin zugewiesen.
  3. Es wird ein Datenbank-Nutzer{.interpreted-text role="role"}
    angelegt.
  4. Es wird eine Datenbank angelegt und dem Datenbank-Nutzer zugewiesen.

Mit der folgenden Skript-Datei kann man diese vier Schritte mit einem
Befehl ausführen.

user.add ({set:{name:'xyz00-domains',comment:'Domain-Admin',password:'!1?2-3aBc',shell:'/bin/bash'}})
domain.add ({set:{name:'beispiel.de',user:'xyz00-domains'}})
mysqluser.add  ({set:{name:'xyz00_owner',password:'?2?3-4cVg'}})
mysqldb.add ({set:{name:'xyz00_abc',owner:'xyz00_owner'}})

In Zeile 1 wird der Domain-Admin erzeugt, in Zeile 2 die Domain
beispiel.de angelegt, in Zeile 3 der Datenbank-Nutzer und in Zeile 4
die Datenbank. Es ist möglich, die Datei lesbarer zu formatieren, indem
man jedem Key-Value-Paar eine eigene Zeile zuweist.

user.add ({set:{
name:'xyz00-domains',
comment:'Domain-Admin',
password:'!1?2-3aBc',
shell:'/bin/bash'
}})
domain.add ({set:{
name:'beispiel.de',
user:'xyz00-domains'
}})
mysqluser.add ({set:{
name:'xyz00_owner',
password:'?2?3-4cVg'
}})
mysqldb.add ({set:{
name:'xyz00_abc',
owner:'xyz00_owner'
}})

Wenn Sie die Datei unter dem Namen befehlsskript.txt{.interpreted-text
role="file"} im Verzeichnis des Paket-Admin{.interpreted-text
role="role"} speichern, können Sie alle Befehle mit einem HSAdmin-Aufruf
abarbeiten:

xyz00@h50:~$ hsscript -f befehlsskript.txt

Wenn Sie beispielsweise häufig Wordpress-Websites installieren, können
Sie für jede Website eine solche Befehlsdatei anlegen und unter einem
sinnvollen Namen (z.B. wordpress-beispiel_de.txt{.interpreted-text
role="file"}) abspeichern.

::: admonition
Beachten Sie die richtige Reihenfolge

Bei der Anlage von Benutzern, Datenbanken und Domains ist die im
Beispiel gezeigt Reihenfolge einzuhalten. Um eine Domain anzulegen, muss
der Domain-Admin bereits existieren. Eine Datenbank kann nur erzeugt
werden, wenn der Datenbank-Nutzer bereits angelegt ist.

Beim Löschen müssen Sie die Reihenfolge umkehren: Datenbank löschen,
Datenbank-Nutzer löschen, Domain löschen, Domain-Admin löschen.
:::

Noch bequemer ist es, die notwendigen Benutzer, Domains und Datenbanken
mit Hilfe eines ausführlicheren JS-Skripts oder über die Python-API
anzulegen.

HSAdmin mit Javascript ansprechen

Im Folgenden zeigen wir zwei JS-Skripts, die in der Regel im Verzeichnis
des Paket-Admin{.interpreted-text role="role"} mit dessen
Benutzerrechten aufgerufen werden. Mit dem ersten Skript erstellen wir
eine Domain und weisen ihr einen eigenen Domain-Admin zu, dessen Name
aus dem Namen der Domain abgeleitet wird. Mit dem zweiten Skript
erzeugen wir eine Datenbank und einen Datenbank-Nutzer, sodass wir unter
der gewünschten Domain zum Beispiel eine PHP-Anwendung wie Wordpress
einrichten können.

JS-Skript zur Anlage einer Domain

Ein Skript, um eine Domain mit einem gesonderten Domain-Admin anzulegen,
könnte so aussehen:

::: {.literalinclude linenos=""}
createdomainandadmin.js
:::

Die Funktion pwGen() erzeugt ein achtstelliges Passwort aus einer
Reihe von vorgegebenen Zeichen. Empfehlenswert sind längere Passworte.
Die Funktion createDomainAndDomainAdmin(args) erzeugt die Domain und
den Domain-Admin. Der Namen des Domain-Admin ergibt sich aus dem Namen
der Domain. Bei einer Domain, die einen Bindestrich enthält, muss dieser
durch einen Unterstrich ersetzt werden, da Benutzernamen nur einen
Bindestrich enthalten dürfen.

Das Skript wird im Benutzerverzeichnis des Paket-Admin gespeichert und
ausführbar gemacht:

xyz00@h50:~$ chmod u+x createdomainandadmin.js

Anschließend können Sie es folgendermaßen aufrufen:

xyz00@h50:~$ ./createdomainandadmin.js my-domain.de
created domain my-domain.de with domainadmin xyz00-my_domain.de and password slo%haY=

Wenn Sie alle Domains mit einem einzigen Domain-Admin verwalten, können
Sie den Benutzernamen des Domain-Admin hart kodieren. Zeile 18 lautet
dann:

::: {.literalinclude lines="18"}
createdomain.js
:::

JS-Skript zur Anlage einer Datenbank

Das Skript zur Anlage einer Datenbank und eines Datenbank-Nutzers sieht
ähnlich aus.

::: {.literalinclude linenos=""}
createuseranddb.js
:::

Die Funktion createMySQLUserAndDB(args) erzeugt den Datenbank-Nutzer
und die Datenbank. Da sich Datenbank und Datenbank-Nutzer nicht in die
Quere kommen, haben sie der Einfachheit halber den gleichen Namen.

Beim Aufruf des Skripts muss eine Zeichenkette übergeben werden, die
Bestandteil der Namen von Datenbank und Datenbank-Nutzer wird.

xyz00@h50:~$ ./createuseranddb.js my_domain_wordpress
created user and database xyz00_my_domain_wordpress with password 4fo=s3xY

::: attention
::: title
Attention
:::

Merken Sie sich die Passworte, da Sie diese später benötigen. Bei einer
Datenbank-Anwendungen müssen Sie bei der Konfiguration den
Datenbank-Benutzer und sein Passwort angeben.
:::

Nutzung der Python-API {#kap-python-api}

Sie können HSAdmin auch remote über die Python-API des Programms
ansprechen. Das ermöglicht es Ihnen von einem entfernten Rechner aus
HSAdmin zu bedienen. Um mit der Python-API zu arbeiten müssen Sie
zunächst die Python-Bindings für HSAdmin installieren.

Installation von hs.admin.api

Wir installieren die Python-Bindings in einer virtuellen
Python-Umgebung, sodass wir diese zunächst einrichten und aktivieren.

$ python3 -m venv /hsadmin
$ . /hsadmin/bin/activate

Anschließend klonen wir die Python-Bindings und installieren sie.

$ git clone https://dev.hostsharing.net//r/ansible/hs.admin.api.git
$ cd hs.admin.api
$ python setup.py install 

Nun steht uns das Modul mit dem Python-Bindings in der virtuellen
Umgebung zur Verfügung, sodass wir es in einem Skript importieren
können.

Python-Skript

Um die API in einem Skript nutzen zu können, müssen wir mit folgendem
Code ein API-Objekt erzeugen.

::: {.literalinclude linenos="" lines="1-9"}
createdomain.py
:::

Nun ist es möglich, mit der üblichen Syntax HSAdmin im Skript
anzusprechen.

Mit diesen beiden Befehlen legen wir beispielsweise einen Domain-Admin
und eine neue Domain an.

::: {.literalinclude lines="11-12"}
createdomain.py
:::

Eine Datenbank lässt sich folgendermaßen anlegen.

::: {.literalinclude lines="11-12"}
createuseranddb.py
:::

Nun wollen wir diese Befehle in ein Skript einbauen, das noch einige
andere nützliche Dinge für uns erledigt. Reseller und Webmaster, die
viele Anwendungen betreuen, buchen häufig mehrere Pakete bei
Hostsharing, sodass sie gerne ein Skript hätten, dem sie auch das Kürzel
für das Paket übergeben können, in dem sie eine Domain mit Datenbank
einrichten möchten. Außerdem wäre es hilfreich, wenn das Skript dafür
sorgt, dass Benutzernamen und Datenbankenname immer nach einem
einheitlichen Schema erzeugt werden, sodass die Orientierung leichter
fällt. In unserem Beispielskript übergeben wir daher dem Skript drei
Argumente:

  1. das Kürzel für das Paket
  2. den Domainnamen
  3. eine Projekt-ID

Die Projekt-ID darf nicht mehr als 10 Zeichen umfassen, da sie zusammen
mit dem fünfstelligen Paketkürzel in den Namen für Datenbank und
Datenbank-Nutzer verwendet wird. Diese dürfen aber nicht länger als 16
Zeichen sein. Als Schema für eine Projekt-ID kommt also beispielsweise
eine Kombination aus einer Kundennummer und einer Abkürzung in Frage.
Wir verwenden in unserem Beispiel dafür eine dreistellige Kundennummer
und die Abkürzung wp für Wordpress. Die Elemente trennen wir mit dem
Unterstrich, da nur dieser als Namensbestandteil erlaubt ist.

Wenn wir für den Kunden mit der Kundennummer 23 im Paket xyz00 eine
Domain für einen Wordpress-Blog einrichten möchten, lautet der Aufruf
des Skripts folgendermaßen:

$ python createall.py xyz00 hs-example.de 023_wp

Der Code des Skripts sieht so aus:

::: {.literalinclude linenos=""}
createall.py
:::

In den ersten fünf Zeilen importieren wir einige Module bzw. Funktionen,
die wir benötigen. In den Zeilen 7 bis 9 lesen wir die übergebenen
Argumente aus und speichern die Werte in entsprechenden Variablen.

Um das API-Objekt zu erzeugen, benötigen wir das Passwort für den
übergebenen Paket-Admin. Wir lesen in Zeile 11 das Passwort aus dem
verschlüsselten Passwort-Tresor des Kommandozeilenprogramms
pass{.interpreted-text role="command"} aus und speichern es in der
Variablen pw. Weitere Informationen zu dem Programm finden Sie auf der
Website https://www.passwordstore.org/. Sie können natürlich andere
Programme wählen, um ein Passwort aus einem Passwort-Tresor auszulesen.
Falls Sie nur ein Paket bei Hostsharing verwalten, können Sie das
Passwort auch direkt ins Skript eintragen. Aus Sicherheitsgründen
sollten Sie dies möglichst vermeiden.

Anschließend erzeugt das Skript das API-Objekt, wobei es als Credentials
den Namen des Paket-Admin und sein Passwort übergibt. Der Namen des
Paket-Admin ist identisch mit dem Paket, in dem die Domain angelegt
werden soll.

Danach wird ein Zufallsgenerator definiert, mit die Passworte erzeugt
werden, die später benötigt werden. In Zeile 27 und 28 werden die
Passworte für den Domain-Admin und den Datenbank-Nutzer erzeugt und in
Variablen gespeichert. Direkt anschließend erzeugt das Skript aus den
beim Aufruf übergebenen Werten die Namen für den Domain-Admin, den
Datenbank-Nutzer und die Datenbank.

In den Zeilen 33 bis 36 werden der Domain-Admin, die Domain, den
Datenbank-Nutzer und die Datenbank angelegt.

Und zum Schluss gibt das Skript alle Daten aus.

Idealerweise würde ein solches Skript die neuen Benutzernamen mit den
jeweiligen Passworten in den Passwort-Tresor eintragen, sodass dies
nicht mit der Hand erledigt werden muss.