Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables 在厨师食谱中使用变量_Variables_Chef Infra_Recipe - Fatal编程技术网

Variables 在厨师食谱中使用变量

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

我正在使用chef cookbook hostname cookbook设置节点的主机名。我不希望在属性文件中硬编码主机名(默认值['set\u fqdn'])

相反,主机名将从VM定义XML文件中读取。我提出了以下默认配方,但显然变量fqdn没有给定值。你知道为什么会发生这种情况,或者更好地完成我的任务吗

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']}