Ubuntu Autoinstall: cloud-initでサーバー構築を完全自動化する秘策

Ubuntu tutorial - IT technology blog
Ubuntu tutorial - IT technology blog

100台のサーバー構築における「次へ – 次へ – 完了」という悪夢

キャリアを始めたばかりの頃、忘れられないタスクがありました。ある日の午後、開発チームに引き渡すために20台以上の物理サーバーにOSをインストールするという仕事です。当時は手作業しか知らず、USBを差し込み、言語を選択し、パーティションを分割し、ユーザー名とパスワードを設定する……という作業を20回繰り返しました。結果、5時間以上かかり、目は疲れ果て、最悪なことに疲労によるタイポで2台のサーバーのホスト名を間違えて設定してしまいました。

実験室(ラボ)の管理、クラウドインフラの運用、あるいはテスト用に数十台のVMを素早く作成する必要がある場合、一歩ずつクリックして進めるのは時間の無駄です。Ubuntu Autoinstall(Subiquityとcloud-initベース)は、まさに救世主です。このツールを使えば、すべての設定を1つのファイルで定義できます。ISOをマウントして起動し、コーヒーを淹れに行くだけで、5分後にはサーバーの準備が整っています。

クイックスタート:5分でAutoinstallを試してみる

その威力を実感するために、最小限の設定ファイルを作成してみましょう。このファイルは、言語、キーボードレイアウト、管理者ユーザーを自動的に設定するため、手を動かす必要はありません。

以下の内容で user-data ファイルを作成します:

#cloud-config
autoinstall:
  version: 1
  identity:
    hostname: itfromzero-server
    password: "$6$exDY1SdbMBRfv89B$2lsE9mU78788.16n9E.D0bw9.6.D0bw9.6.D0bw9.6"
    realname: IT Admin
    username: itadmin
  locale: en_US.UTF-8
  keyboard:
    layout: us
  ssh:
    install-server: true
    allow-pw: true
  storage:
    layout:
      name: direct

重要な注意点: セキュリティのため、ファイル内のパスワードはハッシュ形式である必要があります。このハッシュ文字列は、Pythonのワンライナーで簡単に生成できます:python3 -c 'import crypt; print(crypt.crypt("mypassword", crypt.mksalt(crypt.METHOD_SHA512)))'

最も手軽なテスト方法は、KVM/QEMUやVMwareを使用することです。この user-data ファイルをセカンダリドライブ(NoCloudデータソース)としてアタッチするだけです。Ubuntu ServerのISOを起動すると、システムが自動的にこのファイルを検出し、最初から最後までインストールプロセスを自動化します。

動作の仕組み:なぜAutoinstallは強力なのか?

20.04 LTS以降、Ubuntuは古くなった Debian Installer (preseed) を廃止し、Subiquity に移行しました。最大のアップグレードポイントは、読みやすいYAML形式の採用と、cloud-init による高度なカスタマイズ性です。

1. user-dataファイル:システムの心臓部

これは将来のサーバーの設計図です。ディスクパーティションの分割からソフトウェアのインストールまで、あらゆる指示が含まれます。標準的な設定ファイルは、必ず #cloud-config という行で始まる必要があります。

2. 欠かせないコンポーネント

  • storage: ディスク構成を決定します。layout: direct でディスク全体を使用することも、専門的なサーバー向けに複雑なLVMやRAIDを構成することも可能です。
  • identity: ホスト名やログイン情報など、サーバーの識別情報を宣言します。
  • packages: 初回起動時に vimgitdocker-ce などのツールを自動的にインストールします。
  • late-commands: 再起動前の「仕上げ」コマンドです。GitHubからSSHキーをダウンロードしたり、インストール完了時にTelegramへ通知を送信したりするのに使用できます。

応用編:「差すだけで動く」カスタムISOのビルド

仮想ドライブ経由で設定ファイルを提供するのは、時として手間がかかります。よりプロフェッショナルな方法として、設定ファイルを元のISOファイルに直接埋め込んでみましょう。これにより、1本のUSBメモリだけであらゆる物理サーバーを「一掃」できるようになります。

カスタムISOのビルド手順は通常、以下のようになります:

# 1. 元のISOを解凍する(例:22.04.3)
mkdir -p /tmp/iso
7z x ubuntu-22.04.3-live-server-amd64.iso -o/tmp/iso

# 2. 設定ファイルをnocloudディレクトリに配置する
mkdir -p /tmp/iso/nocloud
cp my-user-data /tmp/iso/nocloud/user-data
touch /tmp/iso/nocloud/meta-data

# 3. grub.cfgのブートパラメータを編集する
# インストーラーにデータの取得先を教えるために 'autoinstall ds=nocloud;s=/cdrom/nocloud/' を追加
sed -i 's/---/autoinstall ds=nocloud;s=\/cdrom\/nocloud\/ ---/g' /tmp/iso/boot/grub/grub.cfg

# 4. xorrisoでISOを再パッケージ化する

ヒント:長いxorrisoコマンドを打つのが面倒な場合は、GitHubにある ubuntu-autoinstall-generator というツールを探してみてください。これを使えば、コマンド一行でISOのパッケージ化ができ、大幅な時間の節約になります。

トラブルを避けるための実践的なアドバイス

数多くの実戦投入を経て、初心者が陥りやすいミスを防ぐための4つの重要な注意点をまとめました:

YAMLの構文に注意

YAMLは空白(インデント)に非常に厳格です。スペースが1つ多いだけでインストーラーが停止し、手動介入を求められます。ビルド前に必ずオンラインのLinterでファイルをチェックしましょう。

パスワードよりSSHキーを優先

セキュリティと管理のしやすさのため、設定ファイル内でSSHキーを宣言しましょう。これにより、複雑なハッシュパスワードを覚えることなく、すぐにサーバーへSSH接続できるようになります。

ssh:
  install-server: true
  authorized-keys:
    - ssh-rsa AAAAB3Nza... user@itfromzero

静的ネットワーク設定を忘れない

DHCPがないデータセンター環境では、IP取得を試みる際にサーバーがハングアップします。インストールをスムーズに進めるために、networkセクションで具体的なスタティックIPを指定してください。

late-commandsでエージェントを導入

私はよく late-commands を使って Zabbix Agent や Prometheus Exporter をインストールします。これにより、インストール完了と同時に監視ダッシュボードにサーバーが自動で表示され、後設定が不要になります。

late-commands:
  - curtin in-target -- target apt-get update
  - curtin in-target -- target apt-get install -y qemu-guest-agent

まとめると、Ubuntu Autoinstallは大規模システムのためだけのものではありません。たとえ2〜3台のサーバーであっても、標準的な設定ファイルを作成しておくことで、環境の一貫性を保ち、プロフェッショナルな運用が可能になります。繰り返しの作業は機械に任せ、自分はもっと面白い研究に時間を使いましょう。

Share: