Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何在';流浪者上';是否在文件范围内?_Ruby_Command Line_Vagrant_Parameter Passing - Fatal编程技术网

Ruby 如何在';流浪者上';是否在文件范围内?

Ruby 如何在';流浪者上';是否在文件范围内?,ruby,command-line,vagrant,parameter-passing,Ruby,Command Line,Vagrant,Parameter Passing,我正在寻找一种将参数传递给Chef cookbook的方法,如: $ vagrant up some_parameter 然后在一本厨师烹饪书中使用一些参数。您不能将任何参数传递给vagrant。唯一的方法是使用环境变量 MY_VAR='my value' vagrant up 并在配方中使用ENV['MY_VAR']。可以从ARGV读取变量,然后在进入配置阶段之前将其删除。修改ARGV感觉很恶心,但我找不到任何其他方法来使用命令行选项 流浪汉档案 provision.sh 您还可以包括G

我正在寻找一种将参数传递给Chef cookbook的方法,如:

$ vagrant up some_parameter

然后在一本厨师烹饪书中使用一些参数。

您不能将任何参数传递给vagrant。唯一的方法是使用环境变量

MY_VAR='my value' vagrant up

并在配方中使用
ENV['MY_VAR']

可以从ARGV读取变量,然后在进入配置阶段之前将其删除。修改ARGV感觉很恶心,但我找不到任何其他方法来使用命令行选项

流浪汉档案

provision.sh 您还可以包括GetoptLong Ruby库,该库允许您解析命令行选项

流浪汉档案

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命令之前指定了自定义选项,以避免出现无效选项验证错误


更多关于该库的信息。

@benjamin gauthier的GetoptLong解决方案非常简洁,非常适合ruby和vagrant范例

然而,它需要一个额外的行来修复对流浪参数的干净处理,例如
vagrant destroy-f

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--自定义选项向上--供应
流浪破坏-f
处理得很干净

希望这有帮助,

Vagrant.configure(“2”)do|config|
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
类用户名 def至美国 打印“虚拟机需要您的代理用户和密码。\n” 打印“用户名:” STDIN.get.chomp 结束 结束 类密码 def至美国 开始 系统“stty-echo” 打印“密码:” pass=URI.escape(STDIN.gets.chomp) 确保 系统“stty echo” 结束 通过 结束 结束
config.vm.provision“shell”,env:{“USERNAME”=>USERNAME.new,“PASSWORD”=>PASSWORD.new},内联:谢谢!我已经试过了,我可以获得用户输入,但不知道如何将其传递到厨师烹饪手册中。现在将尝试将其与ENV结合起来。您也可以在vagrant文件中访问该ENV var,并将其放入chef.json散列(请参阅)是的,这更方便。vagrant的作者自己说,使用环境变量:在powershell中,您应该使用类似$ENV:MY_var='MY value'| vagrant upThis的内容。这似乎对我不起作用。如果指定了无效选项,我总是会收到错误消息。执行
放置ARGV
会在删除额外的自定义参数后显示正确的数组。此处相同,它不起作用。。。我在
vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/plugin/v2/command.rb
中放入一行“#{ARGV}”
并在移除vagrant文件中的相关args之前打印该行,因此,这意味着删除是徒劳的,因为ARGV被传递给输出
的验证器。在ARGV上进行任何操作之前,指定了一个无效的选项。它工作得很好!你的问题是什么?似乎选项没有列在未处理的
opts
中:
vagrant--custom option=option destroy-f
vagrant:invalid option--f
是的,这很有效,imho比第一个答案更优雅。@BenjaminGauthier文档说“空选项--(两个减号)”用于结束选项处理。“。所以
vagrant--custom option=option--up
应该是足够的,这对vagrant 2已经不起作用了。它不接受除自身参数以外的任何参数。
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.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