3

ノードのホスト名をセットアップするためにchef-cookbook-hostnameクックブックを使用しています。ホスト名を属性ファイル (default['set_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
4

4 に答える 4

14

ここでの問題の原因は、変数 fqdn を ruby​​_block のスコープ内に設定し、コンパイル段階でその変数を参照しようとしていることです。ruby_block リソースを使用すると、収束フェーズで Ruby コードを実行できます。

fqdn を使用してリソース セットをセットアップしているように見えることを考えると、ruby コードの周りから ruby​​ ブロックを削除できるように見えます。例えば

fqdn = // logic to get fqdn

file '/tmp/file' do
  content "fqdn=#{fqdn}"
end
于 2014-05-08T20:15:08.637 に答える
11

私はこれをシェフのドキュメントで見つけました。同様の問題に遭遇しました。を試してみますnode.run_state。この情報は、このページの下部にありますhttps://docs.chef.io/recipes.html

node.run_stateシェフクライアントの実行中に一時データを隠しておくために使用します。このデータはリソース間で渡され、実行フェーズで評価されます。run_stateシェフクライアントの実行の最後に常に破棄される空のハッシュです。

たとえば、次のレシピでは Apache Web サーバーをインストールし、スクリプト言語として PHP または Perl をランダムに選択してから、そのスクリプト言語をインストールします。

package "httpd" do
  action :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
end

package "scripting_language" do
  package_name lazy { node.run_state['scripting_language'] }
  action :install
end
于 2014-11-02T20:24:33.740 に答える