我有两份属于同一本食谱的食谱。
第一个配方解压缩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中使用它?
答案 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']
即可。