Variables 在厨师食谱中使用变量
我正在使用chef cookbook hostname cookbook设置节点的主机名。我不希望在属性文件中硬编码主机名(默认值['set\u fqdn']) 相反,主机名将从VM定义XML文件中读取。我提出了以下默认配方,但显然变量fqdn没有给定值。你知道为什么会发生这种情况,或者更好地完成我的任务吗Variables 在厨师食谱中使用变量,variables,chef-infra,recipe,Variables,Chef Infra,Recipe,我正在使用chef cookbook hostname cookbook设置节点的主机名。我不希望在属性文件中硬编码主机名(默认值['set\u fqdn']) 相反,主机名将从VM定义XML文件中读取。我提出了以下默认配方,但显然变量fqdn没有给定值。你知道为什么会发生这种情况,或者更好地完成我的任务吗 ruby_block "Find-VM-Hostname" do block do require 'rexml/document' require 'net/ht
ruby_block "Find-VM-Hostname" do
block do
require 'rexml/document'
require 'net/http'
url = 'http://chef-workstation/services.xml'
file = Net::HTTP.get_response(URI.parse(url)).body
doc = REXML::Document.new(file)
REXML::XPath.each(doc, "service_parameters/parameter") do |element|
if element.attributes["name"].include?"Hostname"
fqdn = element.attributes["value"] #this statement does not give value to fqdn
end
end
end
action :nothing
end
if fqdn
fqdn = fqdn.sub('*', node.name)
fqdn =~ /^([^.]+)/
hostname = Regexp.last_match[1]
case node['platform']
when 'freebsd'
directory '/etc/rc.conf.d' do
mode '0755'
end
file '/etc/rc.conf.d/hostname' do
content "hostname=#{fqdn}\n"
mode '0644'
notifies :reload, 'ohai[reload]'
end
else
file '/etc/hostname' do
content "#{hostname}\n"
mode '0644'
notifies :reload, 'ohai[reload]', :immediately
end
end
这里问题的根源是,您正在ruby_块的范围内设置变量fqdn,并试图在编译阶段引用该变量。ruby_块资源允许在聚合阶段运行ruby代码 考虑到您似乎正在使用fqdn来设置资源集,似乎可以从ruby代码中删除ruby块。e、 g
fqdn = // logic to get fqdn
file '/tmp/file' do
content "fqdn=#{fqdn}"
end
我在厨师的文件里找到了这个。我遇到了类似的问题。我将尝试
节点。运行\u state
。此信息可在本页底部找到
使用node.run_state
在chef客户端运行期间隐藏瞬态数据。这些数据可以在资源之间传递,然后在执行阶段进行评估run\u state
是一个空散列,它总是在chef客户端运行结束时被丢弃
例如,以下方法将安装Apache web服务器,随机选择PHP或Perl作为脚本语言,然后安装该脚本语言:
package“httpd”do
操作:安装
结束
ruby块“随机选择语言”吗
布洛克道
如果Random.rand>0.5
node.run_state['scripting_language']='php'
其他的
node.run_state['scripting_language']='perl'
结束
结束
结束
“脚本语言”包
包名称{node.run_state['scripting_language']}
操作:安装
结束
请点击此链接
您可以使用node.run_state[:variables]将一个变量解析为另一个配方
这是我的密码:
file.rb
node.run_state[:script_1]=“foo”
包括“规定::副本”
在另一个copy.rb文件中输入以下代码:
复制.rb
filename=node.run_state[:script_1]
放置“Name is#{filename}”我使用了
节点。出于同样的目的运行_state['variable']
,并且成功地做到了这一点。请在下面找到基本示例代码
ruby_block "resource_name" do
block do
node.run_state['port_value'] = 1432
end
end
ruby_block "resource_name2" do
block do
num = node.run_state['variable']
end
end
我希望它能有所帮助。它解决了问题,效果很好!感谢您的快速响应。我尝试过类似的方法(在run_状态下分配一个变量并在模板中检索),node.run_state命令在包调用中总是返回一个空值,因此这并不像看起来那样普遍有效。如果是run_状态,就忘了lazy。谢谢要获取配方中的run_状态值,而不是用于赋值,请使用
{node.run_状态['variable']}