次のようなパラメータをChef cookbookに渡す方法を探しています。
$ vagrant up some_parameter
そして、some_parameter
シェフの料理本の1つ。
Vagrantにパラメーターを渡すことはできません。唯一の方法は環境変数を使用することです
MY_VAR='my value' vagrant up
そして、ENV['MY_VAR']
レシピで。
GetoptLongRubyコマンドラインオプションを解析できるライブラリを含めることもできます。
Vagrantfile
require 'getoptlong'
opts = GetoptLong.new(
[ '--custom-option', GetoptLong::OPTIONAL_ARGUMENT ]
)
customParameter=''
opts.each do |opt, arg|
case opt
when '--custom-option'
customParameter=arg
end
end
Vagrant.configure("2") do |config|
...
config.vm.provision :Shell do |s|
s.args = "#{customParameter}"
end
end
次に、実行できます:
$ vagrant --custom-option=option up
$ vagrant --custom-option=option provision
注:無効なオプション検証エラーを回避するために、vagrantコマンドの前にカスタムオプションが指定されていることを確認してください。
ライブラリに関する詳細情報 こちら 。
構成フェーズに進む前に、ARGVから変数を読み取り、それから変数を削除することができます。 ARGVを変更するのは面倒ですが、コマンドラインオプションの他の方法を見つけることができませんでした。
# Parse options
options = {}
options[:port_guest] = ARGV[1] || 8080
options[:port_Host] = ARGV[2] || 8080
options[:port_guest] = Integer(options[:port_guest])
options[:port_Host] = Integer(options[:port_Host])
ARGV.delete_at(1)
ARGV.delete_at(1)
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
# Create a forwarded port mapping for web server
config.vm.network :forwarded_port, guest: options[:port_guest], Host: options[:port_Host]
# Run Shell provisioner
config.vm.provision :Shell, :path => "provision.sh", :args => "-g" + options[:port_guest].to_s + " -h" + options[:port_Host].to_s
port_guest=8080
port_Host=8080
while getopts ":g:h:" opt; do
case "$opt" in
g)
port_guest="$OPTARG" ;;
h)
port_Host="$OPTARG" ;;
esac
done
@ benjamin-gauthierのGetoptLongソリューションは本当にすてきで、Rubyと迷惑なパラダイムにぴったりです。
ただし、vagrant destroy -f
などの迷惑な引数のクリーンな処理を修正するには、1行追加する必要があります。
require 'getoptlong'
opts = GetoptLong.new(
[ '--custom-option', GetoptLong::OPTIONAL_ARGUMENT ]
)
customParameter=''
opts.ordering=(GetoptLong::REQUIRE_ORDER) ### this line.
opts.each do |opt, arg|
case opt
when '--custom-option'
customParameter=arg
end
end
カスタムオプションが処理されると、このコードブロックを一時停止できます。そのため、vagrant --custom-option up --provision
またはvagrant destroy -f
はきれいに処理されます。
お役に立てれば、
Vagrant.configure("2") do |config|
class Username
def to_s
print "Virtual machine needs you proxy user and password.\n"
print "Username: "
STDIN.gets.chomp
end
end
class Password
def to_s
begin
system 'stty -echo'
print "Password: "
pass = URI.escape(STDIN.gets.chomp)
ensure
system 'stty echo'
end
pass
end
end
config.vm.provision "Shell", env: {"USERNAME" => Username.new, "PASSWORD" => Password.new}, inline: <<-Shell
echo username: $USERNAME
echo password: $PASSWORD
Shell
end
end