Cloud Computing & MSA

CHEF Cookbook 내 파일 (설치 파일 등) 관리 - remote_file, cookbook_file

강철지그·2016년 3월 20일·조회 3,286

오랜만에 강철지그가 인사드립니다. 오늘의 주제는 CHEF의 Cookbook입니다.

Cookbook 안에서 외부 파일을 가져와야 하는 경우가 있습니다. 예를 들어 각종 설치 파일이나 압축 파일을 미리 내려받아 특정 디렉터리에 배치해야 할 때입니다.

외부 URL에서 파일 가져오기

먼저 생각해 볼 수 있는 방법은 외부 URL 혹은 다운로드 서버로부터 파일을 가져오는 것입니다. Chef에서는 remote_file 리소스를 사용할 수 있습니다.

remote_file "#{node[:DOWNLOAD_DIR]}/#{node[:FILE_NAME]}.tar.gz" do
  source "http://#{node[:SERVER]}/#{node[:FILE_NAME]}"
  action :create
  not_if { ::File.exist?("#{node[:DOWNLOAD_DIR]}/#{node[:FILE_NAME]}.tar.gz") }
end

위 예제는 SERVER/FILE_NAME으로부터 외부 파일을 가져와서 DOWNLOAD_DIR/FILE_NAME.tar.gz 위치에 저장합니다. 파일을 실제로 내려받아 생성하려면 remote_file의 일반적인 동작인 :create를 사용합니다. :touch는 파일의 수정 시간을 갱신하는 용도에 가깝기 때문에 다운로드 목적에는 맞지 않습니다.

Cookbook에 포함된 파일 배포하기

또 다른 방법은 Cookbook 안에 파일을 포함해 두고, cookbook_file 리소스로 대상 서버에 복사하는 것입니다. 이 방식은 설치 파일이나 설정 템플릿처럼 Cookbook과 함께 관리하고 싶은 파일에 적합합니다.

cookbook_file "#{node[:DOWNLOAD_DIR]}/#{node[:FILE_NAME]}.tar.gz" do
  source "#{node[:HTTPD][:FILE_NAME]}.tar.gz"
  owner "#{node[:FILE_USER_NAME]}"
  group "#{node[:FILE_USER_GROUP]}"
  mode '0700'
  not_if { ::File.exist?("#{node[:DOWNLOAD_DIR]}/#{node[:FILE_NAME]}.tar.gz") }
end

위는 소유자, 그룹, 파일 권한도 함께 지정하는 예입니다. cookbook_file에서 참조하는 원본 파일은 일반적으로 Cookbook의 files/default 아래에 두고 관리합니다.

두 방식의 차이는 파일의 출처입니다. 파일을 외부 서버에서 매번 가져와야 한다면 remote_file이 적합하고, Cookbook 자체에 포함해 배포하고 싶다면 cookbook_file이 적합합니다. 간단히 확인하려면 Chef 실행 후 대상 경로에 파일이 생성되었는지, 소유자와 권한이 의도한 값으로 설정되었는지 확인하면 됩니다.

File.exists? 대신 File.exist? 사용하기

한편, 파일의 존재 여부를 확인할 때 exists?를 사용하는 경우가 있습니다만, exists?는 deprecated되었습니다. 따라서 exists?가 아닌 exist?를 사용하는 것이 좋습니다.

exists?(file_name) → true or false
Deprecated method. Don’t use.

댓글 0

로그인 후 댓글을 남길 수 있습니다.

아직 댓글이 없습니다.