Arch: lxc-create ohne Template

Normalerweise werden LXC Container mit sogenannten Templates erstellt. Das Programm lxc-create hat dieses Template genommen und daraus dann einen Container erstellt. Die Upstream Entwickler haben diese Methode aber deprecated. Zitat aus dem Arch Wiki (🖇️ 🔐) : “Containers are built using lxc-create. With the release of lxc-3.0.0-1, upstream has deprecated locally stored templates.”.
Das schöne daran war, dass man dem Template Parameter mitgeben konnte, wie zum Beispiel zu installierende Pakete und das root Passwort. Nun kann man nur noch Standard Images runterladen und diese kommen für alle Betriebssysteme ohne gesetztes root Passwort oder irgendwelche User.

Container erstellt man nun so:

lxc-create -n containerName -t download -- --dist archlinux --release current --arch amd64

Ich konfiguriere meine Arch Container mit Ansible und das beruht auf SSH. Da aber weder ein root Passwort noch ein User angelegt wird habe ich ein schweres Los. Wie oben schon gesagt, man konnte zumindest via Parameter ein root Passwort setzen. Das geht nun nicht mehr.
Wie kann man nun via Ansible ein root Passwort setzen? Mit lxc-attach! Mit diesem Befehl kann man auf der Konsole ein Befehl ausführen. In meiner Ansible Rolle lege ich zuerst den Container mit dem neuen Befehl an:

- name: "Creating archlinux container if needed"
  shell: "lxc-create -n {{ inventory_hostname }} -t download -- --dist archlinux --release current --arch amd64"

Und setze danach das root Passwort:

- name: Set root password
  shell: "lxc-attach -n {{ inventory_hostname }} -- bash -c 'echo \"root:{{ hostvars[inventory_hostname].ansible_become_pass }}\" | chpasswd'"
  when: containter_needs_creation == true and lxc_container_system == "archlinux"

Mit chpasswd kann man non-interactive das Passwort setzen. Mit echo und der Pipe im Format “username:password” kann das PW gesetzt werden. Damit die Pipe nicht lokal ausgeführt wird, wrapped man das ganze in ein bash -c und “.

Das root Passwort muss für jeden Server individuell gesetzt werden. Sachen, die auf jeden Server geacht werden müssen bevor Ansible das regeln kann habe ich in ein Shellscript ausgelagert, dass in einem GitHub Repo liegt. Die dazugehörigen Tasks:

- name: Download setup script
  shell: "lxc-attach -n {{ inventory_hostname }} -- curl -o setup.sh https://raw.githubusercontent.com/vlcty/lxc-setup/master/setup.sh"

- name: Execute setup script
  shell: "lxc-attach -n {{ inventory_hostname }} -- bash setup.sh"

Im Grunde genommen wird da nur wichtige Software installiert, wie zum Beispiel SSH, mein Benutzer angelegt und ein Key hinterlegt. Danach wird der SSH Daemon enabled und gestartet. Den Rest übernimmt dann Ansible.


Du hast einen Kommentar, einen Wunsch oder eine Verbeserung? Schreib mir doch eine E-Mail! Die Infos dazu stehen hier.

🖇️ = Link zu anderer Webseite
🔐 = Webseite nutzt HTTPS (verschlüsselter Transportweg)
Zurück