2016-11-01 2 views
-1

저는 Chef에서 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 

입니다.이 코드는 정상적으로 작동합니다. 그러나 인스턴스 중 하나를 대체 한 경우 위의 코드에서 IP를 업데이트하는 데 필요한 수동 개입이없는 경우와 같은 작업을 자동화해야합니다.

이를 달성하기 위해 ntp_server 역할을 실행하는 인스턴스를 성공적으로 가져올 수있었습니다.

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

이렇게 했더니 위 IP에 표시된 IP의 bash 서브 루틴에 코드를 추가 할 수 없습니다.

누군가 내가 그 사실을 어떻게 알았는지 알려줄 수 있습니까?

답변

1
  1. bash 블록을 사용하지 않고 ntpdate를 각 요리사가 실행하면 안됩니다. ntpd가 동기화되는 시계를 처리해야합니다. Chef에게는 cookbook이 있습니다.
  2. IP 주소를 노드로 이동하고 코드에서 결합을 사용할 수 있습니다.

    ... 
    code "/usr/sbin/ntpdate -s #{node["ntp_ipaddresses"].join(" ")}" 
    ... 
    
  3. ntp 요리 책을 사용하십시오.

+0

@Szymon에 감사드립니다. 비록 내가 의도 한 바를 해결할 수 있었지만 (아래 답변으로 추가), 당신의 의견을 답변으로 투표하기를 원합니다. – 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

관련 문제