2013-03-17 58 views
20

我正在使用簡單的shell腳本爲流浪設置供應軟件,如here所示。將變量傳遞給流浪腳本中的shell腳本供應商

但是無法想出一種方法將命令行參數傳遞給vagrant並將它們發送到外部shell腳本。谷歌透露,這是作爲一個功能添加,但我找不到任何文件覆蓋它或在那裏的例子。

回答

24

你是對的。傳遞參數的方法是使用:args參數。

config.vm.provision :shell, :path => "bootstrap.sh", :args => "'first arg' second" 

注意周圍first arg單引號,如果你想包括空格作爲傳遞的參數的一部分時,才需要。也就是說,上面的代碼等同於輸入在終端執行以下操作:

$ bootstrap.sh 'first arg' second 

凡腳本$ 1指的是字符串「第一個參數」和$ 2指的是字符串「第二」之內。

在這第2版文檔可以在這裏找到:http://docs.vagrantup.com/v2/provisioning/shell.html

+0

我不認爲這個工程的時候arg是你的vagrant文​​件中的一個變量。例如: - args:「#{MY_VARIABLE}」並在您的.sh腳本中: - echo $ 1 – Justin 2014-06-13 19:21:24

+0

有沒有辦法傳遞像'vagrant provision --arg1 --arg2'這樣的參數?然後訪問我們的供應腳本中的那些。我幾乎99%肯定答案是否定的,但仍然無法阻止我自問。 – 2016-12-22 18:11:13

6

事實上,它不使用變量! 正確snytax是:

var1= "192.168.50.4" 
var2 = "my_server" 
config.vm.provision :shell, :path => 'setup.sh', :args => [var1, var2] 

,然後在外殼setup.sh:

echo "### $1 - $2" 

> ### 192.168.50.4 - my_server 
1

基於一些信息,我在舊版本的docs page的發現回答我的問題:

config.vm.provision :shell, :path => "bootstrap.sh", :args => "'abc'" 

- @ user1391445

1

這裏是另一種方式

config.vm.provision "shell" do |s| 
    s.binary = true # Replace Windows line endings with Unix line endings. 
    s.inline = %Q(/usr/bin/env \ 
     TRACE=#{ENV['TRACE']}  \ 
     VERBOSE=#{ENV['VERBOSE']} \ 
     FORCE=#{ENV['FORCE']}  \ 
     bash my_script.sh) 
end 

用法示例:從環境傳遞變量

TRACE=1 VERBOSE=1 vagrant up 
0

對於加入明確的論點,我用這個成功:

config.vm.provision "shell", path: "provision.sh", :args => "--arg1 somearg --arg2 anotherarg"