

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

# 예제 6: 파일 생성
<a name="cookbooks-101-basics-files"></a>

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

디렉터리를 생성한 후 구성 파일, 데이터 파일 등으로 디렉터리를 채워야 하는 경우가 많습니다. 이 주제에서는 인스턴스에 파일을 설치하는 두 가지 방법을 살펴봅니다.

**Topics**
+ [쿡북에서 파일 설치](#cookbooks-101-basics-files-cookbook_file)
+ [템플릿에서 파일 생성](#cookbooks-101-basics-files-template)

## 쿡북에서 파일 설치
<a name="cookbooks-101-basics-files-cookbook_file"></a>

인스턴스에 파일을 설치하는 가장 간단한 방법은 [https://docs.chef.io/chef/resources.html#cookbook-file](https://docs.chef.io/chef/resources.html#cookbook-file) 리소스를 사용하는 것입니다. 이 방법은 Linux와 Windows 시스템 모두 쿡북에서 파일을 인스턴스의 지정된 위치로 복사합니다. 이 예제는 [예제 3: 디렉터리 생성](cookbooks-101-basics-directories.md) 단원의 레시피를 확장해 디렉터리 생성 후 데이터 파일을 `/srv/www/shared`에 추가합니다. 다음은 참조용 원래 레시피입니다.

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

**쿡북을 설정하려면**

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

1. `createfile`에 다음 콘텐츠가 포함된 `metadata.rb` 파일을 추가합니다.

   ```
   name "createfile"
   version "0.1.0"
   ```

1. [예제 1: 패키지 설치](cookbooks-101-basics-packages.md) 단원에서 설명하는 대로 Test Kitchen을 초기화 및 구성하고 `platforms` 목록에서 CentOS를 제거합니다.

1. `recipes` 하위 디렉터리를 `createfile`에 추가합니다.

설치할 파일에는 다음 JSON 데이터가 포함됩니다.

```
{
  "my_name" : "myname",
  "your_name" : "yourname",
  "a_number" : 42,
  "a_boolean" : true
}
```

**데이터 파일을 설정하려면**

1. `files` 하위 디렉터리는 `createfile`에, `default` 하위 디렉터리는 `files`에 추가합니다. `cookbook_file`을 사용하여 설치한 모든 파일은 `files`의 하위 디렉터리에 있어야 하며, 예를 들어 이 예에서는 `files/default`입니다.
**참고**  
시스템마다 다른 파일을 지정하려면 시스템의 이름을 딴 하위 폴더(예: `files/ubuntu`)에 각 시스템별 파일을 저장할 수 있습니다. `cookbook_file` 리소스는 해당하는 시스템별 파일이 있는 경우 복사하고 없는 경우 `default` 파일을 사용합니다. 자세한 정보는 [cookbook\$1file](https://docs.chef.io/chef/resources.html#cookbook-file) 단원을 참조하세요.

1. 이전 예제의 JSON을 사용하여 `example_data.json` 파일을 만들어 `files/default`에 추가합니다.

다음 레시피는 `example_data.json`을 지정된 위치로 복사합니다.

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

cookbook_file "/srv/www/shared/example_data.json" do
  source "example_data.json"
  mode 0644
  action :create_if_missing
end
```

디렉터리 리소스가 `/srv/www/shared`를 생성한 후 `cookbook_file` 리소스가 `example_data.json`을 해당 디렉터리로 복사하고 파일의 사용자, 그룹, 모드도 설정합니다.

**참고**  
`cookbook_file` 리소스는 `create_if_missing`이라는 새로운 작업을 도입합니다. `create` 작업도 사용할 수 있지만 이 작업은 기존 파일을 덮어씁니다. 아무것도 덮어쓰지 않으려면 아직 존재하지 않는 경우에 한해 `create_if_missing`을 설치하는 `example_data.json`을 사용하세요.

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

1. `kitchen destroy`를 실행하여 깨끗한 인스턴스로 시작합니다.

1. 이전 레시피가 포함된 `default.rb` 파일을 만든 다음 이 파일을 `recipes`에 저장합니다.

1. `kitchen converge`를 실행한 다음 인스턴스에 로그인하여 `/srv/www/shared` 디렉터리에 `example_data.json`이 포함되어 있는지 확인합니다.

## 템플릿에서 파일 생성
<a name="cookbooks-101-basics-files-template"></a>

`cookbook_file` 리소스는 일부 목적에는 유용하지만 쿡북에 있는 파일이라면 무엇이든 설치합니다. [https://docs.chef.io/chef/resources.html#template](https://docs.chef.io/chef/resources.html#template) 리소스는 템플릿에서 동적으로 파일을 생성함으로써 Windows 또는 Linux 인스턴스에 파일을 설치하는 보다 유연한 방법을 제공합니다. 그러면 실행 시간에 파일의 콘텐츠의 세부 정보를 확인하고 필요에 따라 변경할 수 있습니다. 예를 들어 인스턴스를 시작할 때는 구성 파일이 특정 설정을 갖고 나중에 스택에 더 많은 인스턴스를 추가할 때 이 설정을 수정하기를 원할 수 있습니다.

이 예제는 `createfile` 리소스를 사용하여 약간 수정된 `template` 버전을 설치하도록 `example_data.json` 쿡북을 수정합니다.

설치된 파일은 다음과 같이 보입니다.

```
{
  "my_name" : "myname",
  "your_name" : "yourname",
  "a_number" : 42,
  "a_boolean" : true,
  "a_string" : "some string",
  "platform" : "ubuntu"
}
```

템플릿 리소스는 일반적으로 속성 파일과 함께 사용되므로 예제에서는 속성 파일을 사용하여 다음 값을 지정합니다.

```
default['createfile']['my_name'] = 'myname'
default['createfile']['your_name'] = 'yourname'
default['createfile']['install_file'] = true
```

**쿡북을 설정하려면**

1. `createfile` 쿡북의 `files` 디렉터리와 포함된 내용을 모두 삭제합니다.

1. `attributes` 하위 디렉터리를 `createfile`에 추가하고, `default.rb` 파일을 이전 속성 정의가 포함된 `attributes`에 추가합니다.

템플릿은 기본적으로 콘텐츠 일부가 자리 표시자에 의해 표시되는 최종 파일의 사본인 `.erb` 파일입니다. `template` 리소스는 파일을 생성할 때 템플릿의 콘텐츠를 지정된 파일에 복사하고 자리 표시자를 할당된 값으로 덮어씁니다. 다음은 `example_data.json`에 대한 템플릿입니다.

```
{
  "my_name" : "<%= node['createfile']['my_name'] %>",
  "your_name" : "<%= node['createfile']['your_name'] %>",
  "a_number" : 42,
  "a_boolean" : <%= @a_boolean_var %>,
  "a_string" : "<%= @a_string_var %>",
  "platform" : "<%= node['platform'] %>"
}
```

`<%=...%>` 값은 자리 표시자입니다.
+ `<%=node[...]%>`은 노드 속성 값을 나타냅니다.

  이 예제에서 "your\$1name" 값은 쿡북 속성 파일의 속성 값 중 하나를 나타내는 자리 표시자입니다.
+ `<%=@...%>`는 간략히 설명한 것처럼 템플릿 리소스에서 정의되는 변수의 값을 나타냅니다.

**템플릿 파일을 생성하려면**

1. `templates` 하위 디렉터리는 `createfile` 쿡북에, `default` 하위 디렉터리는 `templates`에 추가합니다.
**참고**  
`templates` 디렉터리는 `files` 디렉터리처럼 작동합니다. 시스템별 템플릿은 시스템 이름을 딴 하위 디렉터리(예: `ubuntu`)에 저장할 수 있습니다. `template` 리소스는 해당하는 시스템별 템플릿이 있는 경우 사용하고 없는 경우 `default` 템플릿을 사용합니다.

1. `example_data.json.erb`라는 파일을 만들어 `templates/default` 디렉터리에 저장합니다. 템플릿 이름은 임의적이지만 일반적으로 파일 이름에 확장명을 포함해 `.erb`를 추가하여 템플릿 이름을 생성합니다.

다음 레시피는 `template` 리소스를 사용하여 `/srv/www/shared/example_data.json`을 생성합니다.

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

template "/srv/www/shared/example_data.json" do
  source "example_data.json.erb"
  mode 0644
  variables(
    :a_boolean_var => true,
    :a_string_var => "some string"
  )
  only_if {node['createfile']['install_file']}
end
```

`template` 리소스는 템플릿에서 `example_data.json`을 생성하여 `/srv/www/shared`에 설치합니다.
+ 템플릿 이름 `/srv/www/shared/example_data.json`은 설치된 파일의 경로와 이름을 지정합니다.
+ `source` 속성은 파일 생성에 사용되는 템플릿을 지정합니다.
+ `mode` 속성은 설치된 파일의 모드를 지정합니다.
+ 리소스는 `a_boolean_var`와 `a_string_var`라는 두 가지 변수를 정의합니다.

  리소스는 `example_data.json`을 생성할 때 템플릿의 변수 자리 표시자를 리소스의 해당 값으로 덮어씁니다.
+ `only_if` *guard* 속성은 `['createfile']['install_file']`이 `true`로 설정되는 경우에만 파일을 생성하라고 리소스에 명령합니다.

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

1. `kitchen destroy`를 실행하여 깨끗한 인스턴스로 시작합니다.

1. `recipes/default.rb`의 코드를 이전 예제로 바꿉니다.

1. `kitchen converge`를 실행한 다음 인스턴스에 로그인하여 파일이 `/srv/www/shared` 디렉터리에 있고 올바른 콘텐츠를 포함하고 있는지 확인합니다.

다 마치면 `kitchen destroy`를 실행해 인스턴스를 종료하세요. 다음 섹션에서는 새 쿡북을 사용합니다.