Chef를 사용하여 서비스가 실행되도록하는 방법은 무엇입니까? service … status서비스 에 대해 어떻게

Chef가 서비스 (postgres)를 시작할 수있는 상황이지만 이후 대역 외에서 중지 될 수 있습니다. 후속 Chef 실행으로 서비스가 실행되기를 원합니다. 나는 이것을 시도했다 :

service "postgresql" do
    action :start
end

그러나 (up to date)Chef는 그것이 시작되었다는 것을 알고 그것이 중지되었다고 말할 수 없기 때문에 효과 가 없습니다. (아마도이 service ... status서비스 에 대해 어떻게 행동합니까?)

# anti-pattern warning!
execute "force-start-postgresql" do
  command "service postgresql start || /etc/init.d/postgresql start"
  action :run
end

원하는 행동을 취합니다. 또한 action :restart실행합니다. 그러나 이들은 이식성으로 인해 안티 패턴처럼 보입니다 (후자의 경우 다시 시작하기 전에 잠재적으로 중지).

그렇다면 Chef가 서비스가 이미 실행되고 있다고 생각하더라도 서비스를 강제로 시작하도록하려면 어떻게해야합니까?

이것은 OpsCode가 호스팅하는 Chef 11.6 및 기본 postgresql 레시피를 사용합니다. (이것은 비슷하지만 Chef의 “최신”리소스에 대한 작업을 강제하는 방법 과는 같지 않습니다 .)

편집 (jtimberland 게시물에 따른 설명) —

-l debug여기 쇼 :

DEBUG: service[postgresql] supports status, running
DEBUG: service[postgresql] is running

실행 중이 아니더라도. 그래서 그것은 하나의 버그처럼 들립니다. 그러나 나는 Chef에게 “항상 상태 확인을 건너 뛰고 서비스 시작 명령을 호출합니다”라고 말하는 방법이 있는지에 관심이 있습니다. 이것이 바로 질문입니다.

(내가 전문가는 아니지만 그러나 나는 서비스를 보장하는 대부분의 휴대용 방법은 서비스를 시작하는 것입니다 실행 생각하고는 거의 항상 나무 등이다. OTOH 검사 서비스가 덜 일치 실행되고 있는지 여부를 우리가 관심을 가져야하는 이유는 표시되지 않습니다 !)



답변

기본적으로 Chef는 서비스가 실행 중인지 확인하고 서비스가 실행되지 않으면 시작합니다.

서비스 실행 여부를 결정하는 방법에 따라 다릅니다.

기본적으로 Chef는을 postgresql사용하여 프로세스 테이블에서 서비스 이름 ( 여기) 과 일치 시키려고합니다 ps.

ps -ef | grep postgresql

본질적으로. 서비스 이름은 프로세스 테이블을 검사 할 때 패턴 일치에 사용됩니다. 이는 특히 플랫폼과 “postgresql”서비스의 이름을 지정하는 방식에 따라 원하는 / 필요한 것일 수도 있고 아닐 수도 있습니다.

그러나 서비스가 “상태”명령을 지원한다고 Chef에 알릴 수 있습니다. 즉, Chef는 일반적으로 다음과 같은 작업을 수행합니다.

/etc/init.d/postgresql status

리턴 코드를 사용하여 실행 중인지 여부를 판별하십시오 (0이 아닌 것이 실행되지 않음).

Chef는 모든 서비스 스크립트가 상태 명령을 지원하지 않기 때문에 기본적으로이 작업을 수행하지 않습니다. 제정신이 아닌 일을하려고하지만 때로는 순진합니다. 따라서 Chef에 리소스에 상태 명령이 있고 순진하지 않다고 말할 수 있습니다.

service "postgresql" do
  supports :status => true
  action :start
end

이제 서비스 이름이 실제로 “postgresql”이 아니라 “postgresql-92″또는 이와 유사한 경우 다음과 같이 수행 할 수 있습니다.

service "postgresql-92" do
  supports :status => true
  action :start
end

또는

service "postgresql" do
  service_name "postgresql-92"
  supports :status => true
  action :start
end

chef를 디버그 출력으로 실행하여 진행중인 작업을보다 자세히 확인할 수 있습니다.

chef-client -l debug