Jan Ulrich Hasecke
2019-11-14 d80dd3dd28e2960b877f2157d20fc7d8cfe7ac46
commit | author | age
b4f134 1 .. _kap-hsscript-skript:
JUH 2
d80dd3 3 ============================
JUH 4 HSAdmin über Skripte steuern
5 ============================
b4f134 6
JUH 7 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.
8 Dies ermöglicht es uns, ohne großen Aufwand Skriptdateien zu pflegen, mit denen wir wiederkehrende Aufgaben bequem erledigen können.
9 In diesem Kapitel zeigen wir, wie Sie die Anlage einer neuen Wordpress-Website mit Hilfe eines solchen Skripts vereinfachen können.
10 Bevor man die Wordpress-Software installiert, müssen mehrere Schritte erledigt sein.
11
12 1. Es existiert ein :role:`Domain-Admin` bzw. es wird ein neuer Domain-Admin angelegt.
13 2. Es wird eine Domain erstellt und dem Domain-Admin zugewiesen.
14 3. Es wird ein :role:`Datenbank-Nutzer` angelegt.
15 4. Es wird eine Datenbank angelegt und dem Datenbank-Nutzer zugewiesen.
16
17 Mit der folgenden Skript-Datei kann diese vier Schritte mit einem Befehl ausführen.
18
19 .. code-block:: text
20    :linenos:
21
22    user.add ({set:{name:'xyz00-domains',comment:'Domain-Admin',password:'!1?2-3aBc',shell:'/bin/bash'}})
23    domain.add ({set:{name:'beispiel.de',user:'xyz00-domains'}})
24    mysqluser.add  ({set:{name:'xyz00_owner',password:'?2?3-4cVg'}})
25    mysqldb.add ({set:{name:'xyz00_abc',owner:'xyz00_owner'}})
26
27
28 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 29 Es ist möglich, die Datei lesbarer zu formatieren, indem man jedem Key-Value-Paar eine eigene Zeile zuweist.
b4f134 30
JUH 31 .. code-block:: text
32    :linenos:
33
34    user.add ({set:{
35    name:'xyz00-domains',
36    comment:'Domain-Admin',
37    password:'!1?2-3aBc',
38    shell:'/bin/bash'
39    }})
40    domain.add ({set:{
41    name:'beispiel.de',
42    user:'xyz00-domains'
43    }})
44    mysqluser.add ({set:{
45    name:'xyz00_owner',
46    password:'?2?3-4cVg'
47    }})
48    mysqldb.add ({set:{
49    name:'xyz00_abc',
50    owner:'xyz00_owner'
51    }})
52
53 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:
54
55 .. code-block:: console
56
57    xyz00@h50:~$ hsscript -f befehlsskript.txt
58    
59 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.
60
61 .. admonition:: Beachten Sie die richtige Reihenfolge
62
63    Bei der Anlage von Benutzern, Datenbanken und Domains ist die im Beispiel gezeigt Reihenfolge einzuhalten.
64    Um eine Domain anzulegen, muss der Domain-Admin bereits existieren.
65    Eine Datenbank kann nur erzeugt werden, wenn der Datenbank-Nutzer bereits angelegt ist.
66
67    Beim Löschen müssen Sie die Reihenfolge umkehren: Datenbank löschen, Datenbank-Nutzer löschen, Domain löschen, Domain-Admin löschen. 
f7e338 68    
d80dd3 69 Noch bequemer ist es, die notwendigen Benutzer, Domains und Datenbanken mit einem Skript anzulegen.
JUH 70 Sie können HSAdmin mit Javascript und über eine Python-API ansprechen.
71
72 HSAdmin mit Javascript ansprechen 
73 =================================
74
75 Im Folgenden zeigen wir zwei JS-Skripts, die in der Regel im Verzeichnis des :role:`Paket-Admin` mit dessen Benutzerrechten aufgerufen werden.
f7e338 76 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 77 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.
78
d80dd3 79 JS-Skript zur Anlage einer Domain
JUH 80 ---------------------------------
f7e338 81
JUH 82 Ein Skript, um eine Domain mit einem gesonderten Domain-Admin anzulegen, könnte so aussehen:
83
84 .. literalinclude:: createdomainandadmin.js
85    :linenos:
86
87 Die Funktion ``pwGen()`` erzeugt ein achtstelliges Passwort aus einer Reihe von vorgegebenen Zeichen.
88 Empfehlenswert sind längere Passworte.
89 Die Funktion ``createDomainAndDomainAdmin(args)`` erzeugt die Domain und den Domain-Admin.
90 Der Namen des Domain-Admin ergibt sich aus dem Namen der Domain.
91 Bei einer Domain, die einen Bindestrich enthält, muss dieser durch einen Unterstrich ersetzt werden, da Benutzernamen nur einen Bindestrich enthalten dürfen.
92
d80dd3 93 Loggen Sie sich als Paket-Admin ein und rufen Sie das Skript folgendermaßen auf:
f7e338 94
JUH 95 .. code-block:: console
96
97    xyz00@h50:~$ ./createdomainandadmin.js my-domain.de
98    created domain my-domain.de with domainadmin xyz00-my_domain.de and password slo%haY=
99
100 Wenn Sie alle Domains mit einem einzigen Domain-Admin verwalten, können Sie den Benutzernamen des Domain-Admin hart kodieren.
101 Zeile 18 lautet dann:
102
103 .. literalinclude:: createdomain.js
104    :lines: 18
105
d80dd3 106 JS-Skript zur Anlage einer Datenbank
JUH 107 ------------------------------------
f7e338 108
JUH 109 Das Skript zur Anlage einer Datenbank und eines Datenbank-Nutzers sieht ähnlich aus.
110
111 .. literalinclude:: createuseranddb.js
112    :linenos:
113
114 Die Funktion ``createMySQLUserAndDB(args)`` erzeugt den Datenbank-Nutzer und die Datenbank.
115 Da sich Datenbank und Datenbank-Nutzer nicht in die Quere kommen, haben sie der Einfachheit halber den gleichen Namen.
116
117 Beim Aufruf des Skripts muss eine Zeichenkette übergeben werden, die Bestandteil der Namen von Datenbank und Datenbank-Nutzer wird.
118
119 .. code-block:: console
120
121    xyz00@h50:~$ ./createuseranddb.js my_domain_wordpress
122    created user and database xyz00_my_domain_wordpress with password 4fo=s3xY
123    
124 .. attention::
125
126    Merken Sie sich die Passworte, da Sie diese später benötigen.
d80dd3 127    Bei einer Datenbank-Anwendungen müssen Sie bei der Konfiguration den Datenbank-Benutzer und sein Passwort angeben.
JUH 128
129
130 Nutzung der Python-API
131 ======================
132
133 Sie können HSAdmin auch remote über die Python-API des Programms ansprechen.
134 Das ermöglicht es Ihnen von einem entfernten Rechner aus HSAdmin zu bedienen.
135 Um mit der Python-API zu arbeiten müssen Sie zunächst die Python-Bindings für HSAdmin installieren.
136
137 Installation von hs.admin.api
138 -----------------------------
139
140 Wir installieren die Python-Bindings in einer virtuellen Python-Umgebung, sodass wir diese zunächst einrichten und aktivieren.
141
142 .. code-block:: console
143
144    $ python3 -m venv /hsadmin
145    $ . /hsadmin/bin/activate
146
147 Anschließend klonen wir die Python-Bindings und installieren sie.
148
149 .. code-block:: console
150
151    $ git clone https://dev.hostsharing.net//r/ansible/hs.admin.api.git
152    $ cd hs.admin.api
153    $ python setup.py install 
154
155 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.
156
157 Python-Skript
158 -------------
159
160 Um die API in einem Skript nutzen zu können, müssen wir mit folgendem Code ein API-Objekt erzeugen.
161
162 .. literalinclude:: createdomain.py
163    :linenos:
164    :lines: 1-9
165
166
167 Nun ist es möglich, mit der üblichen Syntax HSAdmin im Skript anzusprechen.
168
169 Mit diesen beiden Befehlen legen wir beispielsweise einen Domain-Admin und eine neue Domain an.
170
171 .. literalinclude:: createdomain.py
172    :lines: 11-12
173
174 Eine Datenbank lässt sich folgendermaßen anlegen.
175
176 .. literalinclude:: createuseranddb.py
177    :lines: 11-12
178
179
180 Das vollständige Skript, mit dem man eine Domain mit Domain-Admin sowie eine Datenbank mit einem Datenbank-Nutzer erzeugt, sähe dann so aus:
181
182 .. literalinclude:: createall.py
183    :linenos: 
184
185 .. todo:: Skript läuft noch nicht.
186
187 Beim Aufruf des Skripts muss man nur noch den gewünschten Domainnamen übergeben:
188
189 .. code-block:: console
190
191    $ python createall.py meine-domain.de
192