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の構築

  • vagrant.yml
    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/8"
        private_network_ip: "192.168.56.11"
        forwarded_port:
          - guest: 80
            host: 28080
        memory: 512
  • Vagrantfile
    # -*- mode: ruby -*-
    # vi: set ft=ruby :
    
    require 'yaml'
    vgconfig = YAML.load_file 'vagrant.yml'
    
    Vagrant.configure("2") do |config|
      vgconfig["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
          config.vm.synced_folder ".", "/vagrant", type: 'virtualbox'
          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'

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]

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

  • 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-10-18 (金) 18:35:17 (1d)