

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

# 예제 5: 속성 사용
<a name="cookbooks-101-basics-attributes"></a>

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

앞 섹션의 레시피는 플랫폼 이외의 모든 것에 하드코딩된 값을 사용했습니다. 이 방법은 예컨대 둘 이상의 레시피에 동일한 값을 사용하려는 경우, 불편할 수 있습니다. 쿡북에 속성 파일을 포함시키면 레시피와 별도로 값을 정의할 수 있습니다.

속성 파일은 하나 이상의 속성에 값을 할당하는 Ruby 애플리케이션입니다. 속성 파일은 쿡북의 `attributes` 폴더에 있어야 합니다. Chef는 속성을 노드 객체에 통합하며, 모든 레시피는 속성 단원을 참조하여 속성 값을 사용할 수 있습니다. 이 주제에서는 [반복](cookbooks-101-basics-ruby.md#cookbooks-101-basics-ruby-iteration)의 레시피를 수정하여 속성을 사용하는 방법을 살펴봅니다. 다음은 참조용 원래 레시피입니다.

```
[ "/srv/www/config", "/srv/www/shared" ].each do |path|
  directory path do
    mode 0755
    owner 'root'
    group 'root'
    recursive true
    action :create
  end
end
```

다음은 하위 디렉터리 이름, 모드, 소유자 및 그룹 값에 대해 속성을 정의합니다.

```
default['createdir']['shared_dir'] = 'shared'
default['createdir']['config_dir'] = 'config'
default['createdir']['mode'] = 0755
default['createdir']['owner'] = 'root'
default['createdir']['group'] = 'root'
```

다음 사항에 유의하세요.
+ 각 정의는 *속성 유형*으로 시작합니다.

  속성이 여러 번 정의된 경우(아마도 다른 속성 파일에서) 속성 유형에 따라 속성의 우선 순위가 지정되며, 이에 따라 노드 개체에 통합되는 정의가 결정됩니다. 자세한 내용은 [속성 우선 순위](workingcookbook-attributes-precedence.md) 섹션을 참조하세요. 이 예제의 모든 정의는 이 목적에 일반적인 유형인 `default` 속성 유형을 가지고 있습니다.
+ 속성에는 중첩된 이름이 있습니다.

  기본적으로 노드 객체는 임의로 깊이 중첩될 수 있는 해시 테이블이므로 속성 이름은 중첩이 가능하고 일반적으로 중첩됩니다. 이 속성 파일은 쿡북 이름인 `createdir`이 있는 중첩된 이름을 첫 번째 요소로 사용하는 표준 관행을 따릅니다.

createdir을 속성의 첫 번째 요소로 사용하는 이유는 Chef 실행 시 Chef가 모든 쿡북의 속성을 노드 객체에 통합하기 때문입니다. Stacks를 사용하면 노드 객체에는 정의한 속성 외에도 내장 OpsWorks 쿡북의 많은 속성이 포함됩니다. [https://github.com/aws/opsworks-cookbooks](https://github.com/aws/opsworks-cookbooks) 속성 이름에 쿡북 이름을 포함시키면 특히 속성이 `port` 또는 `user` 같은 이름을 가지고 있는 경우, 다른 쿡북의 속성과의 이름 충돌 위험이 줄어듭니다. 속성 값을 재정의하려는 경우가 아니라면 속성 이름을 [`[:apache2][:user]`](attributes-recipes-apache.md#attributes-recipes-apache-user)와 같이 명명하지 마십시오. 자세한 내용은 [사용자 지정 쿡북 속성 사용](workingcookbook-cookbook-attributes.md) 섹션을 참조하세요.

다음 예제는 하드코딩된 값 대신 속성을 사용하여 원래 레시피를 보여 줍니다.

```
[ "/srv/www/#{node['createdir']['shared_dir']}", "/srv/www/#{node['createdir']['config_dir']}" ].each do |path|
  directory path do
    mode node['createdir']['mode']
    owner node['createdir']['owner']
    group node['createdir']['group']
    recursive true
    action :create
  end
end
```

**참고**  
속성 값을 문자열에 통합하려면 `#{}`으로 묶습니다. 이전 예제에서 `#{node['createdir']['shared_dir']}`은 "shared"를 "/srv/www/"에 추가합니다.

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

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

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

1. `createdir`의 하위 디렉터리로 `attributes`를 만들고 속성 정의가 포함된 `default.rb` 파일을 추가합니다.

1. `.kitchen.yml`을 편집하여 플랫폼 목록에서 CentOS를 제거합니다.

1. `kitchen converge`를 실행한 다음 인스턴스에 로그인하여 `/srv/www/shared` 및 `/srv/www/config` 디렉터리가 있는지 확인합니다.

**참고**  
 OpsWorks Stacks를 사용하면 값을 속성으로 정의하면 추가 이점이 있습니다. 사용자 [지정 JSON](workingstacks-json.md)을 사용하여 스택별 또는 배포별로 해당 값을 재정의할 수 있습니다. 이는 다음을 비롯한 다양한 목적에 유용할 수 있습니다.  
쿡북을 수정할 필요 없이 구성 설정이나 사용자 이름 등 레시피의 동작을 사용자 지정할 수 있습니다.  
예를 들어 서로 다른 스택에 같은 쿡북을 사용하고 사용자 지정 JSON을 사용하여 특정 스택의 주요 구성 설정을 지정할 수 있습니다. 이렇게 하면 쿡북을 수정하거나 스택마다 다른 쿡북을 사용하는 데 드는 시간과 노력이 줄어듭니다.
데이터베이스 암호와 같이 잠재적으로 중요한 정보를 쿡북 리포지토리에 넣지 않아도 됩니다.  
그 대신 속성을 사용하여 기본값을 정의한 다음 사용자 지정 JSON을 사용하여 해당 값을 실제 값으로 재정의합니다.
사용자 지정 JSON을 사용하여 속성을 재정의하는 방법에 대한 자세한 정보는 [속성 재정의](workingcookbook-attributes.md) 단원을 참조하세요.

속성 파일은 다소 간단한 Ruby 애플리케이션이기 때문에 `default.rb`로 명명됩니다. 즉, 예컨대 조건부 논리를 사용하여 운영 체제를 기반으로 속성 값을 지정할 수 있습니다. [조건부 논리](cookbooks-101-basics-ruby.md#cookbooks-101-basics-ruby-conditional)에서는 레시피의 다양한 Linux 제품군에 다양한 하위 디렉터리 이름을 지정했습니다. 속성 파일이 있으면 그 대신 조건부 논리를 속성 파일에 넣을 수 있습니다.

다음 속성 파일은 `value_for_platform`을 사용하여 운영 체제에 따라 다른 `['shared_dir']` 속성 값을 지정합니다. 다른 조건의 경우, Ruby `if-elsif-else` 논리 또는 `case` 문을 사용할 수 있습니다.

```
data_dir = value_for_platform(
  "centos" => { "default" => "shared" },
  "ubuntu" => { "default" => "data" },
  "default" => "user_data"
)
default['createdir']['shared_dir'] = data_dir
default['createdir']['config_dir'] = "config"
default['createdir']['mode'] = 0755
default['createdir']['owner'] = 'root'
default['createdir']['group'] = 'root'
```

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

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

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

1. `.kitchen.yml` 단원에서 설명한 대로 [조건부 논리](cookbooks-101-basics-ruby.md#cookbooks-101-basics-ruby-conditional)을 편집하여 플랫폼 섹션에 CentOS 플랫폼을 추가합니다.

1. `kitchen converge`를 실행한 다음 인스턴스에 로그인하여 디렉터리가 있는지 확인합니다.

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