【问题标题】:Chef: Use attribute in different cookbook厨师:在不同的食谱中使用属性
【发布时间】:2015-10-26 15:41:53
【问题描述】:

我正在尝试使用在一本食谱中定义的属性,比如 foo,在另一本食谱中,比如 bar。我收到错误“nil:NilClass 的未定义方法 `[]'”

Chef
    solo.rb
    cookbooks
        foo
            attributes
                default.rb
            recipes
                default.rb
            metadata.rb
        bar
            attributes
                default.rb
            recipes
                default.rb
            metadata.rb
    roles
        roles.json

以上是我的厨师的结构。

solo.rb

cookbook_path File.expand_path("../chef/cookbooks", __FILE__)
json_attribs File.expand_path("../chef/roles/roles.json", __FILE__)
log_location STDOUT
log_level :debug

roles.json

{
    "run_list": ["recipe[foo::default]"]
}

foo/attributes/default.rb

default['foo']['var1'] = "Hello"

栏/属性/default.rb

default['bar']['var1'] = node['foo']['var1']

foo/metadata.rb

name 'foo'
depends 'bar'

当我运行查询 chef-solo -c solo.rb 时,我收到如下错误

================================================================================
Recipe Compile Error in ../chef/cookbooks/bar/attributes/default.rb
================================================================================

NoMethodError
-------------
undefined method `[]' for nil:NilClass

Relevant File Content:
----------------------
Recipe Compile Error in ../chef/cookbooks/bar/attributes/default.rb:
1>> default['bar']['var1'] = node['foo']['var1']

这里foo 是我的应用程序,barChef Maven。如何导入属性??

【问题讨论】:

    标签: chef-infra chef-solo


    【解决方案1】:

    您已经反转了食谱依赖项。如果你想在 bar 食谱中使用 node['foo']['var1'] 属性,那么 bar 食谱应该依赖于 foo 食谱,而不是相反。

    去掉foo/metadata.rb中的depends 'bar',创建bar/metadata.rb

    name 'bar'
    depends 'foo'
    

    完整示例:

    |____cookbooks
    | |____foo
    | | |____attributes
    | | | |____default.rb
    | |____bar
    | | |____recipes
    | | | |____default.rb
    | | |____attributes
    | | | |____default.rb
    | | |____metadata.rb
    

    cookbooks/foo/attributes/default.rb

    default['foo']['var1'] = "Hello"
    

    cookbooks/bar/attributes/default.rb

    default['bar']['var1'] = node['foo']['var1']
    

    cookbooks/bar/recipes/default.rb

    log "The value of ['bar']['var1'] is #{node['bar']['var1']}. The value of ['foo']['var1'] is also #{node['foo']['var1']}"
    

    cookbooks/bar/metadata.rb

    name 'bar'
    depends 'foo'
    

    样本输出

    # chef-client -z -o 'recipe[bar]'    
    ...
    resolving cookbooks for run list: ["bar"]
    Synchronizing Cookbooks:
      - foo (0.0.0)
      - bar (0.0.0)
    Compiling Cookbooks...
    Converging 1 resources
    Recipe: bar::default
      * log[The value of ['bar']['var1'] is Hello. The value of ['foo']['var1'] is also Hello] action write
    

    【讨论】:

    • "Foo" 是我的应用程序,"bar" 是主厨 maven。我在“foo”中有 maven(bar) 的依赖项。现在我确实尝试在关于 foo 的 bar 中添加依赖项,但错误保持不变..
    • 你能创建一个例子让我们看看吗?无论是真正的食谱还是只是 foo 和 bar?
    • 添加了一个例子。老实说,我很难理解你想要做什么。如果您使用的是 Chef Maven 说明书,为什么要修改“maven/attributes/default.rb”并将属性值设置为您自己的应用程序说明书中的属性?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    • 2015-05-01
    • 2021-11-01
    • 2014-01-26
    • 2019-01-29
    • 2023-03-22
    相关资源
    最近更新 更多