예제 3: 디렉터리 생성 - AWS OpsWorks

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

예제 3: 디렉터리 생성

중요

이 AWS OpsWorks Stacks 서비스는 2024년 5월 26일에 수명이 종료되었으며 신규 및 기존 고객 모두 사용할 수 없게 되었습니다. 고객은 가능한 한 빨리 워크로드를 다른 솔루션으로 마이그레이션할 것을 강력히 권장합니다. 마이그레이션에 대해 궁금한 점이 있으면 AWS re:Post 또는 Premium AWS Support를 통해 AWS Support 팀에 문의하세요.

인스턴스에 패키지를 생성할 때 일부 구성 파일을 생성해 적절한 디렉터리에 넣어야 하는 경우가 많습니다. 하지만 이런 디렉터리가 아직 없을 수 있습니다. 데이터, 로그 파일 등을 위한 디렉터리를 생성해야 할 수도 있습니다. 예를 들어 대부분의 예제에 사용하는 Ubuntu 시스템을 처음 부팅하면 /srv 디렉터리에 하위 디렉터리가 없습니다. 애플리케이션 서버를 설치하는 경우, /srv/www/ 디렉터리 이외에 데이터 파일, 로그 등을 저장하기 위한 몇몇 하위 디렉터리가 필요할 것입니다. 다음 레시피는 인스턴스에 /srv/www/를 생성합니다.

directory "/srv/www/" do mode 0755 owner 'root' group 'root' action :create end

directory 리소스를 사용하여 Linux 시스템과 Windows 시스템에서 디렉터리를 생성하고 구성할 수 있습니다. 단, 일부 속성은 서로 다르게 사용됩니다. 리소스 이름은 리소스의 path 속성에 대한 기본값이므로 이 예제에서는 /srv/www/를 생성하고 이 디렉터리의 mode, ownergroup 속성을 지정합니다.

레시피를 실행하려면
  1. opsworks_cookbooks 안에 createdir 하위 디렉터리를 만들고 그 디렉터리로 이동합니다.

  2. 예제 1: 패키지 설치 단원에서 설명하는 대로 Test Kitchen을 초기화 및 구성하고 recipes 디렉터리 내에서 createdir 디렉터리를 추가합니다.

  3. 레시피 코드가 포함된 default.rb 파일을 쿡북의 recipes 디렉터리에 추가합니다.

  4. kitchen converge를 실행하여 레시피를 실행합니다.

  5. kitchen login을 실행하고, /srv로 이동하여 여기에 www 하위 디렉터리가 있는지 확인합니다.

  6. exit를 실행하여 워크스테이션으로 돌아가되 인스턴스를 실행 중인 상태로 둡니다.

참고

인스턴스에서 홈 디렉터리에 관련된 디렉터리를 생성하려면 #{ENV['HOME']}을 사용하여 홈 디렉터리를 나타냅니다. 예를 들어 다음은 ~/shared 디렉터리를 생성합니다.

directory "#{ENV['HOME']}/shared" do ... end

/srv/www/shared와 같이 더 깊이 중첩된 디렉터리를 만들려 한다고 가정해 봅시다. 앞의 레시피를 다음과 같이 수정할 수 있습니다.

directory "/srv/www/shared" do mode 0755 owner 'root' group 'root' action :create end
레시피를 실행하려면
  1. default.rb의 코드를 이전 레시피로 바꿉니다.

  2. kitchen converge 디렉터리에서 createdir를 실행합니다.

  3. 해당 디렉터리가 생성되었는지 확인하려면 kitchen login을 실행하고 /srv/www로 이동하여 여기에 shared 하위 디렉터리가 있는지 확인합니다.

  4. kitchen destroy를 실행하여 인스턴스를 종료합니다.

kitchen converge 명령이 훨씬 빠르게 실행되는 것을 알 수 있습니다. 그 이유는 인스턴스가 이미 실행되고 있어서 인스턴스를 부팅하고 Chef를 설치하는 등의 작업이 필요 없기 때문입니다. Test Kitchen은 업데이트된 쿡북을 인스턴스에 복사하고 Chef 실행을 시작하면 됩니다.

이제 kitchen converge를 다시 실행하면 새로운 인스턴스에서 레시피가 실행됩니다. 이제 다음과 같은 결과를 보게 됩니다.

Chef Client failed. 0 resources updated in 1.908125788 seconds [2014-06-20T20:54:26+00:00] ERROR: directory[/srv/www/shared] (createdir::default line 1) had an error: Chef::Exceptions::EnclosingDirectoryDoesNotExist: Parent directory /srv/www does not exist, cannot create /srv/www/shared [2014-06-20T20:54:26+00:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1) >>>>>> Converge failed on instance <default-ubuntu-1204>. >>>>>> Please see .kitchen/logs/default-ubuntu-1204.log for more details >>>>>> ------Exception------- >>>>>> Class: Kitchen::ActionFailed >>>>>> Message: SSH exited (1) for command: [sudo -E chef-solo --config /tmp/kitchen/solo.rb --json-attributes /tmp/kitchen/dna.json --log_level info] >>>>>> ----------------------

어떻게 된 걸까요? 문제는 기본적으로 directory 리소스가 한 번에 한 디렉터리만 생성할 수 있고 디렉터리의 체인은 생성할 수 없다는 것입니다. 앞에서 레시피가 작동했던 이유는 인스턴스에서 제일 먼저 실행한 레시피가 이미 /srv/www를 생성했기 때문에 /srv/www/shared 생성으로 하나의 하위 디렉터리만 생성됐기 때문입니다.

참고

kitchen converge를 실행할 때는 레시피를 새 인스턴스에서 실행하는지 기존 인스턴스에서 실행하는지 알아야 합니다. 결과가 상이할 수 있습니다.

하위 디렉터리 체인을 생성하려면 recursive 속성을 directory에 추가하고 true로 설정합니다. 다음 레시피는 깨끗한 인스턴스에 /srv/www/shared 디렉터리를 생성합니다.

directory "/srv/www/shared" do mode 0755 owner 'root' group 'root' recursive true action :create end