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