【问题标题】:Chef: use attributes created dynamicallyChef:使用动态创建的属性
【发布时间】:2014-07-13 11:01:20
【问题描述】:

我有 2 个属于同一食谱的食谱。 第一个配方解压/opt/tomcat/apache-tomcat-xxx中的apache-tomcat-xxx.tar.gz文件

在我做的第一个食谱中

tomcat_folder = ls /opt/tomcat
node.default['tomcat']['home'] = "/opt/tomcat/#{tomcat_folder}"

所以这个属性是在执行该配方的过程中创建的。

我的第二个配方需要在资源中使用该属性值,例如:

template node.default['tomcat']['home'] ...
directory node.default['tomcat']['home'] ...

ruby_block 
block do
        node.default['tomcat']['home']  ....

但我收到错误,因为该属性在执行时不存在。 在其他一些资源中,我可以使用 lazy{…} 块使其工作,但在这些资源中,我不知道如何使它们工作。

所以我的问题是,我应该如何设置配方 1 中的该属性,以便在执行配方 2 时能够使用它?

【问题讨论】:

    标签: attributes chef-infra chef-recipe


    【解决方案1】:

    这里你也可以使用 lazy,但是有一些解决方法。

    template 'tomcat_home' do
      path lazy { node['tomcat']['home'] }
    end
    
    directory 'tomcat_home' do
      path lazy { node['tomcat']['home'] }
    end
    
    目录和模板的

    path 是一个name 属性,这意味着,如果它没有设置在块内,则它取自资源的名称。这就是你之前的做法。但是如果你需要惰性求值,你可以设置任何字符串作为资源的名称。请确保您不要创建具有相同名称但不同主体的相同资源,因为它们会相互覆盖。

    另一件事你不应该从特定的precedence level 读取属性(默认、正常、覆盖)。只需node['tomcat']['home'] 即可。

    【讨论】:

      猜你喜欢
      • 2021-09-12
      • 2012-12-26
      • 2020-04-19
      • 2018-12-10
      • 2014-04-15
      • 2019-05-02
      • 2020-01-08
      • 1970-01-01
      相关资源
      最近更新 更多