web-dev-qa-db-ja.com

Vagrant-ホストプラットフォーム固有のプロビジョニング手順の方法

さまざまな開発チームがあり、1つはWindows、もう1つはUbuntu、もう1つはOSXです。 Windowsの少年であるため、私は途方もなく動作するvagrantセットアップスクリプトの最初のバージョンをセットアップします;)

ただし、Ubuntuホストで実行する場合、bashスクリプトを呼び出すプロビジョニングステップに初めて到達すると、許可のために失敗します。

Windowsでは、samba共有にはbashスクリプト(プロジェクト階層内にあるため、VMの/ vagrant共有に存在する)を実行するための十分な権限が自動的にあるため、これは問題ではありませんが、ubuntuでは呼び出す前に、プロビジョニングスクリプトでこのファイルのアクセス許可。

これは問題ではなく、正直なところ、余分な「chmod」ステップでもウィンドウの下でうまく機能すると思いますが、迷惑ファイルには特定のプロビジョニングステップを「Windows Only」としてフラグを立てる方法があります」 Linuxのみ」または「Macのみ」?

つまり、pseduoコードのようなものです。

.
.
if (Host == windows) then
  config.vm.provision : Shell, : inline => "/vagrant/provisioning/only_run_this_on_windows.sh"
else if (Host == linux) then
  config.vm.provision : Shell, : inline => "/vagrant/provisioning/only_run_this_on_linux.sh"
else if (Host == osx) then
  config.vm.provision : Shell, : inline => "/vagrant/provisioning/only_run_this_on_osx.sh"
end if
.
.

前もって感謝します。

40
Steve Childs

Vagrantfile内の現在のOSを見つけます。

これをVagrantfileに追加します。

module OS
    def OS.windows?
        (/cygwin|mswin|mingw|bccwin|wince|emx/ =~ Ruby_PLATFORM) != nil
    end

    def OS.mac?
        (/darwin/ =~ Ruby_PLATFORM) != nil
    end

    def OS.unix?
        !OS.windows?
    end

    def OS.linux?
        OS.unix? and not OS.mac?
    end
end

その後、好きなように使用できます。

if OS.windows? [then]
    code...
end

編集:?が欠落していましたif条件。

テストに使用した例:

is_windows_Host = "#{OS.windows?}"
puts "is_windows_Host: #{OS.windows?}"
if OS.windows?
    puts "Vagrant launched from windows."
elsif OS.mac?
    puts "Vagrant launched from mac."
elsif OS.unix?
    puts "Vagrant launched from unix."
elsif OS.linux?
    puts "Vagrant launched from linux."
else
    puts "Vagrant launched from unknown platform."
end

実行:

# Ran provision to call Vagrantfile.
$ vagrant provision
is_windows_Host: false
Vagrant launched from mac.
45
Bernardo Silva

Vagrant自体は、 Vagrant :: Util :: Platformクラス で、既に answerBernardoSilva によって。

そのため、Vagrantfileでは、次のものを使用できます。

if Vagrant::Util::Platform.windows? then
    myHomeDir = ENV["USERPROFILE"]
else
    myHomeDir = "~"
end
54
Tomas Creemers

これは、macとwindowsをチェックするVagrant utilsを使用したバージョンです。

if Vagrant::Util::Platform.windows?
    # is windows
elseif Vagrant::Util::Platform.mac?
    # is mac
else
    # is linux
end
3
Felix Eve

私によると、元の質問を読んだとき、それは、どのOSのVagrantが自己実行するかを調べる方法ではなく、プロビジョニングされる仮想マシンがどのOSを持っているかを調べる方法です。そのため、新しいVMの異なるOSに応じて異なるプロビジョニングスクリプトを実行する必要があります(例: "/vagrant/provisioning/only_run_this_on_${OS_OF_NEW_VM}.sh")。

残念ながら、Vagrantには(まだ)この機能がないため、これが私の解決策です。VMをvagrantファイルの上に定義します。

   cluster = {
  "control.ansible.RHEL76" => { :ip => "192.168.1.31", :type => 0, :cpus => 1, :mem => 1024, :box_image => "centos/7" },
  "app01.ansible.RHEL76"   => { :ip => "192.168.1.32", :type => 1, :cpus => 1, :mem => 1024, :box_image => "centos/7" },
  "app02.ansible.RHEL76"   => { :ip => "192.168.1.33", :type => 1, :cpus => 1, :mem => 1024, :box_image => "centos/7" },
  "winserver"          => { :ip => "192.168.1.34", :type => 2, :cpus => 1, :mem => 1024, :box_image => "mwrock/Windows2016" },
}

次に、私のコードのこれらの条件は、VMのOSに応じて異なる方法でプロビジョニングできます。

if "#{info[:box_image]}" == "mwrock/Windows2016" then
  puts "is_windows_Host: #{info[:box_image]}"
  config.vm.provision : Shell, inline => "/vagrant/provisioning/only_run_this_on_windows.psl"
end
if "#{info[:box_image]}" == "centos/7" then
  puts "is_linux_Host: #{info[:box_image]}"
  config.vm.provision : Shell, inline => "/vagrant/provisioning/only_run_this_on_linux.sh"
end

ちなみに、実生活(はい)では迷惑メールは使用せず、ラボでも使用するansibleコントローラーを使用するため、ansibleのみをansibleコントローラーにインストールする必要があります(Windows 10デスクトップと私のUbuntuラップトップと同様に)。 「type = 0」をテストするために条件を使用します(これは、無効な「コントローラー」に使用します)。 ansibleコントローラのみがansible_localを起動して、VMのクラスターにansibleをプロビジョニングします。

   if info[:type]  == 0 then
     cfg.vm.provision "Shell", inline: "if [ `which ansible` ] ; then echo \"ansible available\"; else Sudo  yum -y update; Sudo yum -y install epel-release; Sudo yum -y install ansible; fi"
     cfg.vm.provision "ansible_local" do |ansible|
        ansible.extra_vars = { ansible_ssh_user: 'vagrant' }
        ansible.inventory_path = "./production"
        ansible.playbook = "rhelhosts.yml"
        ansible.limit = "local"
     end # ansible_local

これは、浮浪者のプロビジョニング中に表示されます。

PS D:\ Documents\vagrant\top> vagrant provision control.top.RHEL76 is_linux_Host:centos/7 is_linux_Host:centos/7 is_linux_Host:centos/7 is_windows_Host:mwrock/Windows2016

これは、浮浪者のプロビジョニング中に表示されます。

PS D:\Documents\vagrant\ansible> vagrant provision control.ansible.RHEL76

is_linux_Host: centos/7

is_linux_Host: centos/7

is_linux_Host: centos/7

is_windows_Host: mwrock/Windows2016

--- many more lines, not relevant ---

マルチマシン/マルチOSラボの実験と展開をお楽しみください!

0
Peter de Zwart