Das verwendete Python-Script verwendet **Terraform** und **Python3** für die Provisionierung.
-Weiterhin empfehle ich auch grundsätzlich die Verwendung von _Python virtualenv_ zur Ausführung,
+Weiterhin empfehle ich auch dringend die Verwendung von _Python virtualenv_ zur Ausführung,
da damit relativ einfach zusätzlich weiter Python-Module installiert und isoliert von anderen
Benutzern und Prozessen ausgeführt werden können.
aber wenn andere Nutzer mit Root-Rechten auf der Kiste angemeldet sind, können sie diese trotzdem lesen.
Das Gleiche trifft für die allgemeine Konfigurationsdatei zu, wenn man diese anlegt (siehe Punkt 1.4.).
-### 1.1. Betriebssystem-Pakete
+### 1.1. Auschecken des Repositories
-#### 1.1.1. Bei Debian-basierten Distributionen:
+Es werden drei Git-Repositories aus dem Pixelpark-Gitlab verwendet. Für die Anwender dieses
+Provisionierungstools ist erst einmal nur das Arbeits-Repository wichtig, welches man sich
+auf der eigenen Arbeitsstation klont. Die URL lautet:
+
+ git@git.pixelpark.com:ppadmin/terraform.git
+
+Grundsätzlich arbeiten wir immer in dem Workdir des Arbeits-Repositories. Die beiden anderen
+Repositories werden bei der Aktualisierung der Python-Virtuellen-Umgebung automatisch mit
+ausgecheckt (Siehe Punkt **1.4.**).
+
+**Hinweis:** Engedenk schlechter Erfahrungen weise ich darauf hin, auf einer Arbeitsstation
+zu arbeiten, mit der alle Netze erreicht werden können, da die Postinstall-Skripte per SCP
+auf die neu provisionierten Maschinen kopiert und dort per SSH ausgeführt werden.
+
+### 1.2. Betriebssystem-Pakete
+
+#### 1.2.1. Bei Debian-basierten Distributionen:
also zum Beispiel _Debian_, _Ubuntu_ usw.
* python3
* python3-virtualenv
-#### 1.1.2. Bei RPM-basierten Distributionen:
+#### 1.2.2. Bei RPM-basierten Distributionen:
also CentOS, Fedora, RHEL, OEL, SuSE usw.
* python36
* python-virtualenv (ist zwar für Python 2.7, dient aber als Wrapper für virtualenv mit Python 3.6)
-### 1.2. Installation Terraform
+### 1.3. Installation Terraform
Leider gibt es keine Terraform-Pakete. Man ist daher darauf angewiesen,
sich das Terrform-ZIP-Paket von folgender URL zu holen: https://www.terraform.io/downloads.html
Dort das ZIP-File für Linux 64 Bit downloaden, entpacken, und die herauspurzelnde Datei
ausführbar machen und irgendwo in den Pfad legen.
-### 1.3. Installion einer virtuellen Umgebung
+**Hinweis:** Da im Backend von Terraform die Versionsnummer von Terraform, mit dem der Plan
+aufgestellt wurde, hinterlassen wird, diese Backend geteilt ist (via Consul), und die Pläne nicht
+abwärtskompatibel sind, sollte Terraform immer auf dem aktuellen Stand gehalten werde,
+
+### 1.4. Installion einer virtuellen Umgebung
-Nach dem Auschecken dieses Repos sollte eine virtuelle Umgebung für Python3 eingerichtet werden.
+#### 1.4.1. Initiale Installation der virtuellen Umgebung
+
+Nach dem Auschecken dieses Repos muss eine virtuelle Umgebung für Python3 eingerichtet werden.
Um die Arbeit zu vereinfachen, habe ich im Wurzelverzeichnis das Skript **update-env.sh**
hingelegt, das alle notwendigen Schritte unternimmt, um die Arbeitsumgebung einzurichten
bzw. zu aktualisieren. Das sind folgende Dinge:
* Einrichten des Virtual Environments in `venv`, falls es noch nicht geschehen sein sollte,
-* Installieren und aktualisieren aller benötigten PIP-Module,
-* Aktualisieren des Git-Submodules unter **python_fb_tools**,
-* Kompilieren der i18n-Dateien (für die Herren, die des Englischen nicht ganz so mächtig sind).
+* Installieren und aktualisieren aller benötigten PIP-Module, einschließlich der
+ **python_fb_tools** (aus Gitlab heraus onstalliert),
+* Kompilieren der i18n-Dateien (für die Damen und Herren, die des Englischen nicht ganz so mächtig sind).
Das sieht beim ersten Mal so aus:
```
-frank.brehm@ns1-local ~/Develop/provisioning (test) > ./update-env.sh
-Preparing virtual environment ...
+frank.brehm@ns1-local ~/Work/terraform (test) > ./update-env.sh
+ * Searching for valid Python …
-Found python3.6.
+ * Found 'python3.6'.
+ * Searching for valid virtualenv …
+ * Found 'virtualenv'.
-Running virtualenv with interpreter /usr/bin/python3.6
-Using base prefix '/usr'
-New python executable in /home/frank.brehm/Develop/provisioning/venv/bin/python3.6
-Also creating executable in /home/frank.brehm/Develop/provisioning/venv/bin/python
-Installing setuptools, pip, wheel...done.
---------------------------------------------------
-Installing and/or upgrading necessary modules ...
+ * Preparing virtual environment …
-Cache entry deserialization failed, entry ignored
-Collecting pip (from -r requirements.txt (line 1))
- Using cached https://files.pythonhosted.org/packages/46/dc/7fd5df840efb3e56c8b4f768793a237ec4ee59891959d6a215d63f727023/pip-19.0.1-py2.py3-none-any.whl
-
-.
-.
-.
-
-Installing collected packages: pip, setuptools, pycparser, cffi, six, asn1crypto, cryptography, PyYAML, MarkupSafe, jinja2, pynacl, pyasn1, bcrypt, paramiko, ansible, pytz, babel, chardet, idna, certifi, urllib3, requests, pyvmomi, dnspython, pyflakes, pycodestyle, mccabe, entrypoints, flake8, websocket-client, docker-pycreds, docker-py, pathlib
- Found existing installation: pip 9.0.1
- Uninstalling pip-9.0.1:
- Successfully uninstalled pip-9.0.1
- Found existing installation: setuptools 28.8.0
- Uninstalling setuptools-28.8.0:
- Successfully uninstalled setuptools-28.8.0
-Successfully installed MarkupSafe-1.1.0 PyYAML-3.13 ansible-2.7.6 asn1crypto-0.24.0 babel-2.6.0 bcrypt-3.1.6 certifi-2018.11.29 cffi-1.11.5 chardet-3.0.4 cryptography-2.5 dnspython-1.16.0 docker-py-1.10.6 docker-pycreds-0.4.0 entrypoints-0.3 flake8-3.7.3 idna-2.8 jinja2-2.10 mccabe-0.6.1 paramiko-2.4.2 pathlib-1.0.1 pip-19.0.1 pyasn1-0.4.5 pycodestyle-2.5.0 pycparser-2.19 pyflakes-2.1.0 pynacl-1.3.0 pytz-2018.9 pyvmomi-6.7.1.2018.12 requests-2.21.0 setuptools-40.7.1 six-1.12.0 urllib3-1.24.1 websocket-client-0.54.0
+Running virtualenv with interpreter /usr/bin/python3.6
+Using base prefix '/usr'
+New python executable in /home/fbrehm/Work/terraform/venv/bin/python3.6
+Also creating executable in /home/fbrehm/Work/terraform/venv/bin/python
+Installing setuptools, pkg_resources, pip, wheel...done.
---------------------------------------------------
-Installed modules:
+ * Upgrading PIP …
-Package Version
----------------- -------------
-ansible 2.7.6
-asn1crypto 0.24.0
-Babel 2.6.0
-.
-.
-.
-wheel 0.29.0
+Requirement already up-to-date: pip in ./venv/lib/python3.6/site-packages (19.3.1)
---------------------------------------------------
-Updating Git submodule python_fb_tools ...
-git init ...
-
+ * Upgrading setuptools + wheel + six …
---------------
-git update ...
+Requirement already up-to-date: setuptools in ./venv/lib/python3.6/site-packages (44.0.0)
+Requirement already up-to-date: wheel in ./venv/lib/python3.6/site-packages (0.33.6)
+Collecting six
+ Using cached https://files.pythonhosted.org/packages/65/26/32b8464df2a97e6dd1b656ed26b2c194606c16fe163c695a992b36c11cdf/six-1.13.0-py2.py3-none-any.whl
+Installing collected packages: six
+Successfully installed six-1.13.0
+---------------------------------------------------
+ * Installing and/or upgrading necessary modules …
+
+Collecting git+https://git.pixelpark.com/python/python_fb_tools.git@master (from -r requirements.txt (line 1))
+ Cloning https://git.pixelpark.com/python/python_fb_tools.git (to revision master) to /tmp/pip-req-build-e3j7xdeq
+ Running command git clone -q https://git.pixelpark.com/python/python_fb_tools.git /tmp/pip-req-build-e3j7xdeq
+Collecting git+ssh://****@git.pixelpark.com/ppadmin/create-terraform.git@master (from -r requirements.txt (line 2))
+ Cloning ssh://****@git.pixelpark.com/ppadmin/create-terraform.git (to revision master) to /tmp/pip-req-build-ae6iyodq
+ Running command git clone -q 'ssh://****@git.pixelpark.com/ppadmin/create-terraform.git' /tmp/pip-req-build-ae6iyodq
+Collecting requests
+ Using cached https://files.pythonhosted.org/packages/51/bd/23c926cd341ea6b7dd0b2a00aba99ae0f828be89d72b2190f27c11d4b7fb/requests-2.22.0-py2.py3-none-any.whl
+Collecting Babel
+ Using cached https://files.pythonhosted.org/packages/15/a1/522dccd23e5d2e47aed4b6a16795b8213e3272c7506e625f2425ad025a19/Babel-2.8.0-py2.py3-none-any.whl
+Processing /home/fbrehm/.cache/pip/wheels/54/b7/c7/2ada654ee54483c9329871665aaf4a6056c3ce36f29cf66e67/PyYAML-5.2-cp36-cp36m-linux_x86_64.whl
+Processing /home/fbrehm/.cache/pip/wheels/79/04/32/49efab8d7c4728408253a358c51b7eeaed8778b9c529422715/pyvmomi-6.7.3-py2.py3-none-any.whl
+Requirement already up-to-date: six in ./venv/lib/python3.6/site-packages (from create-terraform==1.4.5->-r requirements.txt (line 2)) (1.13.0)
+Collecting pytz
+ Using cached https://files.pythonhosted.org/packages/e7/f9/f0b53f88060247251bf481fa6ea62cd0d25bf1b11a87888e53ce5b7c8ad2/pytz-2019.3-py2.py3-none-any.whl
+Collecting dnspython
+ Using cached https://files.pythonhosted.org/packages/ec/d3/3aa0e7213ef72b8585747aa0e271a9523e713813b9a20177ebe1e939deb0/dnspython-1.16.0-py2.py3-none-any.whl
+Collecting certifi>=2017.4.17
+ Using cached https://files.pythonhosted.org/packages/b9/63/df50cac98ea0d5b006c55a399c3bf1db9da7b5a24de7890bc9cfd5dd9e99/certifi-2019.11.28-py2.py3-none-any.whl
+Collecting urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1
+ Using cached https://files.pythonhosted.org/packages/b4/40/a9837291310ee1ccc242ceb6ebfd9eb21539649f193a7c8c86ba15b98539/urllib3-1.25.7-py2.py3-none-any.whl
+Collecting idna<2.9,>=2.5
+ Using cached https://files.pythonhosted.org/packages/14/2c/cd551d81dbe15200be1cf41cd03869a46fe7226e7450af7a6545bfc474c9/idna-2.8-py2.py3-none-any.whl
+Collecting chardet<3.1.0,>=3.0.2
+ Using cached https://files.pythonhosted.org/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/chardet-3.0.4-py2.py3-none-any.whl
+Building wheels for collected packages: fb-tools, create-terraform
+ Building wheel for fb-tools (setup.py) ... done
+ Created wheel for fb-tools: filename=fb_tools-1.6.3-cp36-none-any.whl size=176047 sha256=f4ed06120c58121e97adce0a9965d2cb1cc8680a817577040397517c6c72673c
+ Stored in directory: /tmp/pip-ephem-wheel-cache-okkvs3lr/wheels/f8/76/fc/061af9e9c357147e9edcac185c3edb280f5366ddba4ce6ed5a
+ Building wheel for create-terraform (setup.py) ... done
+ Created wheel for create-terraform: filename=create_terraform-1.4.5-cp36-none-any.whl size=91977 sha256=1115a8cc682af20ce272191375b966fb88fd0a21bbe87551996393d4e7df17a0
+ Stored in directory: /tmp/pip-ephem-wheel-cache-okkvs3lr/wheels/d2/18/30/66c65b0882f4db9e8f159f049e7086a17e7a56bd3ea0c32cbb
+Successfully built fb-tools create-terraform
+Installing collected packages: certifi, urllib3, idna, chardet, requests, pytz, Babel, fb-tools, PyYAML, pyvmomi, dnspython, create-terraform
+Successfully installed Babel-2.8.0 PyYAML-5.2 certifi-2019.11.28 chardet-3.0.4 create-terraform-1.4.5 dnspython-1.16.0 fb-tools-1.6.3 idna-2.8 pytz-2019.3 pyvmomi-6.7.3 requests-2.22.0 urllib3-1.25.7
---------------
-Updating i18n files in /home/frank.brehm/Develop/provisioning ...
-
-340 of 340 messages (100%) translated in locale/de_DE/LC_MESSAGES/pp_provisioning.po
-compiling catalog locale/de_DE/LC_MESSAGES/pp_provisioning.po to locale/de_DE/LC_MESSAGES/pp_provisioning.mo
-12 of 340 messages (3%) translated in locale/en_US/LC_MESSAGES/pp_provisioning.po
-compiling catalog locale/en_US/LC_MESSAGES/pp_provisioning.po to locale/en_US/LC_MESSAGES/pp_provisioning.mo
-
---------------
-Updating i18n files in python_fb_tools ...
-
-253 of 253 messages (100%) translated in locale/de_DE/LC_MESSAGES/fb_tools.po
-compiling catalog locale/de_DE/LC_MESSAGES/fb_tools.po to locale/de_DE/LC_MESSAGES/fb_tools.mo
-4 of 253 messages (1%) translated in locale/en_US/LC_MESSAGES/fb_tools.po
-compiling catalog locale/en_US/LC_MESSAGES/fb_tools.po to locale/en_US/LC_MESSAGES/fb_tools.mo
+---------------------------------------------------
+ * Installed modules:
+
+Package Version
+---------------- ----------
+Babel 2.8.0
+certifi 2019.11.28
+chardet 3.0.4
+create-terraform 1.4.5
+dnspython 1.16.0
+fb-tools 1.6.3
+idna 2.8
+pip 19.3.1
+pkg-resources 0.0.0
+pytz 2019.3
+pyvmomi 6.7.3
+PyYAML 5.2
+requests 2.22.0
+setuptools 44.0.0
+six 1.13.0
+urllib3 1.25.7
+wheel 0.33.6
--------
-Fertig.
+---------------------------------------------------
+ * Fertig.
-frank.brehm@ns1-local ~/Develop/provisioning (test) >
+frank.brehm@ns1-local ~/Work/terraform (test) >
```
+#### 1.4.2. Update der virtuellen Umgebung
+
Der nächste Schrit ist grundsätzlich vor jeder Arbeitssitzung zu machen, um die virtuelle
Umgebung zu aktivieren:
```
-frank.brehm@ns1-local ~/Develop/provisioning (test) > . venv/bin/activate
-(venv) frank.brehm@ns1-local ~/Develop/provisioning (test) >
+frank.brehm@ns1-local ~/Work/terraform (test) > . venv/bin/activate
+frank.brehm@ns1-local ~/Work/terraform (test) >
```
Mindestens einmal nach der Einrichtung der virtuellen Umgebung, aber auch später regelmäßig sollte
danach die Umgebung mittels **update-env.sh** aktualisiert werden:
```
-(venv) frank.brehm@ns1-local ~/Develop/provisioning (test) > ./update-env.sh
+frank.brehm@ns1-local ~/Work/terraform (test) > ./update-env.sh
Preparing virtual environment ...
---------------------------------------------------
.
.
.
-(venv) frank.brehm@ns1-local ~/Develop/provisioning (test) >
+frank.brehm@ns1-local ~/Work/terraform (test) >
```
-### 1.4. Grundlegende Installation
+#### 1.4.3. Aktivieren virtuellen Umgebung
+
+Vor jeder Arbeit ist die virtualle Umgebung zu aktivieren:
+
+```
+frank@bruni ~/Develop/PP/terraform (master) > . venv/bin/activate
+(venv) frank@bruni ~/Develop/PP/terraform (master) >
+(venv) frank@bruni ~/Develop/PP/terraform (master) > which create-terraform
+/home/frank/Develop/PP/terraform/venv/bin/create-terraform
+(venv) frank@bruni ~/Develop/PP/terraform (master) >
+```
-Nach dem Clonen befindet sich im Arbeitzsverzeichnis unter _etc_ die Datei _'create-terraform.ini.default'_, welches
-nicht die allgemeine Konfigurationsdatei ist, sondern nur ein Muster dafür. Zwar ist das Anlegen der allgemeinen
-Konfigurationsdatei _'create-terraform.ini'_ unter _etc_ nicht unbedingt erforderlich, da für fast alle Konfigurations-Parameter
-sinnvolle Vorgabewerte definiert wurden, aber es gibt exakt drei Ausnahmen dazu, nämlich:
+Wie oben ersichtlich, befindet sich Befehl **create-terraform** nach der Aktivierung im
+Pfad für ausführbare Dateien.
+### 1.5. Grundlegende Konfiguration
+
+Nach dem Clonen und dem Update der Virtuellen Umgebung befindet sich im Arbeitzsverzeichnis unter _venv/etc_
+die Datei _'create-terraform.ini.default'_, welches nicht die allgemeine Konfigurationsdatei ist,
+sondern nur ein Muster dafür.
+
+Die eigentliche Konfigurationsdatei ist _'venv/etc/create-terraform.ini'_, welche nicht in Git
+eingecheckt ist, da sich darin Passwörter und API-Keys befinden müssen.
+
+Um diese Konfigurationsdatei initial zu erstellen, ist es am einfachsten, die Datei _'venv/etc/create-terraform.ini.default'_
+nach _'venv/etc/create-terraform.ini'_ zu kopieren und dort alle fehlenden Werte manuell nachzutragen.
+
+```
+venv) frank@bruni ~/Develop/PP/terraform (master) > ll venv/etc/
+insgesamt 4
+-rw-r--r-- 1 frank users 3291 Jan 3 15:13 create-terraform.ini.default
+(venv) frank@bruni ~/Develop/PP/terraform (master) >
+(venv) frank@bruni ~/Develop/PP/terraform (master) >
+(venv) frank@bruni ~/Develop/PP/terraform (master) > cp -vi venv/etc/create-terraform.ini.default venv/etc/create-terraform.ini
+'venv/etc/create-terraform.ini.default' -> 'venv/etc/create-terraform.ini'
+(venv) frank@bruni ~/Develop/PP/terraform (master) >
+(venv) frank@bruni ~/Develop/PP/terraform (master) > chmod 0600 venv/etc/create-terraform.ini
+(venv) frank@bruni ~/Develop/PP/terraform (master) >
+(venv) frank@bruni ~/Develop/PP/terraform (master) > vi venv/etc/create-terraform.ini
+(venv) frank@bruni ~/Develop/PP/terraform (master) >
+```
+
+Für fast alle Konfigurations-Parameter sind bereits sinnvolle Vorgabewerte definiert worden (welches auch die
+auskommentierten Einträge in der _create-terraform.ini.default_ sind). Aber es gibt Ausnahmen:
+
+* die Passwörter der Nutzer der verschiedenen VSPhere-Umgebungen. Als Vorgabe-Nutzername ist
+ _'Administrator@vsphere.local'_ vorkonfiguriert. Wenn man diesen verwenden möchte, muss also
+ dessen Passwort bei allen VSPhere-Umgebungen eingetragen werden. Falls man aus Paranoia-Gründen
+ einen anderen Nutzer nehmen möchte, dann halt dessen Namen und Passwort in allen Umgebungen eintragen.
+ Aufpassen - nicht jeder hat alle Rechte in VSPhere, um VMs zu provisionieren.
* das Passwort für den VSphere Nutzer (welcher übrigens per Default auf _'Administrator@vsphere.local'_ gesetzt ist),
* den Key für die globale PowerDNS-API und
* das root-Passwort für die installierten Kisten (wird derzeit nicht verwendet, ist aber für später vorgesehen).
-Wenn man die nachfolgend beschriebene Einrichung der _'etc/create-terraform.ini'_ nicht macht, wird man
-bei jeder Ausführung des Scripts nach dem Passwort des VSphere-Nutzers _'Administrator@vsphere.local'_
-und nach dem API-Key für PowerDNS gefragt. Da es _dringend empfohlen_ ist, sich mit einem personalisierten
-Account bei VSphere anzumelden (und die dauernden Fragen nach Passwort und Key natürlich nerven), hier
-kurz, wie man die _'etc/create-terraform.ini'_ einrichtet:
-
-```
-(venv) frank.brehm@ns1-local ~/Develop/provisioning (test) > cp -vi etc/create-terraform.ini.default etc/create-terraform.ini
-„etc/create-terraform.ini.default“ -> „etc/create-terraform.ini“
-(venv) frank.brehm@ns1-local ~/Develop/provisioning (test) >
-(venv) frank.brehm@ns1-local ~/Develop/provisioning (test) > chmod 0600 etc/create-terraform.ini
-(venv) frank.brehm@ns1-local ~/Develop/provisioning (test) >
-(venv) frank.brehm@ns1-local ~/Develop/provisioning (test) > ls -lA etc/
-insgesamt 8
--rw------- 1 frank.brehm pixel 1475 22. Jun 10:36 create-terraform.ini
--rw-r--r-- 1 frank.brehm pixel 1354 21. Jun 17:51 create-terraform.ini.default
-(venv) frank.brehm@ns1-local ~/Develop/provisioning (test) >
-(venv) frank.brehm@ns1-local ~/Develop/provisioning (test) > vi etc/create-terraform.ini
-(venv) frank.brehm@ns1-local ~/Develop/provisioning (test) >
-(venv) frank.brehm@ns1-local ~/Develop/provisioning (test) > cat etc/create-terraform.ini | egrep -v '^[ ]*(;|#|$)'
-[global]
-puppet_master = puppetmaster02.pixelpark.com
-[vSphere]
-user = frank.brehm
-password = <mein_oberschickes_Passwort>
-[PowerDNS]
-api_key = <API-Key>
-[Terraform]
-
-*Hinweis*: Den API-Key für die globale PowerDNS-Instanz findet man hier: https://intra.pixelpark.com/confluence/display/its/DNS+Server+-+Betriebsdokumentation+-+Maschinen+und+Software#DNSServer-Betriebsdokumentation-MaschinenundSoftware-Zugangsdaten - Service _'PowerDNS-API global'_.
-
-Die weiteren Angaben sind in der Datei _'etc/create-terraform.ini.default'_ beschrieben und brauchen nicht
-unbedingt überschrieben werden, ausser, man will zum Beispiel den Test-VSphere-Cluster nehmen.
+**Hinweise:**
+* Das Passwort des VSphere-Administrators findet man hier: https://intra.powerofone.de/confluence/x/IpKCAg,
+ im Abschnitt Live Umgebung - vCenter Single Sign On-Dienst
+* Den API-Key für die globale PowerDNS-Instanz findet man hier: https://intra.powerofone.de/confluence/x/gIjrAQ
+ im Abschnitt '5. Zugangsdaten'.
+* Bitte immer eine Sicherheitskopie der fertigen Datei _'venv/etc/create-terraform.ini'_ irgendwo außerhalb
+ des Arbeitsverzeichnisses aufbewahren. Es kann passieren, dass man aus irgendwelchen Gründen die
+ virtuelle Umgebung komplett wegwerfen und neu erstellen muss. Bei der Gelegenheit wird auch die manuell
+ erstellte Date _'venv/etc/create-terraform.ini'_ weggeworfen - was doch schade wäre.
## 2. Arbeit mit Provisionierungs-Projekten