레시피 구조 - AWS OpsWorks

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

레시피 구조

중요

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

쿡북은 기본적으로 인스턴스에서 다양한 작업을 수행할 수 있는 레시피의 집합입니다. 레시피를 구현하는 방법을 명확히 알려면 간단한 예를 살펴보는 것이 도움이 됩니다. 다음은 내장 HAProxy 계층의 설정 레시피입니다. 지금은 전체적인 구조에 집중하고 세부적인 사항에 너무 신경 쓰지 마십시오. 세부적인 내용은 이후 예제에서 다룹니다.

package 'haproxy' do action :install end if platform?('debian','ubuntu') template '/etc/default/haproxy' do source 'haproxy-default.erb' owner 'root' group 'root' mode 0644 end end include_recipe 'haproxy::service' service 'haproxy' do action [:enable, :start] end template '/etc/haproxy/haproxy.cfg' do source 'haproxy.cfg.erb' owner 'root' group 'root' mode 0644 notifies :restart, "service[haproxy]" end
참고

이 예제 및 다른 작업 레시피와 관련 파일의 예제는 AWS OpsWorks Stacks 내장 레시피를 참조하세요.

이 예제는 다음 섹션에서 설명하는 주요 레시피 요소를 집중적으로 다룹니다.

리소스

레시피는 주로 Chef 리소스 집합으로 구성됩니다. 각각의 리소스는 설치할 패키지나 시작할 서비스 같은 인스턴스 최종 상태의 특정 측면을 지정합니다. 예제에는 다음 4개의 리소스가 있습니다.

  • 설치된 패키지를 나타내는 package 리소스입니다. 이 예시에서는 HAProxy 서버입니다.

  • 이 예제에서 HAProxy 서비스에 해당하는 서비스를 나타내는 service 리소스.

  • 이 예제에서 2개의 HAProxy 구성 파일에 해당하는, 지정된 템플릿에서 생성할 파일을 나타내는 2개의 template 리소스.

리소스는 인스턴스 상태를 지정하는 선언적 방법을 제공합니다. 백그라운드에서는 각각의 리소스에 패키지 설치, 디렉터리 생성 및 구성, 서비스 시작 등등의 필요한 작업을 수행하는 연결된 공급자가 있습니다. 작업의 세부 사항이 특정 운영 체제에 따라 다른 경우, 리소스는 여러 개의 공급자를 가지며 시스템에 적합한 공급자를 사용합니다. 예를 들어 Red Hat Linux 시스템에서 package 공급자는 yum을 사용하여 패키지를 설치합니다. Ubuntu Linux 시스템에서 package 공급자는 apt-get을 사용합니다.

다음과 같은 일반적 형식을 사용하여 Ruby 코드 블록으로 리소스를 구현합니다.

resource_type "resource_name" do attribute1 'value1' attribute2 'value2' ... action :action_name notifies : action 'resource' end

요소는 다음과 같습니다.

리소스 유형

(필수) 예제에는 세 가지 리소스 형식(package, service, template)이 포함됩니다.

리소스 이름

(필수) 이름은 특정 리소스를 식별하며, 경우에 따라 속성 중 하나의 기본값으로 사용됩니다. 예제에서 packagehaproxy라는 이름의 패키지 리소스를 나타내며, 첫 번째 template 리소스는 /etc/default/haproxy라는 이름의 구성 파일을 나타냅니다.

속성

(선택 사항) 속성은 리소스 구성을 지정하며, 리소스 유형 및 리소스 구성 방법에 따라 달라집니다.

  • 예제의 template 리소스는 생성된 파일의 원본, 소유자, 그룹, 모드를 지정하는 속성 세트를 명시적으로 정의합니다.

  • 예제의 packageservice 리소스는 어떤 속성도 명시적으로 정의하지 않습니다.

    리소스 이름은 일반적으로 필수 속성의 기본값이며, 필요한 전부인 경우도 있습니다. 예를 들어 리소스 이름은 package 리소스의 package_name 속성에 대한 기본값이며, 이것이 유일한 필수 속성입니다.

가드 속성이라고 하는 몇 가지 특화된 속성도 있는데, 리소스 공급자가 언제 작업을 수행할지 지정합니다. 예를 들어 only_if 속성은 지정된 조건이 충족되는 경우에만 작업을 수행하라고 리소스 공급자에게 명령합니다. HAProxy 레시피는 가드 속성을 사용하지 않지만 다음 몇 가지 예제에서는 가드 속성을 사용합니다.

작업 및 알림

(선택 사항) 작업 및 알림은 공급자가 수행할 작업을 지정합니다.

  • action은 설치 또는 생성 등 지정된 작업을 하도록 공급자에게 명령합니다.

    각 리소스에는 특정 리소스에 따라 달라지는 작업 세트가 있으며, 이 중 하나는 기본 작업입니다. 예제에서 package 리소스의 작업은 install인데, 공급자에게 패키지를 설치하라고 명령합니다. 첫 번째 template 리소스에는 action 요소가 없기 때문에 공급자는 기본 create 작업을 수행합니다.

  • notifies는 다른 리소스의 공급자에게 작업을 수행할 것을 명령하지만 리소스의 상태가 변경된 경우에 한합니다.

    notifies는 일반적으로 templatefile 같은 리소스와 함께 사용되어 구성 파일 수정 후 서비스 재시작 같은 작업을 수행합니다. 리소스에는 기본 알림이 없습니다. 알림을 원하는 경우, 리소스에 명시적인 notifies 요소가 있어야 합니다. HAProxy 레시피에서 두 번째 template 리소스는 연결된 구성 파일이 변경된 경우, haproxy service 리소스에 HAProxy 서비스를 다시 시작하라고 알립니다.

리소스가 운영 체제에 따라 달라지는 경우가 있습니다.

  • 일부 리소스는 Linux 또는 Windows 시스템에서만 사용할 수 있습니다.

    예를 들어 패키지는 Linux 시스템에 패키지를 설치하고, windows_package는 Windows 시스템에 패키지를 설치합니다.

  • 일부 리소스는 어떤 운영 체제에도 사용할 수 있지만 특정 시스템에 고유한 속성을 가지고 있습니다.

    예를 들어 파일 리소스는 Linux 시스템이나 Windows 시스템에서 사용할 수 있지만 구성 권한에 대한 속성을 별도로 가지고 있습니다.

각 리소스의 사용 가능한 속성, 작업, 알림을 포함한 표준 리소스에 대한 설명은 리소스 및 공급자에 대하여를 참조하세요.

흐름 제어

레시피는 Ruby 애플리케이션이므로 Ruby 제어 구조를 사용하여 흐름 제어를 레시피에 통합할 수 있습니다. 예를 들어 Ruby 조건부 논리를 사용하여 레시피가 시스템에 따라 다르게 동작하도록 할 수 있습니다. HAProxy 레시피에 포함된 if 블록은 레시피가 Debian 또는 Ubuntu 시스템에서 실행되는 경우에만 template 리소스를 사용하여 구성 파일을 생성합니다.

다른 일반적 시나리오는 루프를 사용하여 하나의 리소스를 상이한 속성 설정으로 여러 번 실행하는 것입니다. 예를 들어 루프를 사용해 directory 리소스를 서로 다른 디렉터리 이름으로 여러 번 실행하여 디렉터리 집합을 생성할 수 있습니다.

참고

Ruby에 익숙하지 않다면 대부분의 레시피에 대해 알아야 할 내용을 다루고 있는 Just Enough Ruby for Chef를 참조하세요.

포함된 레시피

include_recipe는 코드의 다른 레시피를 포함하며, 레시피를 모듈화하여 여러 레시피에서 같은 코드를 다시 사용할 수 있도록 해 줍니다. 호스트 레시피 실행 시 Chef는 호스트 레시피를 실행하기 전에 각각의 include_recipe 요소를 지정된 레시피의 코드로 대체합니다. 표준 Chef cookbook_name::recipe_name 구문을 사용하여 포함된 레시피를 식별합니다. 여기서 recipe_name에는 .rb 확장명이 생략되어 있습니다. 예제에는 HAProxy 서비스를 나타내는 하나의 레시피인 haproxy::service가 포함됩니다.

참고

Chef 11.10 이후 버전에서 실행되는 레시피에서 include_recipe를 사용하여 다른 쿡북의 레시피를 포함시키려면 depends 문을 사용하여 쿡북의 metadata.rb 파일에서 종속성을 선언해야 합니다. 자세한 내용은 레시피 구현: Chef 11.10 섹션을 참조하세요.