2017年9月13日水曜日

packer と kickstart を連携して OS のインストールを自動化してみた

概要

前回 packer + Virtualbox を使って ISO から ovf + vmdk ファイルを作成してみました
その中で OS のインストールは手動でやらなければいけないという問題がありました
実は以前 Virtualbox 上に kickstart サーバを構築しており今回はこの kickstart サーバを使って OS のインストール作業も自動化してみました

環境

  • macOS X 10.12.6
  • packer 1.0.4
  • Virtualbox 5.1.26 r117224 (Qt5.6.2)

kickstart サーバの構築

これは過去の記事を参考にしてください
今回の記事では過去に作成した kickstart サーバをそのまま流用します

テンプレートファイルの編集

packer には boot_command という機能がありこれを使うことで VM が起動した際の GRUB の画面などを操作することができます

これを使って OS インストール時に kickstart サーバを指定します

  • vim centos7_with_ks.json
{
  "builders": [
    {
      "type": "virtualbox-iso",
      "vboxmanage": [
        [ "modifyvm", "{{.Name}}", "--memory", "2048" ],
        [ "modifyvm", "{{.Name}}", "--nic1", "nat" ],
        [ "modifyvm", "{{.Name}}", "--nic2", "hostonly" ],
        [ "modifyvm", "{{.Name}}", "--hostonlyadapter2", "vboxnet0"]
      ],
      "iso_checksum": "27bd866242ee058b7a5754e83d8ee8403e216b93d130d800852a96f41c34d86a",
      "iso_checksum_type": "sha256",
      "iso_url": "http://ftp.riken.jp/Linux/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1611.iso",
      "ssh_username": "root",
      "ssh_password": "password",
      "ssh_wait_timeout": "40m",
      "disk_size": "8000",
      "guest_os_type": "RedHat_64",
      "shutdown_command": "/sbin/shutdown -h now",
      "shutdown_timeout": "20s",
      "vm_name": "centos7_from_packer",
      "boot_command": [
        "<tab> text ks=http://192.168.56.101/centos.ks<enter><wait>"
      ]
    }
  ],
  "provisioners": [
    {
      "type": "shell",
      "inline": [
        "nmcli con mod enp0s3 connection.autoconnect 'yes'",
        "systemctl restart NetworkManager",
        "systemctl restart network"
      ]
    },
    {
      "type": "shell",
      "inline": ["yum install -y vim"]
    }
  ]
}

ポイントは boot_command の部分です

"boot_command": [
  "<tab> text ks=http://192.168.56.101/centos.ks<enter><wait>"
]

boot_command では特殊なタグを使用してカーソルの移動やキーストロークを行います
今回は Tab キーを一度押した後「ks=http://192.168.56.101/centos.ks」というテキストを打ち込み、Enter を入力して待つという処理を行わせています
実際に Virtualbox のコンソールを眺めているとわかるのですが自動で入力されているのがわかると思います

CentOS7 の Minimal ISO の場合、OS インストール時のデフォルトのカーソルがイメージのテストをしてからインストールという流れになっているので一度 <up> してからコマンドを打ち込んでも良いかなと思います

実行

  • packer build centos7_with_ks.json

実行すると ISO のダウンロード -> VM の作成 -> 起動 (Virtualbox のコンソールも起動) という流れで VM の作成が始まります
今回は kickstart サーバを指定しているので、OS のインストール画面も自動で進みます

OS のインストールが完了すると自動で再起動されます (これは kicksatrt で指定しています)
そして再起動後 IP が取得できるとプロビジョニングの処理がはじまり SSH を開始します
そしてプロビジョニングも問題なく終了すると output-virtualbox-iso 配下に vmdk と ovf ができあがっています

最後に

packer と kicksatrt を連携して ISO から ovf の作成の流れを完全に自動化してみました
今回は本当に単純な処理しかしていないので、時間も 20 分から 30 分程度で終了します
が、プロビジョニングが長かったりダウンロードする ISO が非常に大きかったりすると 1 回のビルドで 1 時間や 2 時間平気でかかってくると思います
その辺はかなり辛いポイントかなと思います

結局 packer もトライアンドエラーを繰り返してテンプレートを作成していく感じになると思うので、次のトライまでに数時間待たないといけないとなると作業効率も下がってくるかなと思います

OS のインストール処理が絡んでくるのでどうしても長くなりがちなので仕方ないと言えば仕方ないのかもしれませんが、、、

参考サイト

0 件のコメント:

コメントを投稿