vagrant - как выполнить шаги по настройке хост-платформы

<p>у нас есть разнообразная команда разработчиков, одна для windows, другая для ubuntu и другая для osx. будучи windows-парнем, я установил первую версию скрипта установки vagrant, которая работает потрясающе;)</p><p>однако, когда он запускается на хосте ubuntu, при первом обращении к шагу инициализации, который вызывает скрипт bash, происходит сбой из-за разрешений.</p><p>в windows это не имеет значения, так как общий ресурс samba автоматически имеет достаточные разрешения для запуска сценария bash (который находится в иерархии проекта, поэтому присутствует в общем каталоге/vagrant на виртуальной машине), но в ubuntu мне нужно установить разрешения на этот файл в сценарии предоставления, прежде чем я его вызываю.</p><p>это не проблема, и, честно говоря, я подозреваю, что даже с дополнительным этапом «chmod» он все равно будет нормально работать под windows, но есть ли способ в файле vagrant пометить определенные этапы подготовки как «только для windows», ' только для linux »или« только для mac »?</p><p>то есть в псевдо-коде, что-то вроде.</p><pre><code>. . 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 . . </code></pre><p>заранее спасибо.</p>

<h1>узнайте текущую ос внутри vagrantfile.</h1><p>добавьте это в ваш vagrantfile:</p><pre><code>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 </code></pre><p>тогда вы можете использовать его как хотите.</p><pre><code>if os.windows? [then] code... end </code></pre><p>правка: не хватало? если при условии.</p><p>пример, использованный для тестирования:</p><pre><code>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 </code></pre><p>выполнение:</p><pre><code># ran provision to call vagrantfile. $ vagrant provision is\_windows\_host: false vagrant launched from mac. </code></pre>

<p>обратите внимание, что сам vagrant в <a href="https://github.com/mitchellh/vagrant/blob/master/lib/vagrant/util/platform.rb">классе vagrant :: util :: platform</a> уже реализует более продвинутую версию логики проверки платформы в <a href="https://stackoverflow.com/a/26889312">ответе</a> by <a href="https://stackoverflow.com/users/1150700/bernardosilva">bernardosilva</a> .</p><p>поэтому в vagrantfile вы можете просто использовать следующее:</p><pre><code>if vagrant::util::platform.windows? then myhomedir = env["userprofile"] else myhomedir = "~" end </code></pre>

<p>вот версия, использующая утилиты vagrant, которая проверяет mac и windows:</p><pre><code>if vagrant::util::platform.windows? # is windows elseif vagrant::util::platform.mac? # is mac else # is linux end </code></pre>