汎用的なVagrant( CentOS7 )

' vagrant up' ワンコマンドで Git, Vimをインストール。ホスと側ssh-keyをコピー、.vimrcを git cloneする。'すぐに使える' がテーマ。設定ファイルを外部ファイル化し使い回しも楽。

汎用的な Vagrant( CentOS7 )

おれおれ Vagrantfile

といっても特別なにかすごいことやってるわけでなく汎用的なテンプレートです。
Docker のようなコンテナ型ではなくガチの CentOS 上で何か実験したい、遊びたい時などなど用途です。
毎回一から構築するのは[めんどくさい]{.under_line}ので Vagrant の Provisioning で自動化します。

VirtualBOx,Vagrant はインストール済み前提です。

provision/provision/settings_local.yaml

vm:
 # Box名 なんでも可
 boxName: "centos7"
 # 元となるboxのURL
 boxURL: "https://vagrantcloud.com/centos/boxes/7/versions/1905.1/providers/virtualbox.box"
 # IPアドレスを指定
 localIP: "192.168.33.100"
sync:
 # 同期するディレクトリを配列で指定
  dir:
    - localPath: "../../workspace/http_doc"
      vmPath: "/var/www/html"
    - localPath: "../../workspace/mysql"
      vmPath: "/var/lib/mysql"
copyFiles:
 # Vagrantへコピーしたいファイル配列で指定
 # localPathで指定したファイルがVagrant上 /vagrant/に fileNameに指定した名前でコピーされる。
 # command: に記述したコマンドを実行される。
 # 下記ではHost側のssh-keyをVagrantへコピー。sshやgit cloneなどHost側と同じ設定で行える
 # sshを多様する場合は ~/.ssh/config をコピーしてもよいかも。

  - fileName: "id_rsa.pub"
    localPath: "~/.ssh/id_rsa.pub"
    command: "cat /vagrant/id_rsa.pub >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys && rm /vagrant/id_rsa.pub"
  - fileName: "id_rsa"
    localPath: "~/.ssh/id_rsa"
    command: "cp /vagrant/id_rsa ~/.ssh/id_rsa && rm /vagrant/id_rsa"
  - fileName: ".bash_aliases"
    localPath: "~/.bash_aliases"
    command: "cp /vagrant/.bash_aliases ~/.bash_aliases && rm /vagrant/.bash_aliases"

Vagrantfile

# provision/settings-local.yml を load する
require 'yaml'
settings = YAML.load_file 'provision/settings_local.yaml'

# provision/settings-local.yml 内 copyFiles: をHost側の ~/vagrant/box名/ にコピーする。
# ここに置かれたファイルはVagrant 立ち上げ時Vagrant側 /vagrant/へコピーされる
settings['copyFiles'].each do |i|
  system('cp ' + i['localPath'] + ' ' + Dir.home + '/vagrant/' + settings['vm']['boxName']+ '/' + i['fileName'])
end

# provision/settings-local.yml 内の sync: の共有ディレクトリをマウント
# マウントタイプは デフォルトの virtualbox にしてますが Mac の場合は nfs もあり。
# nfs は早いがパーミッションにちょっと難あり? Win なら SMB?
settings['sync']['dir'].each do |i|
  #config.vm.synced_folder i['localPath'], i['vmPath'], type: "nfs", nfs_export: true
  config.vm.synced_folder i['localPath'], i['vmPath'], type: "virtualbox"
  end

# provision.sh では wget git をインストール しています。
  config.vm.provision :shell, :path => "provision/provision.sh"

# privileged: false はroot権限でなく一般ユーザー権限で実行
# ここでは bash_id, vim (lua,python3....)をインストール
  config.vm.provision :shell, privileged: false, :path => "provision/privileged.sh"

# provision/settings-local.yml 内 copyFiles: のコマンド実行
# run: "always" は Vagrant立ち上げ時 vagrant up --provision としなくても vagrant up でも実行される。
settings['copyFiles'].each do |i|
        $script = i['command']
        config.vm.provision :shell, run: "always", privileged: false, inline: $script
    end

# Vagrant側のHost名を設定
 $host_script = "hostnamectl set-hostname " + settings['vm']['hostName'].to_s
   config.vm.provision :shell, run: "always", inline: $host_script

# この場合は~/.ssh/configに
# host *
# 10     StrictHostKeyChecking no
# を追記。ssh接続の際の確認メッセージを無視する。
# vimrcをレポジトリからダウンロード をしてます。
config.vm.provision :shell, privileged: false, :path => "provision/custom_after.sh"

~/vagrant/box_name に配置。

$ cd ~/vagrant/box_name/
$ vagrant up

でインストール開始。初回起動時は box を生成するため時間がかかります。
壊れても

$ vagrant up --provision

すれば再生成されます。(時間かかるけど…)


おっさんWEBエンジニア奮闘記©2007 WEBDIMENSION