Memo/Vagrant

https://dexlab.net:443/pukiwiki/index.php?Memo/Vagrant
 

Vagrant

  • http://www.vagrantup.com/
    • 仮想マシンの VirtualBox, Amazon EC2 + VPC, VMware Fusion, Rackspace Cloud のCUIフロントエンドに相当する、rubyで書かれたツール。プログラミングでサーバ起動/終了/設定ができる

構築済み環境のコピー

初期構築に時間がかかる場合、初期構築済みのboxを保存する事で時間を短縮できる。


cloud-initを使う


local-exec: ホストOSで実行

  • Vagrantfile: example/example をホストOSにclone
    config.push.define "local-exec" do |push|
      push.inline = <<-SCRIPT
        git clone git@github.com:example/example.git
      SCRIPT
    end
  • 実行
    vagrant push

loopで複数VMの構築

  • Loop Over VM Definitions
  • 変数が大きくなってくると辛いので yaml化を検討する
    require 'yaml'
    hosts = YAML.load_file 'group_vars/all.yml'
  • Vagrantfile
    # -*- mode: ruby -*-
    # vi: set ft=ruby :
    
    hosts = [
      {
        :hostname => "centos6",
        :box => "centos/6",
        :private_network_ip => "192.168.56.10",
        :forwarded_port => [
          { guest: 80, host: 18080  }
        ],
        :memory => "512",
      },
      {
        :hostname => "centos7",
        :box => "centos/7",
        :private_network_ip => "192.168.56.11",
        :forwarded_port => [
          { guest: 80, host: 28080  }
        ],
        :memory => "512",
      },
    ]
    
    Vagrant.configure("2") do |config|
      hosts.each do |host|
        config.vm.define host[:hostname] do |vmconfig|
          vmconfig.vm.hostname = host[:hostname]
          vmconfig.vm.box = host[:box]
          host[:forwarded_port].each do |fwd_port|
            vmconfig.vm.network "forwarded_port", guest: fwd_port[:guest], host: fwd_port[:host]
          end
          vmconfig.vm.network "private_network", ip: host[:private_network_ip]
          vmconfig.vm.provider "virtualbox" do |vb|
            vb.memory = host[:memory]
          end
          vmconfig.vm.provision "shell", inline: <<-SHELL
            yum install -y vim epel-release
            yum install -y vim nginx
            service nginx restart
            chkconfig nginx on
          SHELL
        end
      end
    end

プラグイン


sshでの接続

  • 通常
    vagrant ssh [default]
  • 複数のvmがあると、portがvm起動順によって毎回変わるので注意。port固定したほうが良いかもしれない。
  • ansible等、他のツールを使いたい場合。
    vagrant ssh-config [default] > ssh-config
    
    # ssh
    ssh -F ssh-config default
    
    # scpでファイルコピー
    scp -F ssh-config dummy.txt default:/tmp/

Ansibleを使う

shellより楽に設定できる。

  • Ansible - Provisioning - Vagrant by HashiCorp
    • ansible: ホストOSにansibleがインストール済みの事が前提
    • ansible_local: ゲストOSにansibleをインストールして実行する。ホストOS側にansibleが不用になる。
  • ディレクトリ構造
    |-- Vagrantfile
    |-- /provisioning
    |   |-- /group_vars
    |           |-- all.yml
    |   |-- /roles
    |           |-- /bar
    |           |-- /foo
    |   |-- playbook.yml
  • inventory file
    • デフォルトは以下が使われた。 portはvmの起動順で変わる。
      .vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory
    • 固定で指定もできる。portを固定したほうが良い。
  • group
    • group_vars/ はデフォルトでは読み込まれない。all.ymlはansibleの仕様で必ず読み込まれる。
    • group nameは'all'がデフォルトとして使われる。
  • ansible側で変数を定義して、Vagrantfile内で使う。
    require 'yaml'
    group_vars = YAML.load_file 'group_vars/all.yml'

Failed to open/create the internal network

環境:

  • Win10 Pro 1803
    • VirtualBox 6.0.4
  • WSL
    • Ubuntu 18.04.1 LTS
    • vagrant 2.2.4

現象:

  • vagrant up時に以下のエラーが出て起動しない。

エラー:

Stderr: VBoxManage.exe: error: Failed to open/create the internal network 'HostInterfaceNetworking-VirtualBox Host-Only Ethernet Adapter' (VERR_INTNET_FLT_IF_NOT_FOUND).
VBoxManage.exe: error: Failed to attach the network LUN (VERR_INTNET_FLT_IF_NOT_FOUND)
VBoxManage.exe: error: Details: code E_FAIL (0x80004005), component ConsoleWrap, interface IConsole

解決:

  • VirtualBox自体の再インストールをしてみる(これで直ったように見えた)
  • ネットワーク接続でIPv6の無効化、NDIS6のチェック確認。
  1. 「コントロール パネル\ネットワークとインターネット\ネットワーク接続」
  2. 「VirtualBox Host-Only Ethernet Adapter」のプロパティを開く
  3. 「VirtualBox NDIS6 Bridged Networking Driver」にチェックを入れる
  4. 「インターネットプロトコル バージョン6(TCP/IPv6)」のチェックを外す
  5. OKで閉じる。
  6. 右クリックから無効にする
  7. 右クリックから有効にする

Failed to create the host-only adapter

環境:

  • Win10 Pro 1803
    • VirtualBox 6.0.4
  • WSL
    • Ubuntu 18.04.1 LTS
    • vagrant 2.2.4

現象:

  • vagrant upすると以下のエラーが出る。host-only adapterが作れない。
    VBoxManage.exe: error: Failed to create the host-only adapter
  • VirtualBoxのファイル > ホストネットワークマネージャ > Createでエラーが出る
    Assertion failed: [!aInterfaceName.isEmpty()]
  • 「VirtualBox Host-Only Ethernet Adapter #2」のように増える

原因:

解決:

  • 「コントロール パネル\ネットワークとインターネット\ネットワーク接続」を開き、右クリックで「無効にする」。ダブルクリックで「有効にする」
  • VirtualBoxのファイル > ホストネットワークマネージャ > アダプタを手動で設定のIPv4を確認して重複しないIPを指定。
  • Vagrantfile
    config.vm.network "private_network", ip: "192.168.56.101"

can't modify frozen String

  • 以下行があればvagrant v2.xでは不用なので削除。
    Vagrant::DEFAULT_SERVER_URL.replace('https://vagrantcloud.com')

box: 構築済みイメージの使用


/vagrantディレクトリが空の場合

Vagrant box centos/7 - Vagrant Cloud を使った場合、ホストOSから見た「/vagrant」が空の場合がある。

  • 共有フォルダは ゲストOSにインストールされた Guest Additions が担当している。ホストOSのVirtualBoxのバージョンと不一致や、古いと発生する。
  • 「Guest Additions」を更新してくれる「vagrant-vbguest」プラグインを追加
    vagrant plugin install vagrant-vbguest
    
    # up済みvmのバージョンをチェック
    vagrant vbguest [vmname] --status
    
    # 更新
    vagrant vbguest [vmname]
    
    # vm再起動
    vagrant reload [vmname]

Warning: Remote connection disconnect:. Retrying...

suspend中の仮想マシンに繋がらなくなった場合。

  1. vagrant haltでシャットダウン
  2. Vagrantfileを編集し、GUIを有効化
    config.vm.provider "virtualbox" do |vb|
      vb.gui = true
    end
  3. vagrant upで起動

コマンドラインオプション

  • vm名を省略すると「default」が指定された事になる。
# ヘルプ
vagrant -h

# Vagrantfileの検証
vagrant validate

# vagrantの状態
vagrant status

# 起動
vagrant up

# 一時停止、スリープ
vagrant suspend

# suspend状態からの復帰
vagrant resume

# Vagrantfileの変更反映(halt -> up)
vagrant reload

# provision部分の再実行(shell, ansible部分だけの実行)
vagrant provision

# 電源off
# 裏でVMが動いていると重いので、使い終わったら停止したほうが良い
vagrant halt

# vmの削除. boxのイメージは残ったまま
vagrant destroy
  • boxの操作
    # help
    vagrant box
    
    # インストール済みboxの一覧
    vagrant box list
    centos/7 (virtualbox, 1902.01)

インストール

  • CIDRは「192.168.56.1/24」
    • VirtualBoxのファイル > ホストネットワークマネージャ > アダプタを手動で設定のIPv4を確認。
    • 任意の値が指定できるが、NICが増えるので注意。増えすぎると分かりにくい。
  • 共有フォルダ。ホストOS上の任意のフォルダを、ゲストOS上の「/vagrant」へマウントできる。
    config.vm.synced_folder ".", "/vagrant"

macOS

brew cask install virtualbox
brew cask install vagrant

WSL環境

  • Win10 Pro 1803
    • VirtualBox 6.0.8
  • WSL
    • Ubuntu 18.04.2 LTS
    • vagrant 2.2.4
  1. Memo/Windows/PackageManagement#y905b7e1 でWindowsアプリとして、VirtualBoxのインストール
  2. WSLのUbuntu上でvagrantのインストール。Download - Vagrant by HashiCorp で最新バージョンを確認
    VAGRANT_VER=2.2.5
    wget https://releases.hashicorp.com/vagrant/${VAGRANT_VER}/vagrant_${VAGRANT_VER}_x86_64.deb
    sudo apt install ./vagrant_${VAGRANT_VER}_x86_64.deb
    
    vagrant -v
    Vagrant 2.2.5
  1. bash用の環境設定
    cat ~/.bash.d/vagrant.sh
    export VAGRANT_WSL_ENABLE_WINDOWS_ACCESS="1"
    export VAGRANT_WSL_WINDOWS_ACCESS_USER_HOME_PATH="/mnt/c/local/home/${USER}/vagrant"
    export PATH="$PATH:/mnt/c/Program Files/Oracle/VirtualBox"
    
    chmod +x ~/.bash.d/vagrant.sh
    source ~/.bash.d/vagrant.sh
  2. ruby warningを抑えるために、/etc/wsl.confの設定。Memo/Windows/10/WSL#bef978d4
  3. pluginの追加
    vagrant plugin install vagrant-vbguest

centos/7

mkdir ~/vagrant
cd vagrant
vagrant init centos/7

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

Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  config.vm.network "private_network", ip: "192.168.56.101"
  config.vm.synced_folder ".", "/vagrant"
  config.vm.provider "virtualbox" do |vb|
    vb.gui = false
    vb.memory = "512"
  end
end
--

vagrant up
vagrant status

vagrant ssh

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

vagrant halt

centos/7 + nginx

  1. 例: CentOS 7のboxを追加して、nginxをインストール
    # Vagrantfileを作成。テンプレートを作成してくれる。1ディレクトリに1ファイル。
    vagrant init centos/7
    
    # 適当にカスタマイズ
    cat Vagrantfile
    # -*- mode: ruby -*-
    # vi: set ft=ruby :
    
    Vagrant.configure("2") do |config|
      config.vm.box = "centos/7"
      config.vm.network "forwarded_port", guest: 80, host: 18080
      config.vm.network "private_network", ip: "192.168.56.101"
      config.vm.provider "virtualbox" do |vb|
         vb.gui = false
         vb.memory = "512"
      end
      config.vm.synced_folder ".", "/vagrant"
      config.vm.provision "shell", inline: <<-SHELL
        yum install -y vim epel-release
        yum install -y vim nginx
        service nginx restart
        chkconfig nginx on
      SHELL
    end
    
    # Vagrantfileの検証
    vagrant validate
    Vagrantfile validated successfully.
    
    # 起動。初回は時間がかかる。「.vagrant/」「.vagrant.d/」ディレクトリができる 
    vagrant up
    
    # ステータスの確認
    vagrant status
    ...
    default                   running (virtualbox)
    
    # sshでのログイン
    vagrant ssh [default]
    [vagrant@localhost ~]$ pwd
    /home/vagrant
    
    [vagrant@localhost ~]$ exit
  2. http://192.168.56.101/ を開いてnginxのデフォルトページが表示されるはず

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-08-16 (金) 16:49:12 (7d)