웹사이트 검색

Ubuntu에서 인프라를 관리하기 위해 간단한 Chef 요리책을 만드는 방법


소개

Chef는 자동화되고 안정적이며 확장 가능한 방식으로 방대한 수의 컴퓨터를 자동화하고 제어할 수 있도록 설계된 구성 관리 시스템입니다.

이전 튜토리얼에서 일부 Chef 11을 살펴보았습니다. 이 가이드에서는 이러한 가이드를 시작점으로 사용하여 환경을 자동화하는 방법에 대해 설명합니다.

이 기사에서는 Chef 요리책 작성의 기본 사항에 대해 설명합니다. 쿡북은 원격 노드의 Chef 내에서 특정 작업을 구성하고 수행할 수 있게 해주는 구성 단위입니다. 우리는 쿡북을 빌드한 다음 Chef에게 쿡북에 설명된 단계를 실행할 노드를 알려줍니다.

이 가이드에서는 지난 수업을 마친 세 대의 머신으로 시작한다고 가정합니다. 구성 변경 사항을 푸시할 서버, 워크스테이션 및 하나 이상의 노드가 있어야 합니다.

기본 요리책 개념

쿡북은 Chef가 노드를 특정 상태로 만드는 데 사용하는 구성 및 정책 세부 정보의 기본 단위 역할을 합니다. 이것은 Chef가 쿡북을 사용하여 작업을 수행하고 노드에 있어야 할 일이 있는지 확인한다는 의미입니다.

쿡북은 일반적으로 하나의 특정 서비스, 애플리케이션 또는 기능을 처리하는 데 사용됩니다. 예를 들어 NTP를 사용하여 특정 서버와 노드의 시간을 설정하고 동기화하도록 요리책을 만들 수 있습니다. 데이터베이스 응용 프로그램을 설치하고 구성할 수 있습니다. 쿡북은 기본적으로 인프라 선택을 위한 패키지입니다.

쿡북은 워크스테이션에서 생성된 다음 Chef 서버에 업로드됩니다. 여기에서 쿡북에 설명된 레시피 및 정책을 노드의 "실행 목록\의 일부로 노드에 할당할 수 있습니다. 실행 목록은 Chef-Client가 노드에서 실행하는 레시피 및 역할의 순차적 목록입니다. 설정한 정책을 노드가 준수하도록 합니다.

이러한 방식으로 쿡북에 작성하는 구성 세부 정보는 쿡북에 설명된 시나리오를 준수하려는 노드에 적용됩니다.

요리책은 완전히 독립적인 디렉토리 구조로 구성됩니다. 다양한 목적으로 사용되는 다양한 디렉토리와 파일이 있습니다. 이제 더 중요한 몇 가지를 살펴보겠습니다.

조리법

레시피는 요리책의 주요 작업 도구입니다. 요리책은 둘 이상의 레시피를 포함하거나 외부 레시피에 의존할 수 있습니다. 레시피는 다양한 리소스의 상태를 선언하는 데 사용됩니다.

Chef 리소스는 시스템의 일부와 원하는 상태를 설명합니다. 예를 들어 리소스는 "패키지 x가 설치되어야 합니다.\라고 말할 수 있습니다. 또 다른 리소스는 "x 서비스가 실행 중이어야 합니다.\라고 말할 수 있습니다.

레시피는 레시피를 구현하는 경우 시스템이 어떻게 표시되어야 하는지를 Chef에 알려주는 목록 관련 리소스입니다. Chef는 레시피를 실행할 때 각 리소스가 선언된 상태를 준수하는지 확인합니다. 시스템이 일치하면 다음 리소스로 이동하고 그렇지 않으면 리소스를 주어진 상태로 이동하려고 시도합니다.

자원은 다양한 유형이 될 수 있습니다. 여기에서 다양한 리소스 유형에 대해 알아볼 수 있습니다. 몇 가지 일반적인 사항은 다음과 같습니다.

  • 패키지: 노드에서 패키지를 관리하는 데 사용
  • service: 노드에서 서비스를 관리하는 데 사용
  • 사용자: 노드에서 사용자 관리
  • 그룹: 그룹 관리
  • 템플릿: 포함된 Ruby 템플릿으로 파일 관리
  • cookbook_file: 요리책의 파일 하위 디렉토리에서 노드의 위치로 파일 전송
  • 파일: 노드에서 파일 내용 관리
  • directory: 노드의 디렉토리 관리
  • 실행: 노드에서 명령 실행
  • cron: 노드에서 기존 cron 파일 편집

속성

Chef의 속성은 기본적으로 설정입니다. 요리책에서 사용하려는 모든 것에 대한 간단한 키-값 쌍으로 생각하십시오.

적용할 수 있는 여러 종류의 속성이 있으며 각 속성은 노드가 작동하는 최종 설정보다 우선 순위가 다릅니다. 요리책 수준에서는 일반적으로 구성 중인 서비스 또는 시스템의 기본 속성을 정의합니다. 나중에 특정 노드에 대한 보다 구체적인 값으로 재정의할 수 있습니다.

쿡북을 생성할 때 쿡북의 속성 하위 디렉토리에서 서비스에 대한 속성을 설정할 수 있습니다. 그런 다음 요리책의 다른 부분에서 이러한 값을 참조할 수 있습니다.

파일

쿡북 내의 파일 하위 디렉터리에는 쿡북을 사용하는 노드에 배치할 모든 정적 파일이 포함되어 있습니다.

예를 들어, 수정할 가능성이 없는 간단한 구성 파일은 모두 파일 하위 디렉토리에 배치할 수 있습니다. 그런 다음 레시피는 파일을 해당 디렉터리에서 노드의 최종 위치로 이동하는 리소스를 선언할 수 있습니다.

템플릿

템플릿은 파일과 비슷하지만 정적이지 않습니다. 템플릿 파일은 .erb 확장자로 끝납니다. 이는 포함된 Ruby가 포함되어 있음을 의미합니다.

이들은 주로 속성 값을 파일로 대체하여 노드에 배치될 최종 파일 버전을 생성하는 데 사용됩니다.

예를 들어 서비스의 기본 포트를 정의하는 특성이 있는 경우 템플릿 파일은 포트가 선언된 파일의 지점에 특성을 삽입하도록 호출할 수 있습니다. 이 기술을 사용하면 다른 곳에서 변경하려는 실제 변수를 유지하면서 구성 파일을 쉽게 만들 수 있습니다.

메타데이터.rb

당연히 metadata.rb 파일은 패키지에 대한 메타데이터를 관리하는 데 사용됩니다. 여기에는 패키지 이름, 설명 등이 포함됩니다.

또한 이 쿡북이 작동해야 하는 쿡북을 지정할 수 있는 종속성 정보와 같은 항목도 포함됩니다. 이렇게 하면 Chef 서버가 노드에 대한 실행 목록을 올바르게 작성하고 모든 조각이 올바르게 전송되도록 할 수 있습니다.

간단한 요리책 만들기

요리책 작업과 관련된 일부 작업 흐름을 보여주기 위해 우리는 우리만의 요리책을 만들 것입니다. 이것은 노드에 Nginx 웹 서버를 설치하고 구성하는 매우 간단한 요리책입니다.

시작하려면 워크스테이션의 ~/chef-repo 디렉토리로 이동해야 합니다.

cd ~/chef-repo

그곳에서 칼을 사용하여 요리책을 만들 수 있습니다. 이전 가이드에서 언급했듯이 knife는 Chef 시스템과의 대부분의 상호 작용을 구성하는 데 사용되는 도구입니다. 이를 사용하여 워크스테이션에서 작업을 수행하고 Chef 서버 또는 개별 노드에 연결할 수도 있습니다.

요리책을 만들기 위한 일반적인 구문은 다음과 같습니다.

<예비>

요리책은 Nginx 설치 및 구성을 다루므로 요리책의 이름을 적절하게 지정합니다.

knife cookbook create nginx
** Creating cookbook nginx
** Creating README for cookbook: nginx
** Creating CHANGELOG for cookbook: nginx
** Creating metadata for cookbook: nginx

칼이 여기서 하는 일은 새로운 요리책을 위한 요리책 디렉토리 내에 간단한 구조를 구축하는 것입니다. 요리책 디렉토리와 요리책 이름이 있는 디렉토리로 이동하여 요리책 구조를 볼 수 있습니다.

cd cookbooks/nginx
ls
attributes  CHANGELOG.md  definitions  files  libraries  metadata.rb  providers  README.md  recipes  resources	templates

보시다시피 요리책을 만드는 데 사용할 수 있는 폴더와 파일 구조가 생성되었습니다. 구성의 가장 큰 부분인 레시피부터 시작하겠습니다.

간단한 레시피 만들기

recipes 하위 디렉토리로 이동하면 내부에 이미 default.rb라는 파일이 있음을 알 수 있습니다.

cd recipes
ls
default.rb

"nginx\ 레시피를 참조하면 실행될 레시피입니다. 여기에 코드를 추가할 것입니다.

텍스트 편집기로 파일을 엽니다.

nano default.rb
#
# Cookbook Name:: nginx
# Recipe:: default
#
# Copyright 2014, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#

현재 이 파일에 있는 유일한 것은 주석 헤더입니다.

Nginx 웹 서버가 원하는 방식으로 실행되기 위해 필요한 일을 계획하는 것으로 시작할 수 있습니다. 우리는 "리소스\를 구성하여 이 작업을 수행합니다. 리소스는 어떤 작업을 수행하는 방법을 설명하지 않습니다. 시스템의 일부가 완료되었을 때 어떤 모습이어야 하는지를 설명할 뿐입니다.

우선, 소프트웨어가 설치되어 있는지 확인해야 합니다. 먼저 "패키지\ 리소스를 생성하여 이를 수행할 수 있습니다.

package 'nginx' do
  action :install
end

이 작은 코드 조각은 Nginx용 패키지 리소스를 정의합니다. 첫 번째 줄은 리소스 유형(패키지)과 리소스 이름('nginx')으로 시작합니다. 나머지는 리소스에 대해 수행하려는 작업을 선언하는 작업 및 매개 변수 그룹입니다.

이 리소스에는 action :install이 표시됩니다. 이 줄은 우리가 설명하는 리소스가 설치되어야 함을 Chef에게 알려줍니다. 이 레시피를 실행하는 노드는 Nginx가 설치되어 있는지 확인합니다. 그렇다면 수행할 작업 목록에서 해당 항목을 확인합니다. 그렇지 않은 경우 클라이언트 시스템에서 사용 가능한 방법을 사용하여 프로그램을 설치한 다음 확인합니다.

서비스를 설치한 후 노드에서 현재 상태를 조정하려고 할 수 있습니다. 기본적으로 Ubuntu는 설치 후 Nginx를 시작하지 않으므로 다음과 같이 변경해야 합니다.

service 'nginx' do
  action [ :enable, :start ]
end

여기에서 "service\ 유형의 리소스를 볼 수 있습니다. 이것은 Nginx 서비스 구성 요소(init 또는 upstart로 서버를 관리할 수 있는 부분)에 대해 지금 바로 서비스를 시작하고 또한 활성화할 것임을 선언합니다. 컴퓨터가 다시 시작되면 자동으로 시작됩니다.

우리가 선언할 마지막 리소스는 우리가 제공할 실제 파일입니다. 이것은 우리가 수정하지 않을 단순한 파일이기 때문에 파일을 원하는 위치를 선언하고 요리책에서 파일을 가져올 위치를 알려줄 수 있습니다.

cookbook_file "/usr/share/nginx/www/index.html" do
  source "index.html"
  mode "0644"
end

우리는 "cookbook_file\ 리소스 유형을 사용하여 Chef에게 이 파일이 요리책 자체 내에서 사용 가능하고 있는 그대로 해당 위치로 전송할 수 있음을 알립니다. 이 예에서는 파일을 Nginx의 문서 루트로 전송합니다.

이 경우 첫 번째 줄에 만들려는 파일 이름을 지정합니다. "source\ 줄에서 요리책 내에서 찾을 파일의 이름을 알려줍니다. Chef는 요리책의 "files/default\ 하위 디렉토리에서 이 파일을 찾습니다.

"mode\ 줄은 우리가 만들고 있는 파일에 대한 권한을 설정합니다. 이 경우 루트 사용자에게 읽기 및 쓰기 권한을 허용하고 다른 모든 사용자는 읽기 권한을 허용합니다.

완료되면 이 파일을 저장하고 닫습니다.

인덱스 파일 생성

위에서 본 것처럼 "index.html\이라는 파일을 노드의 문서 루트로 이동해야 하는 "cookbook_file\ 리소스를 정의했습니다. 이 파일을 만들어야 합니다.

이 파일을 요리책의 "files/default\ 하위 디렉토리에 넣어야 합니다. 이제 다음을 입력하여 이동합니다.

cd ~/chef-repo/cookbooks/nginx/files/default

이 디렉토리 내에서 참조한 파일을 생성합니다.

nano index.html

이 파일은 리소스가 원하는 방식으로 작동했음을 보여주기 위한 매우 간단한 HTML 문서일 뿐입니다.

파일에 붙여넣기:

<html>
  <head>
    <title>Hello there</title>
  </head>
  <body>
    <h1>This is a test</h1>
    <p>Please work!</p>
  </body>
</html>

완료되면 파일을 저장하고 닫습니다.

도우미 요리책 만들기

더 나아 가기 전에 작은 문제를 선제 적으로 해결합시다. 우리 노드가 우리가 만든 쿡북을 지금 있는 그대로 실행하려고 하면 실패할 가능성이 있습니다.

이는 Ubuntu 리포지토리에서 Nginx를 설치하려고 시도하고 노드의 패키지 데이터베이스가 오래되었을 가능성이 높기 때문입니다. 일반적으로 패키지 명령을 실행하기 전에 "sudo apt-get update\를 실행합니다.

이 문제를 해결하기 위해 패키지 데이터베이스를 업데이트하는 것이 유일한 목적인 간단한 쿡북을 만들 수 있습니다.

이전에 사용한 것과 동일한 나이프 구문을 사용하여 이 작업을 수행할 수 있습니다. 이 요리책을 \apt라고 부르자:

knife cookbook create apt

이렇게 하면 Nginx 쿡북을 처음 시작했을 때와 동일한 종류의 디렉토리 구조가 생성됩니다.

본론으로 바로 들어가 새 요리책의 기본 레시피를 편집해 보겠습니다.

nano ~/chef-repo/cookbooks/apt/recipes/default.rb

이 파일에서 우리는 "execute\ 리소스를 선언할 것입니다. 이것은 단순히 노드에서 실행하려는 명령을 정의하는 방법입니다.

리소스는 다음과 같습니다.

execute "apt-get update" do
  command "apt-get update"
end

첫 번째 줄은 리소스의 이름을 제공합니다. 우리의 경우에는 단순화를 위해 리소스를 this라고 합니다. "command\ 속성이 정의된 경우(우리가 한 것처럼) 이것은 실행되는 실제 명령입니다.

이것들은 정확히 동일하기 때문에 조금도 중요하지 않습니다.

파일을 저장하고 닫습니다.

이제 새로운 쿡북이 있으므로 Nginx 쿡북보다 먼저 이를 실행할 수 있는 여러 가지 방법이 있습니다. Nginx 쿡북 전에 노드의 실행 목록에 추가할 수 있지만 Nginx 쿡북 자체에 연결할 수도 있습니다.

Nginx에 대해 구성하려는 모든 노드에서 "nginx\ 쿡북 앞에 "apt\ 쿡북을 추가하는 것을 기억할 필요가 없기 때문에 이것은 아마도 더 나은 옵션일 것입니다.

이를 위해서는 Nginx 쿡북에서 몇 가지를 조정해야 합니다. 먼저 Nginx 레시피 파일을 다시 엽니다.

nano ~/chef-repo/cookbooks/nginx/recipes/default.rb

이 요리책의 맨 위에서 정의한 다른 리소스 앞에 다음을 입력하여 "apt\ 기본 레시피를 읽을 수 있습니다.

<예비>

패키지 'nginx' 수행

서비스 'nginx' 수행

cookbook_file "/usr/share/nginx/www/index.html” 수행

파일을 저장하고 닫습니다.

편집해야 하는 다른 파일은 metadata.rb 파일입니다. Chef 서버가 실행 목록을 노드에 보낼 때 이 파일을 확인하여 실행 목록에 추가해야 하는 다른 레시피를 확인합니다.

지금 파일 열기:

nano ~/chef-repo/cookbooks/nginx/metadata.rb

파일 맨 아래에 다음 행을 추가할 수 있습니다.

<예비>

\apt에 따라 다름

완료되면 Nginx 쿡북은 이제 apt 쿡북에 의존하여 패키지 데이터베이스 업데이트를 처리합니다.

노드에 요리책 추가

기본 요리책이 완성되었으므로 요리사 서버에 업로드할 수 있습니다.

다음을 입력하여 개별적으로 수행할 수 있습니다.

knife cookbook upload apt
knife cookbook upload nginx

또는 다음을 입력하여 모든 항목을 업로드할 수 있습니다.

knife cookbook upload -a

어느 쪽이든 레시피가 Chef 서버에 업로드됩니다.

이제 노드의 실행 목록을 수정할 수 있습니다. 다음을 입력하면 쉽게 할 수 있습니다.

<예비>

사용 가능한 노드의 이름을 찾아야 하는 경우 다음을 입력할 수 있습니다.

knife node list
client1

우리의 목적을 위해 이것을 입력하면 다음과 같은 파일을 얻습니다.

knife node edit client1
{
  "name": "client1",
  "chef_environment": "_default",
  "normal": {
    "tags": [

    ]
  },
  "run_list": [

  ]
}

이것이 작동하기 전에 EDITOR 환경 변수를 설정해야 할 수도 있습니다. 다음을 입력하면 됩니다.

<예비>

보시다시피 이것은 노드의 일부 측면을 설명하는 간단한 JSON 문서입니다. 현재 비어 있는 "run_list\ 배열을 볼 수 있습니다.

다음 형식을 사용하여 해당 배열에 Nginx 쿡북을 추가할 수 있습니다.

<예비>

완료되면 파일은 다음과 같아야 합니다.

{
  "name": "client1",
  "chef_environment": "_default",
  "normal": {
    "tags": [

    ]
  },
  "run_list": [
    "recipe[nginx]"
  ]
}

파일을 저장하고 닫아 새 설정을 구현합니다.

이제 노드에 SSH로 연결하고 Chef 클라이언트 소프트웨어를 실행할 수 있습니다. 이렇게 하면 클라이언트가 Chef 서버에 체크인하게 됩니다. 이렇게 하면 할당된 새 실행 목록이 표시됩니다.

노드에 SSH로 연결한 후 다음을 실행합니다.

sudo chef-client
Starting Chef Client, version 11.8.2
resolving cookbooks for run list: ["nginx"]
Synchronizing Cookbooks:
  - apt
  - nginx
Compiling Cookbooks...
Converging 4 resources
Recipe: apt::default
  * execute[apt-get update] action run
    - execute apt-get update

Recipe: nginx::default
  * package[nginx] action install (up to date)
  * service[nginx] action enable
    - enable service service[nginx]

  * service[nginx] action start (up to date)
  * cookbook_file[/usr/share/nginx/www/index.html] action create (up to date)
Chef Client finished, 2 resources updated

보시다시피 apt 쿡북은 우리가 만든 실행 목록에 없었지만 전송되어 실행되었습니다. 이는 Chef가 노드에서 실행하기 전에 종속성을 지능적으로 해결하고 실제 실행 목록을 수정했기 때문입니다.

참고: 하나의 요리책 또는 레시피가 다른 것보다 먼저 실행되도록 하는 다양한 방법이 있습니다. 종속성을 추가하는 것은 하나의 선택일 뿐이며 다른 방법이 선호될 수 있습니다.

노드의 IP 주소 또는 도메인 이름으로 이동하여 이것이 작동하는지 확인할 수 있습니다.

<예비>

다음과 같은 내용이 표시됩니다.

축하합니다. Chef 쿡북을 사용하여 첫 번째 노드를 구성했습니다!

결론

이것은 서버를 수동으로 구성하는 것보다 많은 시간을 절약하지 못할 수 있는 매우 간단한 예였지만 인프라를 구축하는 이 방법의 가능성을 보기 시작할 수 있기를 바랍니다.

다양한 종류의 서버를 빠르게 배포하고 구성할 수 있을 뿐만 아니라 모든 시스템의 정확한 구성을 알 수 있습니다. 이를 통해 인프라를 검증하고 테스트할 수 있으며, 필요에 따라 인프라를 신속하게 재배포하는 데 필요한 프레임워크도 제공됩니다.

저스틴 엘링우드