【问题标题】:How can set dynamic attribute value in .kitchen.yml如何在 .kitchen.yml 中设置动态属性值
【发布时间】:2020-01-29 19:11:57
【问题描述】:

我正在使用带有 ec2 驱动程序的厨房。我想根据厨房创建的实例名称将名称标签添加到 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...,但无法找出有效的方法。任何建议将不胜感激。

【问题讨论】:

    标签: test-kitchen


    【解决方案1】:

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

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

    这应该如何工作是 .kitchen.yml 文件通过 ERB 预处理器运行,因此 %{platform} 在循环期间解析为实例变量 platformssuites 数组。

    【讨论】:

    • 您建议的语法将name 标记创建为test-kitchen-%{platform}-%{suite}。它不解析 platformsuite 变量。
    【解决方案2】:

    据我所知,似乎没有直接的方法可以在厨房 YAML 中包含实例属性。我将以下 sn-p 添加到我的 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 对象。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-26
      相关资源
      最近更新 更多