Chef를 사용하여 서비스가 실행되도록하는 방법은 무엇입니까?


10

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 검사 서비스가 덜 일치 실행되고 있는지 여부를 우리가 관심을 가져야하는 이유는 표시되지 않습니다 !)

답변:


11

기본적으로 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

이것은 유용하지만 질문에 대한 답은 아닙니다. 나는 그것을 말하고 싶어 :start 상관없이:status. 또한 나는 그것이 ps -ef | grep [p]ostgresql비슷하거나 유사하기를 바랍니다 . 그렇지 않으면 일반적으로 자체 grep 명령과 일치하므로 항상 서비스가 실행되고 있다고 생각합니다. (또는 이것이 근본적인 문제일까요?)
부분적으로 흐린

Chef에 버그가 있거나 시스템에 문제가있는 것 같습니다. 어떤 플랫폼 / 플랫폼 _ 버전을 실행 중입니까? postgresql을 어떻게 설치 했습니까? 패키지, 소스?
jtimberman

엄밀히 말해서 Chef는 선언적 방식으로 정의 된 리소스를 관리하기 위해 dem 등식 조치를 취합니다. Chef를 통해 서비스가 실행되도록하는 방법은 시작 조치를 서비스로 보내는 것입니다. 이것이 발생하지 않으면 Chef의 버그, 레시피의 버그 또는 시스템의 버그입니다.
jtimberman

감사합니다 @jtimberman. tickets.opscode.com/browse/COOK-334 에서 잘못된 상태가 반환되는 버그를 열었습니다 . 그러나 내 질문은 요리사가 서비스 시작 명령을 발행하고 상태 확인을 건너 뛸 수있는 방법이 있는지 여부입니다. service start거의 항상 dem 등원이므로 괜찮을 것입니다.
부분적으로 흐린

죄송합니다. bug는 tickets.opscode.com/browse/COOK-3526 입니다.
부분적으로 흐린
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.