概要
Vagrantfile
(version=2)の記述方法とvagrantコマンドに関する自分用のまとめ
Vagrantfileとは
- プロジェクトに必要なマシン種別、構成、およびプロビジョニングに関する定義を記述するファイル
- 文法は
Ruby
に従うものの、シンプルな変数割当のみのためRuby
を知っている必要はない -
vagrant
コマンドを実行した際、実行時ディレクトリを起点として親ディレクトリにVagrantfile
がないかを順にチェックしていく
(以上、公式簡易訳)
ホストとゲスト
- ホストマシン:
vagrant
コマンドを実行する側のマシンのこと - ゲストマシン:
vagrant
コマンドによって、作成された仮想マシンのこと
ファイルの記述
バージョン configure
- どの
Vagrantfile
でも記述
Vagrant.configure("2") do |config|
# 各種定義
end
マシン構成 vm
赤字がよく設定するだろうもの
box
- 型:
string
- ベース環境パッケージを指定
- Vagrant Cloudに登録されているものから選択
Vagrant.configure("2") do |config|
config.vm.box = "centos/7" # centos
#config.vm.box = "ubuntu/trusty64" # ubuntu
end
hostname
ゲストマシンのホスト名を設定
- 型:
string
- 文字、数字、ハイフン、ドットのみ指定可能
- ゲストの
/etc/hosts
ファイルに書き込まれる
Vagrant.configure(2) do |config|
config.vm.box = "ubuntu/xenial64"
config.vm.hostname = "machine-A" # machine-Aというホスト名を設定
end
box_version
box
として利用するパッケージの指定
- 型:
string
、デフォルト:>=0
- 不等号(
>=
)を用いることができる
post_up_message
vagrant up
完了時に表示するメッセージ
- 型:
string
- 利用者に、開発環境コンポーネントへのアクセス方法を通知するなどの用途で使用
graceful_halt_timeout
vagrant halt
が実行されてからゲストマシンを正常終了させるまでの待機秒数
- 型:
integer
、デフォルト:60
synced_folder
フォルダ共有 を参照
network
ネットワーク設定 を参照
provider
プロバイダ を参照
provision
プロビジョニング を参照
プロバイダ vm.provider
仮想マシンを作成するソフトウェアの設定
-
VMWare
、Docker
、Hyper-V
などを指定可能である。本記事ではデフォルトの設定である**VirtualBox
に焦点を絞って**記述 - 各種設定は
vm.provider
ブロック内に記述
config.vm.provider "{PROVIDER_NAME}" do |v|
### このブロックに設定を記述
end
基本設定
VMの名称、CPU数、メモリーの設定は、それぞれname
、cpus
、memory
にて可能
config.vm.provider "virtualbox" do |v|
v.name = "virtualMachineA"
v.cpus = 1
v.memory = 512 # 単位はMB
end
また、ゲストマシンはデフォルトでヘッドレスモードでの起動となるため、GUIモードで起動したい場合はgui
を設定する必要がある
config.vm.provider "virtualbox" do |v|
vbox.gui = true
end
詳細設定
より細かい設定は、VBoxManage
というユーティリティを介することで設定が可能
基本構文は以下
config.vm.provider "virtualbox" do |v|
v.customize ["{COMMAND}", :id, "{KEY}", "{VALUE}"]
end
設定可能なオプションはこちらを参照
一例として、ホスト-ゲスト間のクリップボード共有を双方向にONにしたい場合の設定は以下となる
config.vm.provider "virtualbox" do |v|
v.customize ["modifyvm", :id, "--clipboard-mode", "bidirectional"]
end
プロビジョニング vm.provision
ソフトウェア関連のインストールを行う場合に設定
-
Ansible
、Chef
などのツールが利用可能 - シェルスクリプトでの記述も可能
- ホストからゲストへのファイル(ディレクトリ)のアップロードを行うことができる
- 初回実行の
vagrant up
または--provision
オプションが指定された場合に実行される - オプション形式、ブロック形式のいずれかで記述することができる(下記)
# オプション形式
config.vm.provision "{PROVISIONER_NAME}", OPTIONS...
# ブロック形式
config.vm.provision "provisioner" "{PROVISIONER_NAME}" do |p|
# オプション設定
end
シェルスクリプト形式 (provisioner name
="shell")
大きく以下の2種類の方法に分かれる
- シェルスクリプトファイルを別で用意し、
path
にて、このファイルを参照する
config.vm.provision "shell", path: "script.sh"
-
Vagrantfile
内にスクリプトを埋め込み、inline
にて実行する
# Vagrantfileの冒頭にスクリプトを記述
$install_package = <<-'SCRIPT'
sudo apt-get update
sudo apt-get -y upgrade
SCRIPT
Vagrant.configure("2") do |config|
## 中略
# inlineオプションで冒頭のスクリプトを指定
config.vm.provision "shell", inline: $install_package
end
Ansibleの利用 (provisioner name
="ansible" or "ansible_local")
大きく2種類に分かれる
-
ansible
: ホストマシンにてansible-playbook
を実行し、ゲストマシンをセットアップする- ホストマシンに
ansible
を実行するためのパッケージインストールが必要
- ホストマシンに
-
ansible_local
: ゲストマシンにてansible-playbook
を直接実行- ホストマシンには
ansible
を実行するためのパッケージインストール不要 - ゲストマシンで実行するため、ゲストマシンにパッケージインストールが必要
- 必要なパッケージは
Vagrant
がよしなにインストールしてくれるよう
- ホストマシンには
詳細はAnsible
を理解してから追記
フォルダ共有 vm.synced_folder
ホストマシンとゲストマシン間でフォルダを共有したい場合に設定
- 第1引数:ホスト側の共有ディレクトリ
- 絶対パス、相対パスのいずれも使用可能、相対パスのルートはプロジェクトのルート
- 第2引数:ゲストマシン側の共有先ディレクトリ
- 絶対パスで記載する必要あり
config.vm.synced_folder "src/", "/usr/service/web"
オプション
type
同期方法の指定
- 型:
string
、デフォルト:nfs
-
nfs
、rsync
、smb
が選択可能 - 特別な理由がない限り、
nfs
(デフォルトなので指定なし)で問題ない -
nfs
の場合、nfs_export
、nfs_version
、nfs_udp
の3オプションが使用可能
config.vm.synced_folder ".", "/vagrant",
type: "nfs",
nfs_version: 4, # 指定しない場合のデフォルトは3
nfs_udp: false # デフォルトはtrue、ただし、versionが4の場合はfalseにする必要あり
mount_options
マウントするときのオプション一覧、下表またはここを参照
オプション | 概要 | 例 |
---|---|---|
rw | 読み書き可能な状態でマウント | rw |
ro | 読み取り専用の状態でマウント | ro |
dmode | ディレクトリ権限を設定 | dmode=700 |
fmode | ファイル権限を設定 | fmode=755 |
gid | 所有者グループをIDで指定 groupオプションよりこちらが優先される |
gid=1234 |
uid | 所有者ユーザーをIDで指定 ownerオプションよりこちらが優先される |
uid=1234 |
config.vm.synced_folder ".", "/vagrant",
owner: "vagrant",
group: "vagrant",
mount_options: ["dmode=700", "fmode=700"]
group
同期したフォルダの所有者グループを設定
- 型:
string
、デフォルト:SSHユーザー
owner
同期したフォルダの所有者を設定
- 型:
string
、デフォルト:SSHユーザー
create
true
の場合、第1引数で指定したホスト側のパスが存在しない場合に作成
- 型:
boolean
、デフォルト:false
- 基本的にはホスト側にディレクトリを予め作成しておき、本オプションは
false
とすべき
ネットワーク設定 vm.network
ゲストマシンのネットワーク接続設定
- 指定できる種別は3つで、
forwarded_port
、private_network
、public_network
(public_network
は使う意図がないため、本記事では省略) - 複数設定したい場合は、
vm.network
自体を複数記載する必要がある
config.vm.network :forwarded_port, guest: 5000, host: 5000
config.vm.network :private_network, ip: "172.16.200.101"
ポートフォワード
ホストマシン、ゲストマシンのポート番号をそれぞれ指定して、ポートフォワーディングする場合に設定
以下のオプションが指定可能
オプション | 概要 | 例 |
---|---|---|
guest | ゲスト側のポート番号、指定必須 | guest: 8080 |
host | ゲストポートへアクセスするためのホスト側のポート番号、指定必須 | host: 80 |
id | ポートフォワーディングの設定名称 | id: "forwarding" |
protocol | 使用するプロトコルtcp またはudp が指定可能、デフォルトはtcp
|
protocol: "tcp" |
# ゲストの5000番<-ホストの8080番ポート のアクセス設定、設定の名称=http
config.vm.network :forwarded_port, guest: 5000, host: 8080, id: "http"
プライベートネットワーク
公開されていないネットワーク内の設定
DHCP
、固定IPアドレス指定、IPv6
のいずれかが使用可能
# DHCP方式
config.vm.network "private_network", type: "dhcp"
# 固定IPアドレス方式
config.vm.network "private_network", ip: "192.168.50.4"
# IPv6方式(一例)
config.vm.network "private_network",
ip: "fde4:8dba:82e1::c4",
netmask: "96"
1ファイルで複数マシンの定義 (vm.define
)
-
vm.define
句でブロックを新たに作成し、このブロック内にそれぞれの定義を記述
Vagrant.configure("2") do |config|
# 1台目のマシン
config.vm.define "web-machine" do |web|
web.vm.box = "apache"
web.vm.hostname = "web-server"
end
# 2台目のマシン
config.vm.define "db-machine" do |db|
db.vm.box = "mysql"
end
# ・・・以下同様の記述で台数を増やすことができる
end
コマンド集
vagrant up
- ゲストマシンを立ち上げる
- 初回実行時には
provision
も行われる - プロビジョニングも行いつつ立ち上げる際は
--provision
または--provision-with {TARGET}
のオプションを利用
vagrant provision
- プロビジョニングを実行
- ゲストマシンが立ち上がっている状態でも実行は可能
vagrant reload
- 単純な再起動、またはVagrantfileの修正を反映させたい時に使用
-
box
そのものを変更したい場合はdestroy
->up
とする必要があるよう
vagrant halt
- ゲストマシンの終了
vagrant destroy
- ゲストマシンを破棄
- 次回の
up
時はマシン構築から行うことになる
vagrant ssh {TARGET}
- {TARGET}へsshで接続を行う
- Vagrantfileでssh設定を行っていなくても使用できる(よしなに設定してくれる、プライベートネットワークであれば問題ない)
vagrant status
- ゲストマシンの現在状況を表示
Current machine states:
↓defineで設定した名前 ↓現状 ↓provider
node1 poweroff (virtualbox)
master poweroff (virtualbox)
vagrant validate
- Vagrantfileの記述が正しいかをチェック
- CIあたりで使うのがよさそう