예제 5: 속성 사용 - AWS OpsWorks

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

예제 5: 속성 사용

중요

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

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

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

[ "/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'

유의할 사항:

  • 각 정의는 속성 유형으로 시작합니다.

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

  • 속성에는 중첩된 이름이 있습니다.

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

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

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

[ "/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를 실행하여 깨끗한 인스턴스로 시작합니다.

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

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

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

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

참고

AWS OpsWorks Stacks를 사용하면 값을 속성으로 정의하면 추가적인 이점이 있습니다. 사용자 지정 JSON을 사용하여 스택별 또는 배포별로 해당 값을 재정의할 수 있습니다. 이는 다음을 비롯한 다양한 목적에 유용할 수 있습니다.

  • 쿡북을 수정할 필요 없이 구성 설정이나 사용자 이름 등 레시피의 동작을 사용자 지정할 수 있습니다.

    예를 들어 서로 다른 스택에 같은 쿡북을 사용하고 사용자 지정 JSON을 사용하여 특정 스택의 주요 구성 설정을 지정할 수 있습니다. 이렇게 하면 쿡북을 수정하거나 스택마다 다른 쿡북을 사용하는 데 드는 시간과 노력이 줄어듭니다.

  • 데이터베이스 암호와 같이 잠재적으로 중요한 정보를 쿡북 리포지토리에 넣지 않아도 됩니다.

    그 대신 속성을 사용하여 기본값을 정의한 다음 사용자 지정 JSON을 사용하여 해당 값을 실제 값으로 재정의합니다.

사용자 지정 JSON을 사용하여 속성을 재정의하는 방법에 대한 자세한 정보는 속성 재정의 단원을 참조하세요.

속성 파일은 다소 간단한 Ruby 애플리케이션이기 때문에 default.rb로 명명됩니다. 즉, 예컨대 조건부 논리를 사용하여 운영 체제를 기반으로 속성 값을 지정할 수 있습니다. 조건부 논리에서는 레시피의 다양한 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를 실행하여 깨끗한 인스턴스로 시작합니다.

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

  3. .kitchen.yml 단원에서 설명한 대로 조건부 논리을 편집하여 플랫폼 섹션에 CentOS 플랫폼을 추가합니다.

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

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