Jan Ulrich Hasecke
2019-12-09 32f41635c14f53ce8dee4cd5222ae33c4e3ab6f6
commit | author | age
b4f134 1 .. _kap-hsscript-skript:
JUH 2
d80dd3 3 ============================
JUH 4 HSAdmin über Skripte steuern
5 ============================
b4f134 6
32f416 7 In :numref:`kap-hsadmin-syntax` wurde die Option :option:`-f` erwähnt, die gesetzt werden kann, um HSAdmin eine Datei zu übergeben, in der sich die Befehle befinden.
JUH 8 Die Option ermöglicht es, ohne großen Aufwand Skriptdateien zu pflegen, mit denen wiederkehrende Aufgaben bequem erledigt werden können.
9 Dieses Kapitel zeigt, wie Sie die Anlage einer neuen Wordpress-Website mit Hilfe eines solchen Skripts vereinfachen können.
222551 10
32f416 11 Bevor Sie die eigentliche Wordpress-Software installiert, müssen mehrere Schritte auf der Hostsharing-Plattform erledigt sein.
b4f134 12
JUH 13 1. Es existiert ein :role:`Domain-Admin` bzw. es wird ein neuer Domain-Admin angelegt.
14 2. Es wird eine Domain erstellt und dem Domain-Admin zugewiesen.
15 3. Es wird ein :role:`Datenbank-Nutzer` angelegt.
16 4. Es wird eine Datenbank angelegt und dem Datenbank-Nutzer zugewiesen.
17
222551 18 Mit der folgenden Skript-Datei kann man diese vier Schritte mit einem Befehl ausführen.
b4f134 19
JUH 20 .. code-block:: text
21    :linenos:
22
23    user.add ({set:{name:'xyz00-domains',comment:'Domain-Admin',password:'!1?2-3aBc',shell:'/bin/bash'}})
24    domain.add ({set:{name:'beispiel.de',user:'xyz00-domains'}})
25    mysqluser.add  ({set:{name:'xyz00_owner',password:'?2?3-4cVg'}})
26    mysqldb.add ({set:{name:'xyz00_abc',owner:'xyz00_owner'}})
27
28
29 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.
d80dd3 30 Es ist möglich, die Datei lesbarer zu formatieren, indem man jedem Key-Value-Paar eine eigene Zeile zuweist.
b4f134 31
JUH 32 .. code-block:: text
33    :linenos:
34
35    user.add ({set:{
36    name:'xyz00-domains',
37    comment:'Domain-Admin',
38    password:'!1?2-3aBc',
39    shell:'/bin/bash'
40    }})
41    domain.add ({set:{
42    name:'beispiel.de',
43    user:'xyz00-domains'
44    }})
45    mysqluser.add ({set:{
46    name:'xyz00_owner',
47    password:'?2?3-4cVg'
48    }})
49    mysqldb.add ({set:{
50    name:'xyz00_abc',
51    owner:'xyz00_owner'
52    }})
53
54 Wenn Sie die Datei unter dem Namen :file:`befehlsskript.txt` im Verzeichnis des :role:`Paket-Admin` speichern, können Sie alle Befehle mit einem HSAdmin-Aufruf abarbeiten:
55
56 .. code-block:: console
57
58    xyz00@h50:~$ hsscript -f befehlsskript.txt
59    
60 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. :file:`wordpress-beispiel_de.txt`) abspeichern.
61
62 .. admonition:: Beachten Sie die richtige Reihenfolge
63
64    Bei der Anlage von Benutzern, Datenbanken und Domains ist die im Beispiel gezeigt Reihenfolge einzuhalten.
65    Um eine Domain anzulegen, muss der Domain-Admin bereits existieren.
66    Eine Datenbank kann nur erzeugt werden, wenn der Datenbank-Nutzer bereits angelegt ist.
67
68    Beim Löschen müssen Sie die Reihenfolge umkehren: Datenbank löschen, Datenbank-Nutzer löschen, Domain löschen, Domain-Admin löschen. 
f7e338 69    
d80dd3 70 Noch bequemer ist es, die notwendigen Benutzer, Domains und Datenbanken mit einem Skript anzulegen.
222551 71
32f416 72 .. todo:: MOS: Ist hier statt Skript Programm gemeint? Weil oben wurde doch gerade bequeme Skripten erklärt. juh: evtl. dürfen wir die Datei oben nicht Skript nennen.
222551 73
d80dd3 74 Sie können HSAdmin mit Javascript und über eine Python-API ansprechen.
JUH 75
76 HSAdmin mit Javascript ansprechen 
77 =================================
78
79 Im Folgenden zeigen wir zwei JS-Skripts, die in der Regel im Verzeichnis des :role:`Paket-Admin` mit dessen Benutzerrechten aufgerufen werden.
f7e338 80 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.
JUH 81 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.
82
d80dd3 83 JS-Skript zur Anlage einer Domain
JUH 84 ---------------------------------
f7e338 85
JUH 86 Ein Skript, um eine Domain mit einem gesonderten Domain-Admin anzulegen, könnte so aussehen:
87
88 .. literalinclude:: createdomainandadmin.js
89    :linenos:
90
91 Die Funktion ``pwGen()`` erzeugt ein achtstelliges Passwort aus einer Reihe von vorgegebenen Zeichen.
92 Empfehlenswert sind längere Passworte.
93 Die Funktion ``createDomainAndDomainAdmin(args)`` erzeugt die Domain und den Domain-Admin.
94 Der Namen des Domain-Admin ergibt sich aus dem Namen der Domain.
95 Bei einer Domain, die einen Bindestrich enthält, muss dieser durch einen Unterstrich ersetzt werden, da Benutzernamen nur einen Bindestrich enthalten dürfen.
96
32f416 97 Das Skript wird im Benutzerverzeichnis des Paket-Admin gespeichert und ausführbar gemacht:
f7e338 98
32f416 99 .. code-block:: console
JUH 100
101    xyz00@h50:~$ chmodu+x createdomainandadmin.js
102
103 Anschließend können Sie es folgendermaßen aufrufen:
104    
f7e338 105 .. code-block:: console
JUH 106
107    xyz00@h50:~$ ./createdomainandadmin.js my-domain.de
108    created domain my-domain.de with domainadmin xyz00-my_domain.de and password slo%haY=
109
110 Wenn Sie alle Domains mit einem einzigen Domain-Admin verwalten, können Sie den Benutzernamen des Domain-Admin hart kodieren.
111 Zeile 18 lautet dann:
112
113 .. literalinclude:: createdomain.js
114    :lines: 18
115
d80dd3 116 JS-Skript zur Anlage einer Datenbank
JUH 117 ------------------------------------
f7e338 118
JUH 119 Das Skript zur Anlage einer Datenbank und eines Datenbank-Nutzers sieht ähnlich aus.
120
121 .. literalinclude:: createuseranddb.js
122    :linenos:
123
124 Die Funktion ``createMySQLUserAndDB(args)`` erzeugt den Datenbank-Nutzer und die Datenbank.
125 Da sich Datenbank und Datenbank-Nutzer nicht in die Quere kommen, haben sie der Einfachheit halber den gleichen Namen.
126
127 Beim Aufruf des Skripts muss eine Zeichenkette übergeben werden, die Bestandteil der Namen von Datenbank und Datenbank-Nutzer wird.
128
129 .. code-block:: console
130
131    xyz00@h50:~$ ./createuseranddb.js my_domain_wordpress
132    created user and database xyz00_my_domain_wordpress with password 4fo=s3xY
133    
134 .. attention::
135
136    Merken Sie sich die Passworte, da Sie diese später benötigen.
d80dd3 137    Bei einer Datenbank-Anwendungen müssen Sie bei der Konfiguration den Datenbank-Benutzer und sein Passwort angeben.
JUH 138
139
140 Nutzung der Python-API
141 ======================
142
143 Sie können HSAdmin auch remote über die Python-API des Programms ansprechen.
144 Das ermöglicht es Ihnen von einem entfernten Rechner aus HSAdmin zu bedienen.
145 Um mit der Python-API zu arbeiten müssen Sie zunächst die Python-Bindings für HSAdmin installieren.
146
147 Installation von hs.admin.api
148 -----------------------------
149
150 Wir installieren die Python-Bindings in einer virtuellen Python-Umgebung, sodass wir diese zunächst einrichten und aktivieren.
151
152 .. code-block:: console
153
154    $ python3 -m venv /hsadmin
155    $ . /hsadmin/bin/activate
156
157 Anschließend klonen wir die Python-Bindings und installieren sie.
158
159 .. code-block:: console
160
161    $ git clone https://dev.hostsharing.net//r/ansible/hs.admin.api.git
162    $ cd hs.admin.api
163    $ python setup.py install 
164
165 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.
166
167 Python-Skript
168 -------------
169
170 Um die API in einem Skript nutzen zu können, müssen wir mit folgendem Code ein API-Objekt erzeugen.
171
172 .. literalinclude:: createdomain.py
173    :linenos:
174    :lines: 1-9
175
176
177 Nun ist es möglich, mit der üblichen Syntax HSAdmin im Skript anzusprechen.
178
179 Mit diesen beiden Befehlen legen wir beispielsweise einen Domain-Admin und eine neue Domain an.
180
181 .. literalinclude:: createdomain.py
182    :lines: 11-12
183
184 Eine Datenbank lässt sich folgendermaßen anlegen.
185
186 .. literalinclude:: createuseranddb.py
187    :lines: 11-12
188
189
47bc28 190 Nun wollen wir diese Befehle in ein Skript einbauen, das noch einige andere nützliche Dinge für uns erledigt.
JUH 191 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.
192 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.
193 In unserem Beispielskript übergeben wir daher dem Skript drei Argumente:
194
195 1. das Kürzel für das Paket
196 2. den Domainnamen
197 3. eine Projekt-ID
198
199 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.
200 Als Schema für eine Projekt-ID kommt also beispielsweise eine Kombination aus einer Kundennummer und einer Abkürzung in Frage.
201 Wir verwenden in unserem Beispiel dafür eine dreistellige Kundennummer und die Abkürzung ``wp`` für Wordpress.
202 Die Elemente trennen wir mit dem Unterstrich, da nur dieser als Namensbestandteil erlaubt ist.
203
204 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:
205
206 .. code-block:: console
207
208    $ python createall.py xyz00 hs-example.de 023_wp
209
210 Der Code des Skripts sieht so aus:
d80dd3 211
JUH 212 .. literalinclude:: createall.py
213    :linenos: 
214
47bc28 215 In den ersten fünf Zeilen importieren wir einige Module bzw. Funktionen, die wir benötigen.
JUH 216 In den Zeilen 7 bis 9 lesen wir die übergebenen Argumente aus und speichern die Werte in entsprechenden Variablen.
d80dd3 217
47bc28 218 Um das API-Objekt zu erzeugen, benötigen wir das Passwort für den übergebenen Paket-Admin.
JUH 219 Wir lesen in Zeile 11 das Passwort aus dem verschlüsselten Passwort-Tresor des Kommandozeilenprogramms :command:`pass` aus und speichern es in der Variablen ``pw``.
32f416 220 Weitere Informationen zu dem Programm finden Sie auf der Website https://www.passwordstore.org/.
JUH 221 Sie können natürlich andere Programme wählen, um ein Passwort aus einem Passwort-Tresor auszulesen.
222 Falls Sie nur ein Paket bei Hostsharing verwalten, können Sie das Passwort auch direkt ins Skript eintragen.
223 Aus Sicherheitsgründen sollten Sie dies möglichst vermeiden.
d80dd3 224
32f416 225 Anschließend erzeugt das Skript das API-Objekt, wobei es als Credentials den Namen des Paket-Admin und sein Passwort übergibt.
JUH 226 Der Namen des Paket-Admin ist identisch mit dem Paket, in dem die Domain angelegt werden soll.
222551 227
32f416 228 Danach wird ein Zufallsgenerator definiert, mit die Passworte erzeugt werden, die später benötigt werden.
47bc28 229 In Zeile 27 und 28 werden die Passworte für den Domain-Admin und  den Datenbank-Nutzer erzeugt und in Variablen gespeichert.
32f416 230 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.
d80dd3 231
32f416 232 In den Zeilen 33 bis 36 werden der Domain-Admin, die Domain, den Datenbank-Nutzer und die Datenbank angelegt.
47bc28 233
32f416 234 Und zum Schluss gibt das Skript alle Daten aus.
47bc28 235
32f416 236 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.