Ansible und die Kunst der Vor-Container

Bevor die Containerisierung die Vorbereitung von Images für die Virtualisierung so einfach machte, war es eine ziemliche Kunst, benutzerdefinierte ISO-Images zum Booten von CD zu erstellen. Später wurden diese Images zum Booten virtueller Maschinen verwendet. Mit anderen Worten: ISO-Images waren die Vorläufer der Container-Images.

So kam es, dass ich ein paar unglückliche Begegnungen mit dem Windows-Docker-Client hatte. Selbst wenn keine Container liefen, gab ihm der Windows-Speichermanager so viel Speicher wie möglich, um alles zu verlangsamen, womit ich gerade beschäftigt war. Daher habe ich den Windows-Docker-Client von meinem Rechner verbannt.

Bitte verstehen Sie mich nicht falsch. Ich hasse Docker nicht – nur seinen Windows-Client.

Dieser Schritt zwang mich zu einem Schritt zurück in der Zeit. Ich begann, virtuelle Maschinen direkt auf Hyper-V, dem Windows-Hypervisor, laufen zu lassen. Das Bilden von Kubernetes-Clustern unter Windows wurde dann zu einem glücklichen Hobby für mich wie man aus meinen vergangenen Beiträgen hier bei DZone ersehen kann.

Schuhmacher, warum gehst du barfuß?

Nachdem ich viele Stunden lang denselben Mausklicks gefolgt bin, um virtuelle Maschinen auf dem Hyper-V Manager zu erstellen, wurde mir klar, dass ich wie ein Schuhmacher bin, der barfuß geht: Ich baue eine DevOps-Pipeline für einen Stundensatz, aber verschwende Zeit mit Mausklicks?

Herausforderung angenommen. Ich habe duckduckgo’d und gelesen, dass es möglich ist, virtuelle Maschinen mit PowerShell zu erstellen. Es hat keine Woche gedauert, bis ich ein Skript hatte, das eine neue virtuelle Maschine erstellt, wie man hier sehen kann. Ein Schwester-Skript kann eine ausgeschaltete virtuelle Maschine starten.

Eine alte Kunst wiederentdeckt

Das war großartig, aber ich merkte, dass ich bei der Installation von Ubuntu immer noch Mausklicks machte. Dies zu automatisieren schien eine härtere Nuss zu sein, die es zu knacken galt. Man muss ein ISO-Image entpacken, es auf die eine oder andere Weise manipulieren und dann wieder verpacken, wobei man darauf achten muss, dass die Anweisungen zum Booten des Computers intakt bleiben.

Glücklicherweise fand ich einen ausgezeichneten Leitfaden , wie man genau das macht. Der Prozess besteht aus drei Schritten:

  1. Entpacken Sie das Ubuntu-ISO-Boot-Image.
  2. Manipulieren Sie den Inhalt:
    1. Den Master Boot Record (MBR) auslagern.
    2. Spezifizieren Sie, was Benutzer normalerweise auf der GUI tun, und passen Sie an, was installiert und während der Installation ausgeführt wird. Dies geschieht mit einer Untermenge der Ubuntu-Sprache Cloud-init. Siehe hier für die von mir erstellten Anweisungen.
    3. Instruieren Sie den Bootloader (in diesem Fall Grub), wo er die benutzerdefinierten Bootanweisungen finden kann und nicht auf Benutzereingaben warten soll. Hier ist die Grub-Konfiguration, für die ich mich entschieden habe.
  3. Paketieren Sie das Ganze mit einer Anwendung namens Xorriso.

Für die Zauberer dieses alten Handwerks dient Xorriso als Zauberstab. Es hat eine seitenlange Dokumentation, die einem Zauberbuch ähnelt. Ich werde mir die Hände schmutzig machen müssen, um es ganz zu verstehen, aber mein derzeitiges (und höchstwahrscheinlich fehlerhaftes) Verständnis ist, dass es Boot-Partitionen erstellt, den kopierten MBR lädt und irgendetwas mit den Cloud-init-ähnlichen Anweisungen macht, um ein geändertes ISO-Image zu erstellen.

Ansprechbar für den letzten Schliff

Obwohl es mir mit großer Genugtuung gelungen ist, Ubuntu22 von der PowerShell ohne weitere Eingaben von mir zu booten, was ist das nächste Mal, wenn Ubuntu eine neue Version herausbringt? Echtes DevOps verlangt, den Prozess nicht in ASCII zu dokumentieren, sondern in einem Skript, das bei Bedarf ausgeführt werden kann. Ansible beweist seine Vielseitigkeit, indem es mir gelungen ist, genau das an einem Nachmittag zu tun. Das Geheimnis ist, Ansible mitzuteilen, dass es sich um eine lokale Aktion handelt. Mit anderen Worten, verwenden Sie nicht SSH, um eine Maschine anzusteuern, um Anweisungen zu erhalten, sondern der Ansible-Controller ist auch der Schüler:

YAML

 

- hosts: localhost
  connection: local

Das vollständige Stück wird als nächstes gegeben und bietet eine andere Sicht auf das, was oben erklärt wurde:

YAML

 

# stamp_images.yml

- hosts: localhost
  connection: local
  become: true
  vars_prompt:
    - name: "base_iso_location"
      prompt: "Enter the path to the base image"
      private: no
      default: /tmp/ubuntu-22.04.4-live-server-amd64.iso

  tasks:
    - name: Install 7Zip
      ansible.builtin.apt:
        name: p7zip-full
        state: present

    - name: Install Xorriso
      ansible.builtin.apt:
        name: xorriso
        state: present

    - name: Unpack ISO
      ansible.builtin.command: 
        cmd: "7z -y x {{ base_iso_location }} -o/tmp/source-files"

    - name: Copy boot partitions
      ansible.builtin.copy:
        src: /tmp/source-files/[BOOT]/
        dest: /tmp/BOOT
  
    - name: Delete working boot partitions
      ansible.builtin.file:
        path:  /tmp/source-files/[BOOT]
        state: absent
  
    - name: Copy files for Ubuntu Bare
      ansible.builtin.copy:
        src: bare/source-files/bare_ubuntu
        dest: /tmp/source-files/

    - name: Copy boot config for Ubuntu bare
      ansible.builtin.copy:
        src: bare/source-files/boot/grub/grub.cfg
        dest: /tmp/source-files/boot/grub/grub.cfg

    - name: Stamp bare image
      ansible.builtin.command: 
        cmd: xorriso -as mkisofs -r   -V 'Ubuntu 22.04 LTS AUTO (EFIBIOS)'   -o ../ubuntu-22.04-wormhole-autoinstall-bare_V5_1.iso   --grub2-mbr ../BOOT/1-Boot-NoEmul.img -partition_offset 16   --mbr-force-bootable   -append_partition 2 28732ac11ff8d211ba4b00a0c93ec93b ../BOOT/2-Boot-NoEmul.img   -appended_part_as_gpt   -iso_mbr_part_type a2a0d0ebe5b9334487c068b6b72699c7   -c '/boot.catalog'   -b '/boot/grub/i386-pc/eltorito.img'     -no-emul-boot -boot-load-size 4 -boot-info-table --grub2-boot-info   -eltorito-alt-boot   -e '--interval:appended_partition_2:::'   -no-emul-boot .
        chdir: /tmp/source-files

    - name: Copy files for Ubuntu Atomika
      ansible.builtin.copy:
        src: atomika/source-files/atomika_ubuntu
        dest: /tmp/source-files/

    - name: Copy boot config for Ubuntu Atomika
      ansible.builtin.copy:
        src: atomika/source-files/boot/grub/grub.cfg
        dest: /tmp/source-files/boot/grub/grub.cfg

    - name: Stamp Atomika image
      ansible.builtin.command:
        cmd: xorriso -as mkisofs -r   -V 'Ubuntu 22.04 LTS AUTO (EFIBIOS)'   -o ../ubuntu-22.04-wormhole-autoinstall-atomika_V5_1.iso   --grub2-mbr ../BOOT/1-Boot-NoEmul.img -partition_offset 16   --mbr-force-bootable -append_partition 2 28732ac11ff8d211ba4b00a0c93ec93b ../BOOT/2-Boot-NoEmul.img   -appended_part_as_gpt   -iso_mbr_part_type a2a0d0ebe5b9334487c068b6b72699c7   -c '/boot.catalog'   -b '/boot/grub/i386-pc/eltorito.img'     -no-emul-boot -boot-load-size 4 -boot-info-table --grub2-boot-info   -eltorito-alt-boot   -e '--interval:appended_partition_2:::'   -no-emul-boot .
        chdir: /tmp/source-files        

Beachten Sie die Magie des Xorriso-Befehls, der hier verwendet wird, um zwei Images vorzubereiten: eines mit und eines ohne Unterstützung für Kubernetes.

Die einzige Einschränkung besteht darin, dass ein Rechner mit Ansible installiert sein muss, von dem aus dieses Spiel ausgeführt wird. Die Ausgabe des obigen Beispiels kann von hier heruntergeladen werden, wobei eine aktuelle Version von Ansible vorinstalliert sein muss.

Abschluss

Dieser Beitrag war ein Rückblick, aber es ist wichtig, die Anfänge zu betrachten, um zu verstehen, warum die Dinge so sind, wie sie sind. Außerdem passen Windows und Container nicht so gut zusammen, und jede Untersuchung von Möglichkeiten, die Tage der Entwickler zu verbessern, sollte begrüßt werden.

Ich habe mich auf einen Teil des Codes bezogen, aber das gesamte Projekt kann auf GitHub eingesehen werden.

Source:
https://dzone.com/articles/ansible-and-the-pre-container-arts