VirtualBox環境でLinuxのインストールを自動化する。

  • 2014/7/22 長田研勉強会

インストール自動化の良さ

LinuxVMを一つ作るのには時間もかかり、面倒な作業もあります。(キーの設定、言語の設定など手動で行わなければなりません。)
このVMを複数作るとなると環境を整えるだけでも一苦労です。
そこで今回はRedHat系Linuxでインストールの自動化を行える「kickstart」という機能を使って手動設定部分の手間を省くことにしました。

Linuxの/rootディレクトリ以下には「anaconda-ks.cfg」というものがあり、このファイルにはインストールの際に行った初期設定の情報が書き込まれています。このファイルを使用してインストール自動化を図ることをkickstartと呼び、簡単に同じ環境のVMを複数作ることができます。

この「anaconda-ks.cfg」の場所をVMに認識させるには次の方法があります。

  1. USBなどのデバイスにanaconda-ks.cfgを入れて指定する方法。
  2. ネットワーク上に置かれているanaconda-ks.cfgを指定する方法。

今回は2番目の方法をとりました。

kickstartの流れ

VirtualBoxを開いて、デバイスに関する設定を済ませLinux(今回はCentOS6.5, CentOS7を使いました。)を起動します。

起動すると
installscreen
この画面に行きます。

ここで「tabキー」を押すと、上記のスクリーンショットのように「vmlinuz initrd=・・・」とでます。

この文字のあとに以下の設定を追記します。

[ruby]
ks = http://(anaconda-ks.cfgのファイルが置いてあるアドレス)
[/ruby]

CentOS7用のkickstartfile↓
https://www.centosblog.com/centos-7-minimal-kickstart-file/

packerのインストール

先ほどはVirtualBox上でのVM作成の自動化でしたが、今度はpackerを使ってコマンドラインからVirtualBoxVMの作成とvagrantのパッケージ化までを自動で行います。

ホストOS: MacOS X 10.9
VMに使用するOS: CentOS6.5

  • まずはホストOSでhomebrewが入っていることを前提に次のコマンドを実行します。
    [ruby]
    % brew tap homebrew/binary
    [/ruby]
    [ruby]
    % brew install packer
    [/ruby]
  • gitからvagrant用のpackerテンプレートをcloneしてきます。
    [ruby]
    git clone https://github.com/hnakamur/my-packer-template-files
    [/ruby]

    cloneしてくるとmy-packer-template-filesフォルダ以下に「centos6.5」, 「ubuntu12.04」のフォルダがあるのでインストールするイメージファイルに合わせてください。

    [ruby]
    cd my-packer-template-files/centos6.5
    [/ruby]

    で移動します。

  • gitでcloneしてきた状態ではlinuxOSイメージの指定場所が違うので「/my-packer-template-files/centos6.5/template.json」ファイルを編集します。
    VirtualBoxでインストールをしたいので23行目以下の範囲を編集してください。[ruby firstline=”23″ highlight=”33,35″]
    "builders": [
    {
    "type": "virtualbox-iso",
    "boot_command": [
    " text ks=http://{{ .HTTPIP }}:{{ .HTTPPort }}/ks.cfg"
    ],
    "boot_wait": "10s",
    "disk_size": 40520,
    "guest_os_type": "RedHat_64",
    "http_directory": "http",
    "iso_checksum": "",
    "iso_checksum_type": "md5",
    "iso_url": "",
    "ssh_username": "vagrant",
    "ssh_password": "vagrant",
    "ssh_port": 22,
    "ssh_wait_timeout": "10000s",
    "shutdown_command": "echo ‘/sbin/halt -h -p’ > shutdown.sh; echo ‘vagrant’|sudo -S sh ‘shutdown.sh’",
    "guest_additions_path": "VBoxGuestAdditions_{{.Version}}.iso",
    "virtualbox_version_file": ".vbox_version",
    "vboxmanage": [
    [
    "modifyvm",
    "{{.Name}}",
    "–memory",
    "512"
    ],
    [
    "modifyvm",
    "{{.Name}}",
    "–cpus",
    "1"
    ]
    ]
    },
    [/ruby]

    変更が必要な場所は

    • “iso_checksum”: “”
    • “iso_url”: “”

    この2つの部分です。

    “iso_checksum” は

    [ruby]
    %md5 (linuxisoイメージの場所)
    [/ruby]

    で出力されたハッシュ値に変更してください。

    “iso_url”はlinuxOSイメージファイルの場所に変更してください。(ファイルの場所はフルパスで指定)

    • 最後に、「template.json」ファイルのある場所で
      [ruby]
      packer build -only=virtualbox-iso template.json
      [/ruby]

      を実行します。

これでpackerが自動でvagrantのパッケージ化まで行ってくれます。
この処理が完了すると、「packer_virtualbox-iso_virtualbox.box」というパッケージファイルが出来上がっているのでこのファイルがある場所で

[ruby]
vagrant box add (適当な名前) packer_virtualbox-iso_virtualbox.box
[/ruby]

以上でvagrantboxへの追加まで終わりました。

新しくOSが出て、packerのtemplate作成したよ!という場合はgitで管理すると他の人と共有できて便利

参考サイト

kickstart

packer

カテゴリー: 未分類 | コメントする

vagrantのネットワーク設定を見てみよう。

2014/07/15 長田研勉強会

7月からvagrantでsshキーなどいろいろと初期設定をしてきて、扱い方にも慣れてきたところで Vagrant Documentationを参考にしながらvmのネットワーク設定を見ていきました。

ネットワークの種類

VirtualBoxではVMに割り当てることのできるネットワークの種類がいくつかあります。VirtualBoxの「Oracle VM VirtualBox マネージャー」から設定をVMの設定を開き、ネットワーク割り当ての欄を見ると

  • 未割り当て
  • NAT
  • NATネットワーク
  • ブリッジアダプター
  • 内部ネットワーク
  • ホストオンリーアダプター
  • 汎用アダプター

以上の7種類があります。

まずは「ホストオンリーアダプター」と「内部ネットワーク」について見てみます。どちらのネットワークもプライベートなネットワークで外部との通信は行えません。この2つのネットワークは以下の図の様なイメージです。

Network Diagram-4

  • 「ホストオンリアダプター」はホストOSとVM間の通信を行うためのネットワークです。
  • 「内部ネットワーク」は一つのホストOS上にある複数のVM間でのみ通信が行えるネットワークです。このネットワークはホストOSと繋がっていないため、ホストOSとVM間の通信はできません。

次に「NAT」についてです。このネットワーク設定を行うことでVMは外部ネットワークへ通信することができます。NATについては以下のようなイメージです。

Network Diagram-6

  • NATを使ったVMと外部ネットワークの通信ですが、 NATが送受信の際にVMのプライベートIPをホストOSの外部接続用IPに書き換えているというものでした。このNATの設定ではVMが外部と通信することはできますが、ホストOSとの通信をすることはできません。

Vagrantfileの中身

vagrantではVagrantfileの中身をいじることで自分の好きなネットワーク設定を行うことができます。

private_networkについて

[ruby firstline=”24″ highlight=”26″]
# Create a private network, which allows host-only access to the machine
# using a specific IP.
# config.vm.network "private_network", ip: "192.168.33.10"
[/ruby]

Vagrantfileにて上記のように書いてある26行目のコメントを解除すとVMにプライベートIP”192.168.33.10″を割り当てることができます。また

[ruby firstline=”26″ highlight=”26″]
config.vm.network "private_network", type: "dhcp"
[/ruby]

とすることでプライベートIPを動的に割り振ることもできます。しかしdhcpの設定をするとVMを起動するたびにIPが変わるので、VM間で通信したい場合などは固定IPの方がおすすめです。

public_networkについて

[ruby firstline=”28″ highlight=”31″]
# Create a public network, which generally matched to bridged network.
# Bridged networks make the machine appear as another physical device on
# your network.
# config.vm.network "public_network"
[/ruby]

31行目のコメントを解除すことでpublic_networkを有効にすることができます。この設定を有効にするとホストOSと同じネットワーク環境でDHCP用のIPアドレスがVMにも割り当てられます。この設定を有効にしvagrant upを行うと下記ようにどのネットワーク環境を使うか求められます。

[ruby]
% vagrant up
==> default: Attempting graceful shutdown of VM…
==> default: Clearing any previously set forwarded ports…
==> default: Clearing any previously set network interfaces…
==> default: Available bridged network interfaces:
1) en0: Ethernet
2) en1: Wi-Fi (AirPort)
3) en2: Thunderbolt 1
4) p2p0
5) bridge0
[/ruby]

予め使いたいネットワーク環境が決まっていて、この選択欄を出現させたくない場合は、Vagrantfileに

[ruby]
config.vm.network "public_network", bridge: ‘en0: Ethernet’
[/ruby]

と記述すると省くことができます。

public_networkを割り当てる際にはユーザ名や公開鍵を初期のままにしておくと、外部から侵入されてしまう危険性があるので必ず変更しましょう。

カテゴリー: 未分類 | コメントする