Chef에서 Source에서 무언가를 설치하는 Cookbook의 연습

Chef에서 Source에서 무언가를 설치하는 Cookbook의 연습

2022-10-05 last update

8 minutes reading infrastructure chef 루비
이 기사는 최종 업데이트 이후 1년 이상 경과되었습니다. 조심해.

Chef의 레시피로 소스에서 뭔가를 make하고 install을하는 방법은 개인에 의해 마을인가 생각합니다.

이런 느낌으로 하고 있습니다.

개요



Joyent SmartOS에 ird 서버 데몬 ngircd를 설치하고 서비스로 시작합니다.

이 Cookbook은 Github에 게시됩니다. higanworks-cookbooks/ngircd_smartos(v0.1.1)

추가: 속편을 할 수 있었습니다! [LWRP에 의한]계속·Chef로 Source로부터 무언가를 설치하는 Cookbook의 워크스루

조리법의 흠뻑 해설


  • 로컬에 원하는 파일이 없으면 가져온다
  • 파일을 가져 오면 make & install , 로컬이 있으면 아무것도하지 않습니다
  • 서비스 등록
  • 서비스 시작

  • attributes



    attributes/default.rb
    ## base settings
    default['ngircd']['conf_dir'] = '/opt/local/etc'
    default['ngircd']['conf_motd'] = '/opt/local/etc'
    
    
    ## repository
    default['ngircd']['site_url'] = 'http://ngircd.barton.de/pub/ngircd/'
    default['ngircd']['arch_file'] = 'ngircd-20.2.tar.gz'
    
    ## for tempolary working
    default['ngircd']['working_dir'] = ::File.join(Chef::Config[:file_cache_path], 'ngircd')
    default['ngircd']['configure_flags'] = ' --prefix=/opt/local --with-openssl'
    
    attributes 에는 환경에 의해 변경할지도, 라고 하는 요소를 두고 있습니다.
    로컬의 파일 체크에는, file_cache_path (을)를 사용하도록(듯이) 하고 있기 때문에, Chef::Config[:file_cache_path] (은)는 서버 인스턴스의 리부트로 내용이 사라지지 않는 패스로 해 두는 것이 좋습니다.

    recipes



    리소스별로 주석을 달아 봅니다.

    recipes/default.rb
    directory node['ngircd']['working_dir'] do
      action :create
    end
    
    bash 'make and install ngircd' do
      action :nothing
      flags '-ex'
      cwd node['ngircd']['working_dir']
      code <<-EOH
    tar xzf #{node['ngircd']['arch_file']}
    cd #{::File.basename(node['ngircd']['arch_file'], '.tar.gz')}
    ./configure #{node['ngircd']['configure_flags']}
    make -j2
    make install
    EOH
    end
    
    remote_file ::File.join(node['ngircd']['working_dir'], node['ngircd']['arch_file']) do
      action :create_if_missing
      source node['ngircd']['site_url'] + node['ngircd']['arch_file']
      notifies :run, 'bash[make and install ngircd]', :immediately
    end
    
    smf 'ngircd' do
      start_command '/opt/local/sbin/ngircd'
      start_timeout 120
      stop_command '/usr/bin/pkill ngircd'
      stop_timeout 120
    end
    
    service 'ngircd' do
      action :enable
    end
    

    directory node['ngircd']['working_dir']


    file_cache_path 아래에 ngircd 라는 디렉토리를 만들고, ngircd 관계는 거기에 정리하도록 하고 있습니다. 수가 늘어나면 좋을 수 있기 때문에.

    bash 'make and install ngircd'



    매번 달리지 않도록 action :nothing 입니다.
    요소로부터 notifies 로 불리기 위해서 정의하고 있습니다.
    flags-e 를 포함하면 bash -e 가 되어, 도중의 커멘드가 exit_status ≠ 0 의 경우 멈춰 달라고 합니다.
    code는 일반 스크립트입니다.

    remote_file ::File.join(node['ngircd']['working_dir'], node['ngircd']['arch_file'])


    action :create_if_missing 에 로컬에 파일이 있으면 아무것도 하지 않는 선택을 지정합니다.
    단지 :create 의 지정이라면, remote_file 는 매회 취해 와 sha 비교등을 합니다만 거기까지의 것도 아니기 때문에.

    이 리소스에 업데이트가 있으면(※파일을 실제로 가져왔다), 이전 bash[make and install ngircd]run 액션을 통지합니다. :immediately:immediately 를 생략하면 실행이 나중에 수행됩니다. 나중에 service['ngircd'] 리소스가 있고 ngirc 본문 설치를 완료하려면 bash 를 즉시 실행해야 합니다.

    smf 'ngircd'



    이것은 smartos 에 대한 서비스 등록 리소스입니다. svcadm 에서 ngircd

    서비스 'ngircd'



    서비스를 시작합니다. bash 실행이 끝나지 않으면 당연히 실패합니다.

    결론



    그래서 소스에서 뭔가를 넣는 레시피, 내 방식을 소개해 보았습니다.

    더 좋은 느낌의 방법이나, 이런 때는 어떻게 하고 있는 거야? 라는 것에 흥미가 있으면 코멘트등에서 아는 범위에서 대답합니다.

    추가: 속편을 할 수 있었습니다! [LWRP에 의한]계속·Chef로 Source로부터 무언가를 설치하는 Cookbook의 워크스루