首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Chef食谱中使用变量

在Chef食谱中使用变量
EN

Stack Overflow用户
提问于 2014-05-09 03:42:42
回答 4查看 40.1K关注 0票数 3

我使用chef- cookbook -hostname cookbook来设置节点的主机名。我不希望我的主机名被硬编码到属性文件中(默认的‘’set_fqdn‘)。

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

代码语言:javascript
复制
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
EN

回答 4

Stack Overflow用户

发布于 2014-05-09 04:15:09

这里的问题根源在于,您在ruby_block的作用域中设置了变量fqdn,并试图在编译阶段引用该变量。ruby_block资源允许在收敛阶段运行ruby代码。

鉴于您似乎正在使用fqdn来设置资源集,看起来您可以从ruby代码周围删除ruby块。例如:

代码语言:javascript
复制
fqdn = // logic to get fqdn

file '/tmp/file' do
  content "fqdn=#{fqdn}"
end
票数 14
EN

Stack Overflow用户

发布于 2014-11-03 04:24:34

我在厨师文档里找到了这个。我遇到了类似的问题。我要试试node.run_state。此信息位于此页面https://docs.chef.io/recipes.html的底部

在chef-client运行期间使用node.run_state来隐藏瞬态数据。这些数据可以在资源之间传递,然后在执行阶段进行评估。run_state是一个空的散列,它总是在chef-client运行结束时被丢弃。

例如,下面的方法将安装Apache web服务器,随机选择PHP或Perl作为脚本语言,然后安装该脚本语言:

package "httpd“执行操作:install end ruby_block "randomly_choose_language”do block do if Random.rand > 0.5 node.run_state‘’scripting_language‘= 'php’else node.run_state‘’scripting_language‘= 'perl’end end package "scripting_language“do package_name lazy {node.run_state‘’scripting_language‘}操作:安装end

票数 11
EN

Stack Overflow用户

发布于 2017-02-03 15:05:59

请点击此链接,您可以使用node.run_state:variables将一个变量解析为另一个菜谱

这是我的代码::file.rb

node.run_state:script_1 = "foo“include_recipe 'provision::copy‘

并在其他copy.rb文件中放入以下代码:

copy.rb

filename = node.run_state:script_1放入“名称是#{filename}”

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23551104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档