오랜만에 강철지그가 인사드립니다. 오늘의 주제는 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.