如何在.kitchen.yml中设置动态属性值

时间:2016-06-06 19:52:58

标签: test-kitchen

我正在使用带有ec2驱动程序的厨房。我想根据kitchen创建的实例名称将名称标签添加到ec2实例。如果我有一个'默认'套件并使用centos7.2,则厨房列表会将实例命名为'default-centos-72'。

我可以硬编码这样的东西:

suites:
  - name: default
    driver_config: 
      tags: { "Name": "kitchen-default-centos-72" }

但我真正喜欢的是这样的:

suites:
  - name: default
    driver_config: 
      tags: { "Name": <%= figure out instance name and prepend kitchen- %> }

我的例子建议使用ERB,这似乎是我的方式。但我似乎无法弄清楚用什么代码来获取实例的名称。我尝试使用一点Kitchen::Config.new...,但无法找出有效的方法。任何建议都会非常感激。

2 个答案:

答案 0 :(得分:1)

花了我一段时间,但我终于遇到了一个例子,可能向我展示了光芒。在浏览厨房的InSpec选项时,我发现您可以让它输出带有在测试运行期间使用的平台和套件名称的结果文件。嵌套在platforms:选项下的driver:块中的以下语法应该可以使用。我没有通过在运行过程中检查实例来测试这一点,但希望我能花些时间尽快做到这一点。如果它不起作用,请告诉我,我们可以对其进行调整,直到它起作用为止。

platforms:
  - name: ubuntu
    driver:
      tags:
        Name: test-kitchen-%{platform}-%{suite}

这应该如何工作,是让.kitchen.yml文件通过ERB预处理程序运行,以便%{platform}在遍历platforms和{{1}的循环期间解析为实例变量}数组。

答案 1 :(得分:0)

据我所知,似乎没有直接的方法在厨房YAML中包括实例属性。我在我的kitchen.yml中添加了以下代码段,以检查厨房YAML的ERB名称空间中可用的内容:

<%
puts "Instance vars: #{instance_variables}"
puts "Local vars: #{local_variables}"
puts "Global vars: #{global_variables}"
puts "Methods: #{methods}"
%>

针对特定实例运行kitchen create时的结果令人失望,其中没有任何内容类似于实例规范数据:

Instance vars: []
Local vars: [:_erbout, :spec, :bin_file]
Global vars: [:$-0, :$\, :$DEBUG, :$-W, :$0, :$-d, :$-p, :$PROGRAM_NAME, :$:, :$-I, :$LOAD_PATH, :$", :$LOADED_FEATURES, :$,, :$/, :$INPUT_LINE_NUMBER, :$-l, :$-a, :$INPUT_RECORD_SEPARATOR, :$ORS, :$OUTPUT_RECORD_SEPARATOR, :$PROCESS_ID, :$NR, :$@, :$!, :$DEFAULT_INPUT, :$PID, :$PREMATCH, :$CHILD_STATUS, :$LAST_MATCH_INFO, :$LAST_READ_LINE, :$DEFAULT_OUTPUT, :$MATCH, :$fileutils_rb_have_lchown, :$POSTMATCH, :$LAST_PAREN_MATCH, :$IGNORECASE, :$ARGV, :$fileutils_rb_have_lchmod, :$stdin, :$stdout, :$stderr, :$>, :$<, :$., :$FILENAME, :$-i, :$*, :$SAFE, :$thor_runner, :$_, :$~, :$;, :$-F, :$?, :$$, :$ERROR_INFO, :$&, :$`, :$', :$+, :$=, :$KCODE, :$-K, :$ERROR_POSITION, :$FS, :$FIELD_SEPARATOR, :$OFS, :$OUTPUT_FIELD_SEPARATOR, :$RS, :$VERBOSE, :$-v, :$-w]
Methods: [:inspect, :to_s, :to_yaml, :to_json, :instance_variable_defined?, :remove_instance_variable, :instance_of?, :kind_of?, :is_a?, :tap, :methods, :instance_variable_set, :protected_methods, :instance_variables, :instance_variable_get, :private_methods, :public_methods, :method, :define_singleton_method, :public_send, :singleton_method, :public_method, :extend, :to_enum, :enum_for, :<=>, :===, :=~, :!~, :eql?, :respond_to?, :freeze, :object_id, :send, :display, :class, :nil?, :hash, :dup, :singleton_class, :clone, :then, :itself, :yield_self, :untaint, :taint, :tainted?, :untrusted?, :trust, :frozen?, :untrust, :singleton_methods, :equal?, :!, :__id__, :==, :instance_exec, :!=, :instance_eval, :__send__]

最初,局部变量spec看起来很有希望,但事实证明它是GemSpec对象。

考虑所有因素,您可能必须创建一个约定以始终以某种外部方式指定实例。例如,您可以使用自己选择的环境变量,然后可以在模板中以<%= ENV['<VARNAME>'] %>的形式访问(在其中用环境变量的名称替换<VARNAME>)。可能还有其他方法可以在其中获取信息,但是您仍然需要在更多地方指定信息,而不仅仅是“测试厨房”命令。