Ansible и искусство предконтейнера

До того как контейнеризация упростила подготовку образов для виртуализации, подготовка пользовательских ISO-образов для загрузки с компакт-диска представляла собой целое искусство. Позже эти образы использовались для загрузки виртуальных машин. Другими словами, ISO-образы были предшественниками образов контейнеров.

Итак, у меня была пара неудачных столкновений с клиентом Windows Docker. Даже когда не было запущено никаких контейнеров, менеджер памяти Windows отдавал ему как можно больше памяти, замедляя все, чем я был занят. Поэтому я запретил клиент Windows Docker на своей машине.

Пожалуйста, не поймите меня неправильно. Я не ненавижу Docker – только его Windows-клиент.

Этот шаг заставил меня вернуться в прошлое. Я начал запускать виртуальные машины непосредственно на Hyper-V, гипервизоре Windows. Формирование кластеров Kubernetes на Windows стало для меня счастливым хобби как видно из моих прошлых постов, опубликованных здесь, на DZone.

Shoemaker, Why Do You Go Barefoot?

После многочасового выполнения одних и тех же щелчков мыши для создания виртуальных машин на Hyper-V Manager я понял, что я похож на сапожника, который ходит босиком: Я строю конвейер DevOps за почасовую ставку, но трачу время на щелчки мышью?

Вызов принят. Я зашел на duckduckgo’s и прочитал, что можно создавать виртуальные машины с помощью PowerShell. Не прошло и недели, как у меня появился скрипт, создающий новую виртуальную машину, как можно увидеть здесь. Аналогичный скрипт может запускать выключенную виртуальную машину.

Старое искусство, открытое заново

Это было здорово, но я понял, что все еще нажимаю на кнопки мыши при установке Ubuntu. Автоматизация этого процесса выглядела более сложной задачей. Нужно распаковать ISO-образ, произвести с ним те или иные манипуляции, а затем снова упаковать его, позаботившись о том, чтобы оставить нетронутыми все инструкции по загрузке компьютера.

К счастью, я нашел отличное руководство о том, как это сделать. Процесс состоит из трех шагов:

  1. Распакуйте загрузочный образ Ubuntu ISO.
  2. Манипулируйте содержимым:
    1. Перемещение главной загрузочной записи (MBR) наружу.
    2. Определите, что пользователи обычно делают в графическом интерфейсе, и настройте то, что устанавливается и запускается во время установки. Для этого используется подмножество языка Ubuntu Cloud-init. Смотрите здесь созданные мной инструкции.
    3. Укажите загрузчику (в данном случае Grub), где найти пользовательские инструкции по загрузке и не дожидаться ввода пользователем. Вот конфигурация Grub, на которой я остановился.
  3. Упакуйте все это с помощью приложения под названием Xorriso.

Для магов этого древнего ремесла Xorriso служит волшебной палочкой. В нем есть страницы документации, чем-то напоминающие книгу заклинаний. Мне придется испачкать руки, чтобы понять все до конца, но мое текущее (и, скорее всего, ошибочное) понимание состоит в том, что она создает загрузочные разделы, загружает скопированный MBR и делает что-то с инструкциями Cloud-init для создания измененного ISO-образа.

Ansible for the Finishing Touches

Хотя я с большим удовлетворением отметил, что мне удалось загрузить Ubuntu22 из PowerShell без каких-либо дополнительных действий с моей стороны, как насчет следующего раза, когда Ubuntu выпустит новую версию? Настоящий DevOps требует документировать процесс не в ASCII, а в виде скрипта, готового к запуску в случае необходимости. Ansible демонстрирует свою универсальность: мне удалось сделать это за полдня. Секрет в том, чтобы указать Ansible, что это локальное действие. Другими словами, не используйте SSH, чтобы нацелить машину на получение инструкций, но контроллер Ansible также является учеником:

YAML

 

- hosts: localhost
  connection: local

Далее приводится полный сценарий, который дает другое представление о том, что было объяснено выше:

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        

Обратите внимание на магию команды Xorriso, используемой здесь для подготовки двух образов: с поддержкой и без поддержки Kubernetes.

Единственное предостережение – это наличие машины с установленной Ansible, с которой можно запустить эту игру. Результаты вышеупомянутой игры можно загрузить из здесь и предварительно установить очень свежую версию Ansible.

Заключение

Этот пост был написан в стиле ретро, но важно вернуться к тому, с чего все начиналось, чтобы понять, почему все происходит именно так, как происходит. Windows и контейнеры, к тому же, не так уж хорошо сочетаются, и любое исследование способов сделать дни разработчиков лучше должно приветствоваться.

Я сослался на часть кода, но полный проект можно посмотреть на GitHub.

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