ようへいの日々精進XP

よかろうもん

vagrant で同じタイプの Provisioner を複数利用する方法 〜 ちゃんとドキュメントを読みましょう案件 〜

tl;dr

昨日, 以下のようなブロクを認めました. また, vagrant から goss というコマンドラインツールを実行出来るプラグインを作ってみました.

inokara.hateblo.jp

github.com

このプラグインを作ったのは, shell provisioner から実行していた goss を個別に実行したかったからということが理由の一つでした.

  config.vm.provision :shell, inline: <<~BASH
    sudo yum install -y wget httpd && \
     goss --gossfile spec/goss.yaml --vars node.yml validate --format documentation 
  BASH

これを,

  config.vm.provision :shell, inline: <<~BASH
    sudo yum install -y wget httpd && \
  BASH

  config.vm.provision :goss do |goss|
    goss.root_path = '/vagrant'
    goss.spec_file = '/spec/goss.yaml'
    goss.vars_file = '/node.yml'
    goss.goss_path = '/bin/goss'
  end

このように書けば, 以下のように実行出来ることを期待していました.

$ vagrant provision --provision-with=shell # こっちで wget と Apache のインストール
$ vagrant provision --provision-with=goss # こっちで goss の実行

実際に, 上記のように期待する動作を得ることが出来ましたが... なんかモヤモヤした気持ちが残っていました.

モヤモヤ

vagrant のようなプロダクトが

同じ provisioner タイプを複数実行出来ないはずがない.

という気持ちで眠れずに改めてドキュメントを読んでみました.

Basic Usage

ドキュメントの Basic Usage に明記されていました.

www.vagrantup.com

以下, provisioner の基本形です.

Vagrant.configure("2") do |config|
  config.vm.provision "bootstrap", type: "shell", run: "never" do |s|
    s.inline = "echo hello"
  end
end

config.vm.provision のオプションとして, name, type, そして, before, after が指定可能です. 上記のサンプルコードだと, 以下のような値が設定されていることになります.

  • name = bootstrap
  • type = shell

The --provision-with flag can be used if you only want to run a specific provisioner if you have multiple provisioners specified. For example, if you have a shell and Puppet provisioner and only want to run the shell one, you can do vagrant provision --provision-with shell. The arguments to --provision-with can be the provisioner type (such as "shell") or the provisioner name (such as "bootstrap" from above).

上記はドキュメントの一部を抜粋したものですが, --provision-with パラメータの値として指定するのは, name の値を指定する旨, 記載されています. ちなみに, --provision-with パラメータには name 及び type を指定することが可能なようです.

$ vagrant provision --help
Usage: vagrant provision [vm-name] [--provision-with x,y,z]
        --provision-with x,y,z       Enable only certain provisioners, by type or by name.
    -h, --help                       Print this help

やっぱり...

プラグイン作るまでもなかったようです... ということで, 以下のような Vagrantfile を書いて試してみました.

Vagrant.configure('2') do |config|
  config.vm.box = 'centos/7'

  config.vm.provider "virtualbox" do |vb|
     vb.memory = '512'
  end  

  config.vm.provision 'mitamae', type: 'shell' do |s|
    s.inline = <<~BASH
      echo 'Run mitamae!!!'
    BASH
  end

  config.vm.provision 'goss', type: 'shell' do |s|
    s.inline = <<~BASH
      echo 'Run goss!!!'
    BASH
  end
end

以下のように, --provision-withmitamaegoss を切り替えて実行可能なことが確認出来ました.

f:id:inokara:20200505102603g:plain

ということで

ドキュメントはちゃんと読もう案件でした. 昨日作ったプラグインプラグインで細々と育てていこうと思います.

おつかれ, 昨日の自分.