Intelligente Lösungen
in neuer Dimension

Ansible: Grundkonfiguration eines LXC-Containers

Wir haben mehrere Rechner im Einsatz, die als LXC/LXD-Hosts dienen. Auf diesen Rechnern wollen wir Basiscontainer von ubuntu-1804 und ubuntu-2004 bereitstellen, von denen dann eigene Container abgeleitet werden können.

Die Basiscontainer sind speziell angepasst an unsere Infrastruktur.

Da wir das mehrfach benötigen, verwende ich für das Aufsetzen eine automatisierte Lösung auf Basis von Ansible

Die nachfolgende Beschreibung geht von diesen Randbedingungen aus:

  • ulinuc … Rechner, auf dem Ansible läuft
  • hetzner-de … Rechner, der als LXC/LXD-Host dient
  • ubuntu-2004 … einer der Basiscontainer, die auf dem LXC/LXD-Host laufen sollen
  • ubuntu-1804 … ein weiterer Basiscontainer, die auf dem LXC/LXD-Host laufen sollen

Grundinstallation und -konfiguration des LXC/LXD-Hosts

Die Grundinstallation erfolgt manuell:

  • Im Wesentlichen eine minimale Ubuntu-2004-Server-Installation
  • Vollverschlüsselung der Festplatte
  • Entschlüsseln via DROPBEAR/SSH

Die nachfolgende Konfiguration erfolgt mittels Ansible. Nichts spezielles, es werden diese Module/“Befehle” verwendet:

  • snap
  • lvol
  • lxd_profile
  • lxd_container

Freischalten des LXC-Zugriffs

Für das Freischalten des LXC-Zugriffs brauchen wir ein sicheres Kennwort – “(ultra-sicheres-kennwort)”.

1
2
hetzner-de$ sudo lxc config set core.https_address [::]:8443
hetzner-de$ sudo lxc config set core.trust_password '(ultra-sicheres-kennwort)'

LXC auf dem Ansible-Host

Auf dem Rechner, der Ansible ausführt, muß LXC installiert sein:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ulinuc$ sudo snap install lxd

ulinuc$ lxc remote add hetzner-de 44.1.2.8
Generating a client certificate. This may take a minute...
Certificate fingerprint: d2c6bedd778628ed236d7bafc63946dad0ac94d849be4b2c120885XXXXXXXXXX
ok (y/n)? y
Admin password for hetzner-de: 
Client certificate stored at server:  hetzner-de

ulinuc$ lxc remote list
+-----------------+------------------------------------------+---------------+-------------+--------+--------+
|      NAME       |                   URL                    |   PROTOCOL    |  AUTH TYPE  | PUBLIC | STATIC |
+-----------------+------------------------------------------+---------------+-------------+--------+--------+
| hetzner-de      | https://44.1.2.8                         | lxd           | tls         | NO     | NO     |
+-----------------+------------------------------------------+---------------+-------------+--------+--------+
...

Grundinstallation des LXC-Basiscontainers

Die Standard-Variante des LXC-Basiscontainers wird erzeugt mittels “lxd_container”.

Anpassen des LXC-Basiscontainers

Die Anpassung des LXC-Basiscontainers erfolgt mittels Ansible. Grob müssen wir diese Schritte durchführen:

  • LXC-Basiscontainer zu Ansible hinzufügen
  • Ansible-Tasks mit delegate_to/delegate_facts ausführen

LXC-Basiscontainer zu Ansible hinzufügen

Wir brauchen diese Variablen:

  • Name des LXC/LXD-Hosts – lxd_host: hetzner-de
  • Name des LXC-Basiscontainers – container_name: ubuntu-2004
  • Name des LXC-Basiscontainers in Ansible – container_inventory_hostname: hetzner-de_ubuntu-2004

Der Name des LXC-Basiscontainers in Ansible sollte eine Kombination aus Name des LXC/LXD-Hosts und Name des LXC-Basiscontainers sein, da er eindeutlich sein soll und wir gleichnamige LXC-Basiscontainer auf allen unseren LXC/LXD-Hosts verwenden.

Im Ansible-Playbook sieht das dann so aus:

1
2
3
4
5
6
- name: Add container '' to the inventory as ''
  add_host:
    name: ""
    ansible_host: ":"
    ansible_connection: lxd
    changed_when: false

Ansible-Tasks mit delegate_to/delegate_facts ausführen

Hier ein Beispiel für einen Ansible-Task, der eine Datei in dem LXC-Basiscontainer ablegt:

1
2
3
4
5
6
7
8
- name: /tmp/uli-war da for ''
  copy:
    content: |
      Dies ist einfach irgendein Dateiinhalt,
      den wir gerne auf dem Container sehen wollen
    dest: /tmp/uli-war-da
  delegate_to: ""
  delegate_facts: true

Zu beachten sind die beiden Zeilen mit delegate_to/delegate_facts.

Links