

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

# 예제 3: 디렉터리 생성
<a name="cookbooks-101-basics-directories"></a>

**중요**  
이 AWS OpsWorks Stacks 서비스는 2024년 5월 26일에 서비스 수명이 종료되었으며 신규 및 기존 고객 모두에서 비활성화되었습니다. 가능한 한 빨리 워크로드를 다른 솔루션으로 마이그레이션하는 것이 좋습니다. 마이그레이션에 대한 질문이 있는 경우 [AWS re:Post](https://repost.aws/) 또는 [AWS Premium Support](https://aws.amazon.com/support)를 통해 AWS Support 팀에 문의하세요.

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

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

[`directory` 리소스](https://docs.chef.io/chef/resources.html#directory)를 사용하여 Linux 시스템과 Windows 시스템에서 디렉터리를 생성하고 구성할 수 있습니다. 단, 일부 속성은 서로 다르게 사용됩니다. 리소스 이름은 리소스의 `path` 속성에 대한 기본값이므로 이 예제에서는 `/srv/www/`를 생성하고 이 디렉터리의 `mode`, `owner` 및 `group` 속성을 지정합니다.

**레시피를 실행하려면**

1. `opsworks_cookbooks` 안에 `createdir` 하위 디렉터리를 만들고 그 디렉터리로 이동합니다.

1. [예제 1: 패키지 설치](cookbooks-101-basics-packages.md) 단원에서 설명하는 대로 Test Kitchen을 초기화 및 구성하고 `recipes` 디렉터리 내에서 `createdir` 디렉터리를 추가합니다.

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

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

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

1. `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`의 코드를 이전 레시피로 바꿉니다.

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

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

1. `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
```