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...
なんかうまくいけそう
複数のサーバでインストール内容などが異なる場合はプロビジョニングでシェルを書いて調整すれば対応できそうなので
この方法で複数サーバを作成してみる
参考
Tips & Tricks - Vagrantfile - Vagrant Documentation
ruby - Trying to loop over hash for Vagrant boxes, failing - Stack Overflow
所感
ちょっとふとしたことでもある程度は覚えておく
インフラ関係はただでさえ弱いので…