Chef:使用动态创建的属性

时间:2014-05-24 00:46:39

标签: attributes chef chef-recipe

我有两份属于同一本食谱的食谱。 第一个配方解压缩apache-tomcat-xxx.tar.gz

中的/opt/tomcat/apache-tomcat-xxx文件

在第一个食谱中我做了

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中使用它?

1 个答案:

答案 0 :(得分:1)

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

template 'tomcat_home' do
  path lazy { node['tomcat']['home'] }
end

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

路径名称属性,这意味着,如果未在块内设置它,则从资源名称中获取。这就是你之前做过的。但是,如果您需要延迟评估,则可以将任何字符串设置为资源的名称。只需确保,不会创建具有相同名称但具有不同实体的相同资源,因为它们会相互覆盖。

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