whatischef korean
DESCRIPTION
What is Chef? http://www.slideshare.net/YukihikoSawanobori/what-is-chef201303 한글 번역본TRANSCRIPT
2
Information
• Opscode의 Chef가 어떤 것인지 중급자
이상을 대상으로 설명한다
http://www.opscode.com/chef/
• Author Yukihiko Sawanobori
HiganWorks LLC(Japan)
3
Index
1. Introduction
2. Inventory
3. Convergence
4. Resource Correction
5. Configration Management
(Automaticaly/Configration first)
4
1. Introduction
5
Q. Chef는 서버의 자동 설정 툴이죠?
6
A. 아닙니다. 환경의 메타데이터를 관리하고, 노드의 역할을 조정하는
OPS의 프레임워크다.
※일반적인 자동 빌드 툴로 생각해도 된다.
7
Q. DevOps라고 자주 말하고 있는데,
Developer와 Operater가 사이 좋게 만든 것인가?
8
A. 정확히 말하면, OPS의 분노가 집약된 툴이라고 생각한다.
※DevOps의 본질은 특정 툴과 관계가 없다. ※Ohai와 Chef::Providers의 소스에서는 특히 그런 인상을 받는다.
9
Chef의 인식 정오표 1
✕ 레시피로 화려하게 서버를 자동 설정
◯ 플랫폼의 구분과 리소스 확인 결과에 따른
조정을 실시
✕ ChefServer는 그다지 필요한지 않다.
◯ 인벤토리야말로 ChefServer의 전부다.
10
Chef의 인식 정오표 2
✕ Cookbook에 미들웨어의 서버별 고유 정보도 사용한다.
◯ Role/Node의 Override Attribute나 ChefServer로의 쿼리
를 사용해 Cookbook은 범용적으로 작성해야 한다.
✕ 서버 설정을 변경하면 별도로 만들어져 있는 시스템
구성 관리 대장을 갱신한다.
◯ 서버에 직접 로그인하는 것을 포함하여 ChefServer 상
의 구성 관리만으로 끝내는 것이 이상적이다.
11
2. Inbentory
12
먼저 인벤토리 수집에서부터
• Chef-Client(Chef-solo)가 가동하기 위해
서는 실행된 플랫폼의 판별이 무엇보다
중요하다.
• Chef의 멀티 플랫폼성을 지원하기 위해
서는 고도의 인벤토리 수집력이 필요!
13
그래서 OHAI다.
• Ohai(https://github.com/opscode/ohai)
• quot: Ohai detects data about your
operating system.
• 참고자료: Chef의 심장, Ohai의 속성(이하 생
략)
http://qiita.com/items/5ce72101f8dee906ccb4
• OS/분배를 시작하여 동작 환경을 판별
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"
플랫폼 판별을 위해
자세하게 조사
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")
역시 자세하게 조사
16
플랫폼은 판별하면
• 패키지 관리 시스템을 알 수 있다.
• 서비스 관리 방법을 알 수 있다.
• 환경 특유의 관리 방법을 파악할 수 있다.
• Ex) ec2라면 IP가 아닌 public hostname을
접속 주소로 사용하는 등…
17
Cookbook DSL 예제
package ‘nginx’ do action :install end 예를 들어, 이것만으로도
• Redhat 계열이라면 yum/rpm을 사용
• Debian 계열이라면 apt/deb를 사용
• Solaris 계열이라면 pkgin/pkg을 사용
Chef::Runner이 표준 패키지 시스템에서
nginx를 설치한 상태로 노드를 조정한다.
18
Inventory 중요
• Chef-Clinet/Chef-solo의 동작에 중요
• Chef Server에 집약된 Inventory는
SearchAPI에 의해 자동 환경 구축에 정
말 유용
19
3. Convergence
20
✕ Build / Setup ◯ Convergence
21
Convergence 란
• Chef에서는 서버 설정 변경을
Convergence(조정)하다고 부르고 있다.
• (사상으로) 스크립트를 실행하여 서버를
설정하는 것이 아닌, Client의 실행에 따
라 서버의 상태를 레시피에 쓰여진 내용
처럼 서버를 조정하는 것을 표현하고 있
기 때문이다.
22
어떤 방법일까
• 서버 상태를 받아와 레시피에 쓰여진 내용
과 비교
• 레시피와 틀리다면 「맞춘다」, 이 작업을 반
복하여 설정을 “조정”한다.
(※Cookbook은 멱등성에서 설명한다.)
• 다음의 Resouce Corection에서도 설명한다.
23
4. Resouce Correcton
24
레시피 적용에서 중요한 Resouce/state라는 개념
25
서버 요소들은 모두 RESOURCE로 정의
• 종류와 요소 = 리소스
• 예 : 패키지
• 설치 상태는? / 버전은?
• 예 : 서비스
• 가동중? / 자동 가동?
• 파일
• 경로는? / 소유자는? / 내용은?
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!
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의 경우
패키지 상태을 불러온다.
명령어를 입력하여 패스…
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
29
RESOURCE와 멱등성
• 자세한 Resouce Correction
• CookBook 레시피= New Resource
• Current Resouce를 New Resource와 같은 S
tatus로 조정
• = > Client/Solo는 몇 번이고 실행해도 같은
결과, 같은 상태가 되도록 하고, 항상 실행
되도록 해두는 것이 중요
30
5. Configration Management (Automaticaly/Configration First)
31
구성 관리를 자동화한다.
32
구성 관리의 자동화
• Inventory 등록/갱신(Ohai 수집)
• 플랫폼 정보
• H/W 정보
• N/W 정보
Attribute Override Role 부여・Runlist 부여
Node
Chef-Clinet
Chef-Server
Node
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에서 감시 항목을 설정
34
환경의 구성 관리를 통해 서버 구성을 자동으로 조정
(Configuration Management First)
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 증감에 따라 자동으로 감시 대상의 추가 삭제가 이루어진다.
36
구성 관리=환경 구축
• Chef 상의 요소를 변경=구성 관리 정
보를 갱신한다면
• Client 들이 적당히 조정되어진다.
• 구성 관리하는 모든 것이 연결된다.
37
마치며
• Chef를 그냥 한 번에 빌드하는 툴로
생각해도 틀린 것은 아니지만 부족한
부분이 있다.
• Solo로 갱신해 나가는 것도 좋으나
이것 또한 부족한 부분이 있다.
이것이 Active Directory가 아니냐고 생각하시는 분들이 있는데, 대
략 맞습니다.