Intelligente Lösungen
in neuer Dimension

LXC-Container umziehen

Hier beschreibe ich, wie ich meine Basiscontainer auf verschiedene Server verteile. Die Beschreibung erfolgt mit ubuntu-20.04 als Beispiel.

LETSENCRYPT: SAN-Zertifikate auftrennen

Seit ein paar Jahren benutze ich LetsEncrypt-Zertifikate. Ursprünglich fand ich’s mal eine tolle Idee, SAN-Zertifikate zu verwenden. Das sind einzelne Zertifikate, die für mehrere Domains ausgestellt werden, beispielsweise für

  • daemons-point.com
  • www.daemons-point.com
  • internal.daemons-point.com
  • mail.daemons-point.com
  • etc

Wahrscheinlich war meine Idee damals, dass wir auf diese Weise weniger wahrscheinlich in die LetsEncrypt-Begrenzungen (Anzahl der Zertifikate, etc) laufen.

Heute ist meine Bewertung diese:

  • die LetsEncrypt-Begrenzungen spielen für uns keine Rolle
  • wir sind unflexibel, wenn unsere Zertifikate und Domains gebündelt sind, beispielsweise ist es problematisch, einzelne Domains umzuziehen von “intern gehostet” zu “extern” und umgekehrt

Also: Wir müssen die Zertifikate auftrennen!

Ansible: Download

Vorbereitungen

  1. Ansible-Rolle anlegen “gitea”: (mkdir roles; cd roles; ansible-galaxy role init gitea)
  2. Playbook anlegen, welches diese Rolle zieht
1
2
3
4
5
6
---
# file: giteaservers.yml
- hosts: giteaservers
  serial: 1
  roles:
    - gitea
  1. Inventory anlegen
1
2
3
4
5
6
7
8
---
# file: inventory.yml
all:
  hosts:
  children:
    giteaservers:
      hosts:
        myohgserver.mydomain.com

Erster Versuch

Task zum Runterladen einrichten:

1
2
3
4
5
6
---
# tasks file for gitea - roles/gitea/tasks/main.yml
- name: Download gitea.xz
  get_url:
    url: https://github.com/go-gitea/gitea/releases/download/v1.11.4/gitea-1.11.4-linux-amd64.xz
    dest: "/tmp/gitea-1.11.4-linux-amd64.xz"

Task ausführen: ansible-playbook -i inventory.yml giteaservers.yml

Beobachtung: Ausführung klappt nicht, runterladen scheitert!

1
2
3
4
5
6
7
8
9
$ ansible-playbook -i inventory.yml giteaservers.yml 
...
TASK [gitea : Download gitea.xz] *************************************************************************
fatal: [myohgserver.mydo...]: FAILED! => {"changed": false, "dest": "/tmp/gitea-1.11.4-linux-amd64.xz", 
  "elapsed": 0, "msg": "Request failed: <urlopen error [Errno -2] Name or service not known>",
  "url": "https://github.com/go-gitea/gitea/releases/download/v1.11.4/gitea-1.11.4-linux-amd64.xz"}

PLAY RECAP ***********************************************************************************************
myohgserver.mydo...: ok=1    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0

Problem: Der Download wird von meinem Server angestossen, nicht von meinem lokalen Rechner!

Lokaler Download

Task zum Runterladen anpassen:

1
2
3
4
5
6
7
8
9
---
# tasks file for gitea - roles/gitea/tasks/main.yml
- name: Download gitea.xz
  get_url:
    url: https://github.com/go-gitea/gitea/releases/download/v1.11.4/gitea-1.11.4-linux-amd64.xz
    dest: "/tmp/gitea-1.11.4-linux-amd.xz"
  delegate_to: localhost
  vars:
    ansible_become: no

Task ausführen: ansible-playbook -i inventory.yml giteaservers.yml

Beobachtung: Ausführung klappt!

1
2
3
4
5
6
7
$ ansible-playbook -i inventory.yml giteaservers.yml 
...
TASK [gitea : Download gitea.xz] *************************************************************************
changed: [myohgserver.mydomain.com -> localhost]

PLAY RECAP ***********************************************************************************************
myohgserver.mydo...: ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Task erneut ausführen: ansible-playbook -i inventory.yml giteaservers.yml

1
2
3
4
5
6
7
$ ansible-playbook -i inventory.yml giteaservers.yml 
...
TASK [gitea : Download gitea.xz] *************************************************************************
ok: [myohgserver.mydomain.com -> localhost]

PLAY RECAP ***********************************************************************************************
myohgserver.mydo...: ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Beobachtung: Datei wird nicht erneut heruntergeladen – super!

Download und Upload

Task erweitern um Upload auf den Server:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
---
# tasks file for gitea - roles/gitea/tasks/main.yml
- name: Download gitea.xz
  get_url:
    url: https://github.com/go-gitea/gitea/releases/download/v1.11.4/gitea-1.11.4-linux-amd64.xz
    dest: "/tmp/gitea-1.11.4-linux-amd.xz"
  delegate_to: localhost
  vars:
    ansible_become: no
- name: Copy gitea.xz to 
  copy:
    src: "/tmp/gitea-1.11.4-linux-amd.xz"
    dest: /tmp/.
    mode: go-w

Tasks ausführen: ansible-playbook -i inventory.yml giteaservers.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ ansible-playbook -i inventory.yml giteaservers.yml
PLAY [giteaservers] **************************************************************************************

TASK [Gathering Facts] ***********************************************************************************
ok: [myohgserver.mydomain.com]

TASK [gitea : Download gitea.xz] *************************************************************************
ok: [myohgserver.mydomain.com -> localhost]

TASK [gitea : Copy gitea.xz to myohgserver.mydomain.com] *************************************************
changed: [myohgserver.mydomain.com]

PLAY RECAP ***********************************************************************************************
myohgserver.mydo...: ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Erneute Ausführung: Kein Herunterladen, kein Hochladen!

Download/Upload nur wenn noch nicht vorhanden

Der bisher erreichte Stand funktioniert im Wesentlichen. Wenn ich das Playbook aber auf mehreren verschiedenen Rechnern ausführe, dann wird GITEA jedesmal wieder heruntergeladen.

Wir wollen diese Änderung:

  1. Prüfen, ob GITEA bereits auf dem Server vorhanden ist
  2. Nur wenn noch nicht vorhanden: GITEA herunterladen und hochladen

Wir erreichen dies durch Erweitern der Tasks:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
--- a/roles/gitea/tasks/main.yml
+++ b/roles/gitea/tasks/main.yml
@@ -1,5 +1,12 @@
 ---
 # tasks file for gitea - roles/gitea/tasks/main.yml
+- name: Check for gitea.xz on 
+  command:
+    argv:
+    - "echo"
+    - "/tmp/gitea-1.11.4-linux-amd.xz"
+    creates: "/tmp/gitea-1.11.4-linux-amd.xz"
+  register: gitea_check_for_giteaxz
 - name: Download gitea.xz
   get_url:
     url: https://github.com/go-gitea/gitea/releases/download/v1.11.4/gitea-1.11.4-linux-amd64.xz
@@ -7,8 +14,10 @@
   delegate_to: localhost
   vars:
     ansible_become: no
+  when: gitea_check_for_giteaxz.changed
 - name: Copy gitea.xz to 
   copy:
     src: "/tmp/gitea-1.11.4-linux-amd.xz"
     dest: /tmp/.
     mode: go-w
+  when: gitea_check_for_giteaxz.changed

Weitere Verbesserungen

Für einen produktiven Einsatz sind u.a. noch diese Verbesserungen notwendig:

  • Prüfen der Signaturen des Downloads
  • Einsatz von Variablen

Probleme

myohgserver.mydomain.com: UNREACHABLE!

Beim Ausführen des Playbooks erscheint eine Fehlermeldung:

1
2
3
4
5
6
7
8
9
10
11
$ ansible-playbook -i inventory.yml giteaservers.yml
PLAY [giteaservers] **************************************************************************************

TASK [Gathering Facts] ***********************************************************************************
fatal: [myohgserver.mydomain.com]: UNREACHABLE! => {"changed": false, "msg":
 "Failed to connect to the host via ssh:
 ssh: Could not resolve hostname myohgserver.mydomain.com: Name or service not known",
 "unreachable": true}

PLAY RECAP ***********************************************************************************************
myohgserver.mydo...: ok=0    changed=0    unreachable=1    failed=0    skipped=0    rescued=0    ignored=0

Abhilfe: Inventory anpassen!

Änderungen

  • 2020-05-06: Erste Version

Ansible: Verzeichnisbaum

Manchmal muß ich einen ganzen Verzeichnisbaum auf einen Rechner übertragen, der mittels Ansible administriert wird. Leider gibt es keine Lösung hierfür, die “supertoll” ist.

Dieser Artikel basiert auf Ansible-2.9.7, die Quelltexte befinden sich auf Github.

JMACS: Tilde-Dateien

Der Mini-Emacs-Editor JMACS erzeugt beim Bearbeiten von Dateien immer Sicherungsdateien mit einer angehängten Tilde “~”. Wenn ich die Datei README.md damit editiere, so finde ich danach zwei Dateien:

  • README.md
  • README.md~

Die Tilde-Dateien sind machmal sehr störend, insbesondere wenn ich mich “auf fremden Rechnern” bewege. Hier beschreibe ich, wie man sie abstellt.

VSCODIUM: Grundinstallation und erste Erfahrungen

Üblicherweise verwende ich zum Editieren von Dateien primär den Emacs. Er startet hinreichend schnell, läuft auch in einer Konsole und seine Tastaturcodes liegen mir seit 20 Jahren im Blut.

Viele Leute schwärmen von VSCODE. Ich verwende VSCODIUM, die “freie” Variante ohne Telemetrie. Hier meine ersten Erfahrungen damit.

LXD: Container mit Hostonly-Netzwerk

Üblicherweise werden LXD/LXC-Container so aufgesetzt, dass sie per NAT einen Zugriff auf’s Internet haben. Problem: Wenn jemand den Container knackt, kann er relativ problemlos aus dem Container heraus weitere Aktivitäten unternehmen und sich im Netz verbreiten. Wir wollen stattdessen ein Hostonly-Netz für die Container, dann kann sich der Knacker nicht ganz so leicht verbreiten.