Ansibleとプリコンテナー技術

コンテナ化が画像を仮想化に準備するのを簡単にした前に、CDから起動するためのカスタムISO画像を準備するのは相当な芸術でした。後に、これらの画像は仮想マシンからの起動に使用されました。すなわち、ISO画像はコンテナ画像の始祖でした。

私はWindowsのDockerクライアントと不運な出会いを数回しました。コンテナを実行していない場合でも、Windowsのメモリマネージャーは可能な限り多くのメモリを割り当てて、私が忙していたことを遅くします。そのため、WindowsのDockerクライアントを私のマシンから排除しました。

私が恨んでいるのはDockerではありません、Windowsクライアントだけです。

このステップは私を過去に遡らせることを強制しました。私はWindowsのハイパービジョン上で直接仮想マシンを実行し始めました。その後、Windows上でKubernetesクラスタを形成することは私にとって幸せの趣味となり、DZoneでの私の過去の投稿からわかるでしょう

シューマー、なぜ足を裸にしているのか?

同じマウスクリックをHyper-Vマネージャーで仮想マシンを作成するのに何時間も続くと、私が靴作りの人間のようだと気づいたのです:私はDevOpsパイプラインを構築するために時間単価を支払っていますが、マウスクリックに時間を費やすのはどうしょう?

挑戦は受け入れられました。duckduckgoして、PowerShellを使って仮想マシンを作成できることを読みました。ここで見ることができるように、新しい仮想マシンを作成するスクリプトを持つのに1週間もかかりませんでした。

A Old Art Rediscovered

これは素晴らしいことでしたが、Ubuntu をインストールするときに、まだマウス クリックをしていることに気づきました。これを自動化するのは、もっと難しそうでした。ISO イメージを解凍し、何らかの方法で操作し、コンピュータに起動方法を指示するものをそのまま残すように注意しながら、再びパッケージ化しなければなりません。

幸いなことに、私はこれを行う方法に関する優れたガイドを見つけました。

  1. UbuntuのISOブートイメージを解凍します。
  2. コンテンツを操作する
      マスターブートレコード(MBR)を移動する。
      ユーザーが GUI 上で通常行うことを指定し、インストール中に何がインストールされ実行されるかをカスタマイズします。これは、Ubuntu の Cloud-init 言語のサブセットを使用して行われます。私が作成した手順については、こちらを参照してください。
      ブートローダ (この場合は Grub) に、カスタムブート命令をどこで見つけるか、そしてユーザー入力を待たないように指示します。以下は、私が決定した Grub 設定です
  3. Xorrisoと呼ばれるアプリケーションを使って、すべてをパッケージ化します。

この古代技術の魔術師にとって、Xorrisoは魔法の杖の役割を果たす。Xorrisoには、何ページにもわたる呪術書のようなドキュメントがある。

仕上げのためのアンシブル

私からのさらなる入力なしに PowerShell から Ubuntu22 をブートできたのは大満足でしたが、次に 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        

ここで2つのイメージを準備するために使用されたXorrisoコマンドのマジックに注目してください: 1つはKubernetesをサポートしており、もう1つはサポートしていません。

唯一の注意点は、このプレイを実行するためにAnsibleがインストールされたマシンを持っていることです。

まとめ

この投稿は過去にさかのぼるが、物事がなぜそのようになったのかを理解するためには、物事が始まった場所を再訪することが重要である。さらに、Windows とコンテナーはそれほどうまく混ざり合いませんし、開発者の日々をより良いものにする方法についての調査は歓迎されるべきです。

コードの一部を紹介しましたが、プロジェクト全体はGitHubで見ることができます。

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