아직 존재하지 않는 것을 요리하는 법


9

다음과 같은 Chef 코드가 있다고 가정 해 보겠습니다.

require 'mixlib/shellout'
yum_package 'somepackage'
myvar =  Mixlib::ShellOut.new('/bin/somecommand').run_command.stdout.strip

/bin/somecommand의해 설치되어 아직 존재하지 않는 위치 somepackage입니다. 그 이유는 래서 피 컴파일 타임에 실패하지만 패키지 설치를 성공적으로 제공하는 컨버전스 타임에 분명히 작동합니다 (그렇지 않으면 레시피에 실패했을 것입니다). 패키지가 모두 사전에 함께 컴파일되기 때문에 패키지가 런리스트에서 이전 레시피가 설치된 경우에도 실패합니다. 해당 레시피 또는 런리스트가 설치하는 것을 Chef 레시피에 포함 시키려면 어떻게해야합니까?


이런 종류의 문제는 CFEngine에서 문제가되지 않습니다
Gaius

1
myvar실제 답변이 없다는 것에 대한 통찰력이 없으면 일반적으로 다른 리소스를 정의 할 필요가 없으면 컴파일 타임에 외부 명령의 코드 평가를 사용하지 않습니다. 간단히 말해,ruby_block 'set myvar' { node.run_state['myvar'] = Mixlib::ShellOut.[...] }
Tensibai

@ Tensibai node.run_state는 내가 찾던 것과 정확히 일치했습니다. 감사합니다. 답변을 드리겠습니다. 수락하겠습니다.
Gaius

내일까지 기다려야 할 것이다 :) 전화에 정확한 답변을하기에는 너무 어렵다
Tensibai

답변:


4

나는 함께 가고 싶어 node.run_state실행에 일시적인 변수를 저장하고 그것을 정의 ruby_block는 다음과 같이 수렴 시간에 뭔가를 발생 있도록 :

yum_package 'somepackage'

ruby_block 'set myvar' do
  block do
    node.run_state['my_var'] = Mixlib::ShellOut.new('/bin/somecommand').run_command.stdout.strip
  end
end

내가 'mixlib / shellout'을 요구한다는 것을 아는 한 필요하지 않습니다.


2

구체적인 사용 사례에 따라 다릅니다. 값이 다른 리소스의 속성으로 만 사용되는 경우 lazy도우미 메서드를 사용합니다 . 출력이 필요하지 않으면 execute리소스를 사용합니다 . 좀 더 복잡한 경우에는 ruby_block리소스를 사용 하거나 고유 한 사용자 지정 리소스를 작성할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.