hysryt / wiki

https://hysryt.github.io/wiki/
0 stars 0 forks source link

Vagrant #40

Open hysryt opened 6 years ago

hysryt commented 6 years ago

インストール

Virtualboxのインストール

$ brew cask install virtualbox

Vagrantのインストール

$ brew cask install vagrant

環境作成

CentOSの環境を作成

https://app.vagrantup.com/centos/boxes/7

$ vagrant init centos/7
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'centos/7' could not be found. Attempting to find and install...
    default: Box Provider: virtualbox
    default: Box Version: >= 0
==> default: Loading metadata for box 'centos/7'
    default: URL: https://vagrantcloud.com/centos/7
==> default: Adding box 'centos/7' (v1710.01) for provider: virtualbox
    default: Downloading: https://vagrantcloud.com/centos/boxes/7/versions/1710.01/providers/virtualbox.box
==> default: Successfully added box 'centos/7' (v1710.01) for 'virtualbox'!
==> default: Importing base box 'centos/7'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'centos/7' is up to date...
==> default: Setting the name of the VM: vagrant_default_1514636037230_0
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: 
    default: Vagrant insecure key detected. Vagrant will automatically replace
    default: this with a newly generated keypair for better security.
    default: 
    default: Inserting generated public key within guest...
    default: Removing insecure key from the guest if it's present...
    default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
    default: No guest additions were detected on the base box for this VM! Guest
    default: additions are required for forwarded ports, shared folders, host only
    default: networking, and more. If SSH fails on this machine, please install
    default: the guest additions and repackage the box to continue.
    default: 
    default: This is not an error message; everything may continue to work properly,
    default: in which case you may ignore this message.
==> default: Rsyncing folder: /Users/user/Desktop/vagrant/ => /vagrant
$ vagrant box list
centos/7 (virtualbox, 1710.01)

ホストOSの2222ポートがゲストOSの22ポートにフォワーディングされる

SSH接続

$ vagrant ssh
[vagrant@localhost ~]$ cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core) 

仮想マシンのターミナルに移動する

hysryt commented 6 years ago

Guest Addtions のインストール

$ vagrant plugin install vagrant-vbguest
Installing the 'vagrant-vbguest' plugin. This can take a few minutes...
Fetching: vagrant-share-1.1.9.gem (100%)
Fetching: micromachine-2.0.0.gem (100%)
Fetching: vagrant-vbguest-0.15.0.gem (100%)
Installed the plugin 'vagrant-vbguest (0.15.0)'!
$ vagrant vbguest
Complete!
Copy iso file /Applications/VirtualBox.app/Contents/MacOS/VBoxGuestAdditions.iso into the box /tmp/VBoxGuestAdditions.iso
Mounting Virtualbox Guest Additions ISO to: /mnt
mount: /dev/loop0 is write-protected, mounting read-only
Installing Virtualbox Guest Additions 5.2.4 - guest version is unknown
Verifying archive integrity... All good.
Uncompressing VirtualBox 5.2.4 Guest Additions for Linux........
VirtualBox Guest Additions installer
Copying additional installer modules ...
Installing additional modules ...
VirtualBox Guest Additions: Building the VirtualBox Guest Additions kernel modules.
VirtualBox Guest Additions: Starting.
Redirecting to /bin/systemctl start vboxadd.service
Redirecting to /bin/systemctl start vboxadd-service.service
Unmounting Virtualbox Guest Additions ISO from: /mnt
$ vagrant vbguest --status
[default] GuestAdditions 5.2.4 running --- OK.
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'centos/7' is up to date...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
==> default: Machine booted and ready!
[default] GuestAdditions 5.2.4 running --- OK.
==> default: Checking for guest additions in VM...
==> default: Rsyncing folder: /Users/user/Desktop/vagrant/ => /vagrant
==> default: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> default: flag to force provisioning. Provisioners marked to run always will still run.

アンインストール

$ vagrant plugin uninstall vagrant-vbguest
hysryt commented 6 years ago

共有ファイルシステム

ホストOSとゲストOSでファイルやディレクトリを同期する

Vagrant.configure("2") do |config|
  config.vm.synced_folder "./hostfoo", "/foo"
end

synced_folderで指定 第一引数はホストOS側のパス 第二引数はゲストOS側のパス

hysryt commented 6 years ago

ポートフォワーディング

ホストのポートとゲストのポートを紐づける

Vagrant.configure("2") do |config|
  config.vm.network "forwarded_port", guest:80, host:8080
end

ホストの8080ポートへのアクセスをゲストの80ポートへフォワーディングする。 第一引数は文字列の"forwarded_port"か、またはシンボルの:forwarded_port

hysryt commented 6 years ago

プロビジョン

OSに各種ソフトウェア(apacheなど)をインストールすることをプロビジョンと呼ぶ。 Vagrantではプロビジョンを自動化できる。

シェルでの自動プロビジョニング

Vagrant.configure("2") do |config|
  config.vm.network "forwarded_port", guest:80, host:8080
  config.vm.provision "shell", path:"provision.sh"
end

自動プロビジョンにはconfig.vm.provisionを使用する。 シェルで行う場合は第一引数に"shell"を指定する。 第二引数はシェルスクリプトのパス プロジェクトのディレクトリからの相対パス。 この場合はVagrantfileと同じ位置。

provision.sh

#!/usr/bin/env bash

echo "Installing Apache and setting it up..."
apt-get update >/dev/null 2>&1
echo "apt-get install -y"
apt-get install -y apache2 >/dev/null 2>&1
echo "rm -rf /var/www"
rm -rf /var/www
echo "ln -fs /vagrant /var/www"
ln -fs /vagrant /var/www

起動

vagrant up時にシェルスクリプトの内容が実行される

$ vagrant up
...
    default: Installing Apache and setting it up...
    default: apt-get install -y
    default: rm -rf /var/www
    default: ln -fs /vagrant /var/www
hysryt commented 6 years ago

ネットワークアダプタ

https://www.vagrantup.com/docs/networking/

SSH用に必ず一つNATのネットワークアダプタeth0が作成される。 ポートフォワーディングを設定するとこのアダプタに適用される。 プロバイダーがVirtualboxの場合は、8つまでネットワークアダプタを作成できる。

NATの場合、ホストOSからはホストOSのIPアドレスからのポートフォワーディングでしかアクセスできない。 プライベートネットワークの場合、ホストOS側にもネットワークアダプタが追加されるため、指定したIPアドレスでアクセスできる。

プライベートネットワーク用ネットワークアダプタの追加

Vagrant.configure("2") do |config|
  config.vm.network "private_network", ip:"192.168.33.10"
end

プライベートネットワークはホストOSとゲストOSのみが接続されたネットワーク ホストOSとゲストOSの両方にネットワークアダプタが追加される

ブリッジのネットワーク用ネットワークアダプタの追加

Vagrant.configure("2") do |config|
  config.vm.network "public_network"
end

ゲストOSを、ホストOSが接続しているネットワークに接続する。 同じネットワーク内の他のPCからもゲストOSにアクセスできる。 他のPCと同じように、DHCPでIPアドレスを取得する

hysryt commented 6 years ago

複数マシンの管理

一つのVagrantfileから複数のマシンの設定を行う事ができる

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/xenial64"

  config.vm.define "web" do |web|
    # 1台目の設定
  end

  config.vm.define "db" do |db|
    # 2台目の設定
  end
end

"web""db"は各マシンに名付けた名前なので自由に変更可。 ネットワークは何も指定しない場合はNATとなり、それぞれのマシンは独立したネットワークに繋がる。 そのためNATではお互いに通信はできない。

プライベートネットワーク

各マシンをプライベートネットワークに接続すればお互い通信できるようになる。

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/xenial64"

  config.vm.define "web" do |web|
    web.vm.network "private_network", ip:"192.168.33.10"
  end

  config.vm.define "db" do |db|
    db.vm.network "private_network", ip:"192.168.33.11"
  end
end

マシンwebには192.168.33.10、マシンdbには192.168.33.11を設定する。 ホストOSには自動的に192.168.33.1のネットワークアダプタが作成される。 Vagrantはネットワーク部を255.255.255.0で判断するため、全て同じネットワーク下にあることになる。


ホストOS側のネットワークアダプタはネットワークごとに作成される。

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/xenial64"

  config.vm.define "web" do |web|
    web.vm.network "private_network", ip:"192.168.33.10"    # 192.168.33.0/24
  end

  config.vm.define "db" do |db|
    db.vm.network "private_network", ip:"192.168.34.10"     # 192.168.34.0/24
  end
end

上のようにゲストOSにお互い別々のネットワーク(192.168.33.0/24192.168.34.0/24)を設定した場合、ホストOSには192.168.33.1192.168.34.1が設定された二つのネットワークアダプタが作成される。

ゲストOSは別々のネットワークに存在するものの、ホストOSを介してお互い通信することはできる。


ゲストOSにMySQLをインストールし、別ゲストOSからアクセス

Vagrantfile

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/xenial64"

  config.vm.define "web" do |web|
    web.vm.provision :shell, path:"web_provision.sh"
    web.vm.network "private_network", ip:"192.168.33.10"
  end

  config.vm.define "db" do |db|
    db.vm.provision :shell, path:"db_provision.sh"
    db.vm.network "private_network", ip:"192.168.33.11"
  end
end

web_provision.sh

db_provision.sh

マシン起動 + MySQL接続

$ vagrant up
$ vagrant ssh web
ubuntu@ubuntu-xenial:~$ mysql -utestuser -h192.168.33.11 -p
Enter password: password
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.20-0ubuntu0.16.04.1 (Ubuntu)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
hysryt commented 6 years ago

プロビジョン後の IP アドレスの変更

プロビジョンを行った後でも IP アドレスは Vagrantfile.xml を変更すればいい。 VCCW を使っている場合は site.xml の IP アドレスを変更する。

hysryt commented 6 years ago

Ubuntu 16.04 LTS (Xenial Xerus)

https://app.vagrantup.com/ubuntu/boxes/xenial64

$ vagrant init ubuntu/xenial64
$ vagrant up
hysryt commented 6 years ago

Vagrant v2.1 (2018/05/03)

vagrant-triggers プラグインを統合

vagrant-triggers

vagrant haltvagrant up なんかをトリガーにしてスクリプトを実行できる機能らしい。 スクリプトの実行はホスト側とゲスト側のどちらでも指定可能。

# vagrant up 後に apache を起動
Vagrant.configure("2") do |config|
  config.trigger.after :up do
    run_remote "service apache2 start"
  end
end

その他

Vagrant v2.1.3 (2018/08/29)

Vagrantプラグインをプロジェクト固有でインストール可能に

https://www.vagrantup.com/docs/cli/plugin.html#local-1 https://www.vagrantup.com/docs/vagrantfile/vagrant_settings.html

インストール時に --local フラグをつけるか、

$ vagrant plugin install vagrant-cool-plugin --local

Vagrantfile の config.vagrant.plugins に指定することで可能とのこと

Vagrant.configure("2") do |config|
  config.vagrant.plugins = "vagrant-cool-plugin"
end

その他

Vagrant v2.1.5(2018/09/12)

Vagrant v2.2.0(2018/10/16)

FEATURES

IMPROVEMENTS

Vagrant v2.2.1(2018/11/15)

FEATURES

Vagrant v2.2.2(2018/11/27)

BUG FIX