m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

Vagrantfileに複数サーバ構成を行う

vagrantでは

複数のサーバを作成することも基本的には可能です。

# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  
  # common settings
  box_name = "centos64_01"
  box_url = "https://dl.dropboxusercontent.com/u/36773763/vagrant/CentOS-6.4-x86_64-v20130427.box"

  # vm1
  config.vm.define :vm1 do|vm1|
    # box 
    vm1.vm.box = box_name
    vm1.vm.box_url = box_url
    
    # network
    vm1.vm.network "private_network", ip: "192.168.33.101"

    # share
    vm1.vm.synced_folder "./data1", "/vagrant", \
        create: true, owner: 'vagrant', group: 'vagrant', \
        mount_options: ['dmode=777,fmode=666']

    # provision
    vm1.vm.provision :shell, :path => "./data1/script.sh"

  end

  # vm2
  config.vm.define :vm2 do|vm2|
    # box
    vm2.vm.box = box_name
    vm2.vm.box_url = box_url

    # network
    vm2.vm.network "private_network", ip: "192.168.33.102"

    # share
    vm2.vm.synced_folder "./data2", "/vagrant", \
        create: true, owner: 'vagrant', group: 'vagrant', \
        mount_options: ['dmode=777,fmode=666']

    # provision
    vm2.vm.provision :shell, :path => "./data2/script.sh"

  end

end

なんとなく思っていたけど

めんどい
これが3個とか5個になったときも同じように追加していくのはいやだなと思ってしまう

設定内容がある程度似ている場合

ipアドレスとかvm名などが異なるだけで
他の設定が同じ場合はある程度まとめることができないかと…

rubyを使用して記載している場合なら、配列とかハッシュをうまくつかってできるかもしれない

# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  # common settings
  box_name = "centos64_01"
  box_url = "https://dl.dropboxusercontent.com/u/36773763/vagrant/CentOS-6.4-x86_64-v20130427.box"

  # parameters
  list = [
	{"name" => "vm1", "ip" => "192.168.33.101", "dir" => "data1"},
	{"name" => "vm2", "ip" => "192.168.33.102", "dir" => "data2"},
	{"name" => "vm3", "ip" => "192.168.33.103", "dir" => "data3"},
	{"name" => "vm4", "ip" => "192.168.33.104", "dir" => "data4"},
	{"name" => "vm5", "ip" => "192.168.33.105", "dir" => "data5"},
  ]

  # loop
  list.each do |value|
    # debug print
    _name = value["name"]
    _ip = value["ip"]
    _dir = value["dir"]

    # node list
    config.vm.define "#{_name}" do|node|
      # box
      node.vm.box = box_name
      node.vm.box_url = box_url

      # network
      node.vm.network "private_network", ip: "#{_ip}"

      # share
      node.vm.synced_folder "./#{_dir}", "/vagrant", \
          create: true, owner: 'vagrant', group: 'vagrant', \
          mount_options: ['dmode=777,fmode=666']

      # provision
      node.vm.provision :shell, :path => "./#{_dir}/script.sh"

    end

  end

end

配列と連想配列を使用してループしながら可変で仮想環境を作成していくようにする追加、削除の場合もリストの部分を修正すればipなどの誤りも少なくてすみそうなので

ちょっと至極めんどうだけど実験

$ vagrant up
name=vm1,ip=192.168.33.101,data1
name=vm2,ip=192.168.33.102,data2
name=vm3,ip=192.168.33.103,data3
name=vm4,ip=192.168.33.104,data4
name=vm5,ip=192.168.33.105,data5
Bringing machine 'vm1' up with 'virtualbox' provider...
Bringing machine 'vm2' up with 'virtualbox' provider...
Bringing machine 'vm3' up with 'virtualbox' provider...
Bringing machine 'vm4' up with 'virtualbox' provider...
Bringing machine 'vm5' up with 'virtualbox' provider...
==> vm1: Importing base box 'centos64_01'...
==> vm1: Matching MAC address for NAT networking...

なんかうまくいけそう

複数のサーバでインストール内容などが異なる場合はプロビジョニングでシェルを書いて調整すれば対応できそうなので
この方法で複数サーバを作成してみる

所感

ちょっとふとしたことでもある程度は覚えておく
インフラ関係はただでさえ弱いので…