さまざまな開発チームがあり、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
.
.
前もって感謝します。
これを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.
Vagrant自体は、 Vagrant :: Util :: Platformクラス で、既に answerBernardoSilva によって。
そのため、Vagrantfileでは、次のものを使用できます。
if Vagrant::Util::Platform.windows? then
myHomeDir = ENV["USERPROFILE"]
else
myHomeDir = "~"
end
これは、macとwindowsをチェックするVagrant utilsを使用したバージョンです。
if Vagrant::Util::Platform.windows?
# is windows
elseif Vagrant::Util::Platform.mac?
# is mac
else
# is linux
end
私によると、元の質問を読んだとき、それは、どの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ラボの実験と展開をお楽しみください!