2016-11-01 15 views
-1

シェフには、NTPサーバーを実行している3つのインスタンスからNTPプロトコルを使って時刻を取得するbashスクリプトがあります。現在のコードはシェフでbashルーチンをどのようにループできますか?

if not node.run_list.roles.include?("ntp_server") 
    bash "ntpdate" do 
    code <<-EOH 
    /usr/sbin/ntpdate -s 10.204.255.15 10.204.251.41 10.204.251.21 
    EOH 
    end 
end 

です。これはうまくいきました。しかし、インスタンスの1つが置き換えられた場合など、上記のコードでIPを更新するための手動介入は必要ありませんなど、タスクを自動化することになっています。

これを達成するために、ntp_serverロールを実行しているインスタンスを正常に取得できました。

ntp_servers = search(:node, 'role:ntp_server') 

これを実行すると、上のコードに示すbashサブルーチンにこれらのIPを追加できません。

私はそれを達成するはずですか?

答えて

1
  1. シェフの実行ごとにbashブロックを使用してntpdateを呼び出すべきではありません。 ntpdはクロックが同期している必要があります。シェフはcookbookです。
  2. IPアドレスをノードに移動し、コード内でjoinを使用できます。

    ... 
    code "/usr/sbin/ntpdate -s #{node["ntp_ipaddresses"].join(" ")}" 
    ... 
    
  3. ntp料理本を使用してください。

+0

ご入力いただきありがとうございます。私がやりたいことを解決することができました(以下の答えとして追加されました)が、ベストプラクティスに従うので、あなたの意見を答えとして投票したいと思っています。 – user5241806

0

質問に投稿した内容を解決することができました。私がやったやり方は、テンプレートを使い、次にbashスクリプトを使うことでした。レシピコードは今

ntp_servers = search(:node, 'role:ntp_server') 

if not node.run_list.roles.include?("ntp_server") 
    template "/usr/local/bin/ntpdate.sh" do 
    source "ntpdate.sh.erb" 
    owner "root" 
    group "root" 
    mode 0644 
    variables(
     :ntp_servers => ntp_servers 
    ) 
    end 

    bash "ntpdate" do 
    user "root" 
    code <<-EOH 
     bash /usr/local/bin/ntpdate.sh 
    EOH 
    end 
end 

がこれを行ったに見え、私は次のような構成

#!/bin/bash 
/usr/sbin/ntpdate -s <% @ntp_servers.each do |ntp_server| -%> <%= ntp_server['ipaddress'] %> <% end -%> 

私は動的役割に所属するサーバのIPアドレスを追加することができませんでした。この方法でシェフにテンプレートを作成しましたntp_server

関連する問題