37
1 What is Chef? Infrastructure management framework 번역 : 박상욱 [email protected]

Whatischef korean

Embed Size (px)

DESCRIPTION

What is Chef? http://www.slideshare.net/YukihikoSawanobori/what-is-chef201303 한글 번역본

Citation preview

Page 1: Whatischef korean

1

What is Chef? Infrastructure management framework

번역 : 박상욱 [email protected]

Page 2: Whatischef korean

2

Information

• Opscode의 Chef가 어떤 것인지 중급자

이상을 대상으로 설명한다

http://www.opscode.com/chef/

• Author Yukihiko Sawanobori

HiganWorks LLC(Japan)

Page 3: Whatischef korean

3

Index

1. Introduction

2. Inventory

3. Convergence

4. Resource Correction

5. Configration Management

(Automaticaly/Configration first)

Page 4: Whatischef korean

4

1. Introduction

Page 5: Whatischef korean

5

Q. Chef는 서버의 자동 설정 툴이죠?

Page 6: Whatischef korean

6

A. 아닙니다. 환경의 메타데이터를 관리하고, 노드의 역할을 조정하는

OPS의 프레임워크다.

※일반적인 자동 빌드 툴로 생각해도 된다.

Page 7: Whatischef korean

7

Q. DevOps라고 자주 말하고 있는데,

Developer와 Operater가 사이 좋게 만든 것인가?

Page 8: Whatischef korean

8

A. 정확히 말하면, OPS의 분노가 집약된 툴이라고 생각한다.

※DevOps의 본질은 특정 툴과 관계가 없다. ※Ohai와 Chef::Providers의 소스에서는 특히 그런 인상을 받는다.

Page 9: Whatischef korean

9

Chef의 인식 정오표 1

✕ 레시피로 화려하게 서버를 자동 설정

◯ 플랫폼의 구분과 리소스 확인 결과에 따른

조정을 실시

✕ ChefServer는 그다지 필요한지 않다.

◯ 인벤토리야말로 ChefServer의 전부다.

Page 10: Whatischef korean

10

Chef의 인식 정오표 2

✕ Cookbook에 미들웨어의 서버별 고유 정보도 사용한다.

◯ Role/Node의 Override Attribute나 ChefServer로의 쿼리

를 사용해 Cookbook은 범용적으로 작성해야 한다.

✕ 서버 설정을 변경하면 별도로 만들어져 있는 시스템

구성 관리 대장을 갱신한다.

◯ 서버에 직접 로그인하는 것을 포함하여 ChefServer 상

의 구성 관리만으로 끝내는 것이 이상적이다.

Page 11: Whatischef korean

11

2. Inbentory

Page 12: Whatischef korean

12

먼저 인벤토리 수집에서부터

• Chef-Client(Chef-solo)가 가동하기 위해

서는 실행된 플랫폼의 판별이 무엇보다

중요하다.

• Chef의 멀티 플랫폼성을 지원하기 위해

서는 고도의 인벤토리 수집력이 필요!

Page 13: Whatischef korean

13

그래서 OHAI다.

• Ohai(https://github.com/opscode/ohai)

• quot: Ohai detects data about your

operating system.

• 참고자료: Chef의 심장, Ohai의 속성(이하 생

략)

http://qiita.com/items/5ce72101f8dee906ccb4

• OS/분배를 시작하여 동작 환경을 판별

Page 14: Whatischef korean

14

OHAI 예제 소스,플랫폼의 판별하는 소스 # platform [ and platform_version ? ] should be lower case to avoid dealing with RedHat/Redhat/redhat matching if File.exists?("/etc/oracle-‐release") contents = File.read("/etc/oracle-‐release").chomp platform "oracle" platform_version get_redhatish_version(contents) elsif File.exists?("/etc/enterprise-‐release") contents = File.read("/etc/enterprise-‐release").chomp platform "oracle" platform_version get_redhatish_version(contents) elsif File.exists?("/etc/debian_version") # Ubuntu and Debian both have /etc/debian_version # Ubuntu should always have a working lsb, debian does not by default if lsb[:id] =~ /Ubuntu/i platform "ubuntu" platform_version lsb[:release] else if File.exists?("/usr/bin/raspi-‐config") platform "raspbian" else platform "debian" end platform_version File.read("/etc/debian_version").chomp end elsif File.exists?("/etc/redhat-‐release") contents = File.read("/etc/redhat-‐release").chomp platform get_redhatish_platform(contents) platform_version get_redhatish_version(contents) elsif File.exists?("/etc/system-‐release") contents = File.read("/etc/system-‐release").chomp

platform get_redhatish_platform(contents) platform_version get_redhatish_version(contents) elsif File.exists?('/etc/gentoo-‐release') platform "gentoo"

플랫폼 판별을 위해

자세하게 조사

Page 15: Whatischef korean

15

AWS(EC2) 상에 있는지도 확인한다!

def has_ec2_mac? network[:interfaces].values.each do |iface| unless iface[:arp].nil? if iface[:arp].value?("fe:ff:ff:ff:ff:ff") Ohai::Log.debug("has_ec2_mac? == true") return true end end end Ohai::Log.debug("has_ec2_mac? == false") false end def looks_like_ec2? # Try non-‐blocking connect so we don't "block" if # the Xen environment is *not* EC2 hint?('ec2') || has_ec2_mac? && can_metadata_connect? (EC2_METADATA_ADDR,80) end if looks_like_ec2? Ohai::Log.debug("looks_like_ec2? == true")

역시 자세하게 조사

Page 16: Whatischef korean

16

플랫폼은 판별하면

• 패키지 관리 시스템을 알 수 있다.

• 서비스 관리 방법을 알 수 있다.

• 환경 특유의 관리 방법을 파악할 수 있다.

• Ex) ec2라면 IP가 아닌 public hostname을

접속 주소로 사용하는 등…

Page 17: Whatischef korean

17

Cookbook DSL 예제

package ‘nginx’ do action :install end 예를 들어, 이것만으로도

• Redhat 계열이라면 yum/rpm을 사용

• Debian 계열이라면 apt/deb를 사용

• Solaris 계열이라면 pkgin/pkg을 사용

Chef::Runner이 표준 패키지 시스템에서

nginx를 설치한 상태로 노드를 조정한다.

Page 18: Whatischef korean

18

Inventory 중요

• Chef-Clinet/Chef-solo의 동작에 중요

• Chef Server에 집약된 Inventory는

SearchAPI에 의해 자동 환경 구축에 정

말 유용

Page 19: Whatischef korean

19

3. Convergence

Page 20: Whatischef korean

20

✕ Build / Setup ◯ Convergence

Page 21: Whatischef korean

21

Convergence 란

• Chef에서는 서버 설정 변경을

Convergence(조정)하다고 부르고 있다.

• (사상으로) 스크립트를 실행하여 서버를

설정하는 것이 아닌, Client의 실행에 따

라 서버의 상태를 레시피에 쓰여진 내용

처럼 서버를 조정하는 것을 표현하고 있

기 때문이다.

Page 22: Whatischef korean

22

어떤 방법일까

• 서버 상태를 받아와 레시피에 쓰여진 내용

과 비교

• 레시피와 틀리다면 「맞춘다」, 이 작업을 반

복하여 설정을 “조정”한다.

(※Cookbook은 멱등성에서 설명한다.)

• 다음의 Resouce Corection에서도 설명한다.

Page 23: Whatischef korean

23

4. Resouce Correcton

Page 24: Whatischef korean

24

레시피 적용에서 중요한 Resouce/state라는 개념

Page 25: Whatischef korean

25

서버 요소들은 모두 RESOURCE로 정의

• 종류와 요소 = 리소스

• 예 : 패키지

• 설치 상태는? / 버전은?

• 예 : 서비스

• 가동중? / 자동 가동?

• 파일

• 경로는? / 소유자는? / 내용은?

Page 26: Whatischef korean

26

Curennt Resouce와 New Resouce

1. Client/Solo는 목적의 리

소스를 정의=New

Resorce

2. 현재 리소스를 불러옴

=Current Resorce

3. Current Resorce의 요소

를 변경

※ 플랫폼별 변경 방법은 다

[New Resorce] File ( :path => “/etc/hoge”, :owner => “root”, :mode => 0644, :content => “piyo”) [Current Resorce] File ( :path => “/etc/hoge”, :owner => “root”, :mode => 0600, :content => “hoge”)

Converge!

Page 27: Whatischef korean

27

Current Resouce 불러오기 예제

Chef::Log.debug("#{@new_resource} checking pacman for #{@new_resource.package_name}") status = popen4("pacman -‐Qi #{@new_resource.package_name}") do |pid, stdin, stdout, stderr| stdout.each do |line| line.force_encoding(Encoding::UTF_8) if line.respond_to?(:force_encoding) case line when /^Version(\s?)*: (.+)$/ Chef::Log.debug("#{@new_resource} current version is #{$2}") @current_resource.version($2) end

패키지 관리자=PackMan의 경우

패키지 상태을 불러온다.

명령어를 입력하여 패스…

Page 28: Whatischef korean

28

New Resource 적용 예제

def install_package(name, version) run_command_with_systems_locale( :command => "pacman --sync --noconfirm --noprogressbar#{expand_options(@new_resource.options)} #{name}" ) end

패키지를 설치 상태로 변경

Cron 등도 도움이 되는 검출 Source

if @cron_exists unless cron_different? Chef::Log.debug("Skipping existing cron entry '#{@new_resource.name}'") return end read_crontab.each_line do |line| case line.chomp when "# Chef Name: #{@new_resource.name}" cron_found = true

Page 29: Whatischef korean

29

RESOURCE와 멱등성

• 자세한 Resouce Correction

• CookBook 레시피= New Resource

• Current Resouce를 New Resource와 같은 S

tatus로 조정

• = > Client/Solo는 몇 번이고 실행해도 같은

결과, 같은 상태가 되도록 하고, 항상 실행

되도록 해두는 것이 중요

Page 30: Whatischef korean

30

5. Configration Management (Automaticaly/Configration First)

Page 31: Whatischef korean

31

구성 관리를 자동화한다.

Page 32: Whatischef korean

32

구성 관리의 자동화

• Inventory 등록/갱신(Ohai 수집)

• 플랫폼 정보

• H/W 정보

• N/W 정보

Attribute Override Role 부여・Runlist 부여

Node

Chef-Clinet

Chef-Server

Node

Page 33: Whatischef korean

33

Role[Nagios-Server]

Role[Nagios-Client]

Env / Role의 할당 예제 Server의 인벤토리를 기반으로 설정 변경

Chef-Server

Node Node

Recipe[nagios-client] ・Role[Nagis-Server]등록 Node의 IP에서 요청을 허가 ・감시 대상 리소스의 플러그인을 설치

Recipe[nagios-server] ・Role[Nagis-Client]등록 Node의 IP를 불러와 감시한다. ・감시 대상 Node의 Attribute에서 감시 항목을 설정

Page 34: Whatischef korean

34

환경의 구성 관리를 통해 서버 구성을 자동으로 조정

(Configuration Management First)

Page 35: Whatischef korean

35

Role[Nagios-Server]

Role[Nagios-Client]

새로운 Node에 Role을 할당=조정하여 환경에 적용

Chef-Server

Node Node

Recipe[nagios-client] ・Role[Nagis-Server]등록 Node의 IP에서 요청을 허가 ・감시 대상 리소스의 플러그인을 설치

Recipe[nagios-server] ・Role[Nagis-Client] 등록 Node의 IP를 불러와 감시한다. ・감시 대상 Node의 Attribute에서 감시 항목을 설정

New Node

Role에 추가=Server에 인벤토리된다.

. Nagios의 관계 설정이 조정된다.

. Role[Nagios-Server]은Client의 Node 증감에 따라 자동으로 감시 대상의 추가 삭제가 이루어진다.

Page 36: Whatischef korean

36

구성 관리=환경 구축

• Chef 상의 요소를 변경=구성 관리 정

보를 갱신한다면

• Client 들이 적당히 조정되어진다.

• 구성 관리하는 모든 것이 연결된다.

Page 37: Whatischef korean

37

마치며

• Chef를 그냥 한 번에 빌드하는 툴로

생각해도 틀린 것은 아니지만 부족한

부분이 있다.

• Solo로 갱신해 나가는 것도 좋으나

이것 또한 부족한 부분이 있다.

이것이 Active Directory가 아니냐고 생각하시는 분들이 있는데, 대

략 맞습니다.