안녕하세요. 코미야입니다.
어떻게 된 일이야
급하다면 건너뛰셔도 됩니다. 약 반년 전, Chef-Solo가 폐기(폐기)되었고 개발자가 chef-zero(localmode)를 사용하라고 알려주었습니다. 그때 여러 가지를 비교해 보고 시간이 지나서 확인했습니다. 몇 년 후 교체되는 대신 오래 지속될 것이라는 전제로 기술 부채를 남기고 싶지 않은 경우가 있는 것 같습니다. 솔직히 말해, 비용이 들면서 마이그레이션할지 말지는 민감한 문제이며, SOLO가 곧 사라질 거라고는 생각하지 않습니다. 전 세계적으로 cookpad는 itamae를 출시했고 Ansible은 인기가 많습니다. Ansible이 치명적이라는 얘기를 들었는데, 함수를 'not_if'에 동등하게 만들려고 하면 리허설을 할 수 없다고 들었지만, 애초에 YAML로 다시 작성하는 데 비용이 들지 않아서 시도해보지는 않았습니다. 이타마에도 궁금했는데, 역할과 환경을 속성으로 재변환하는 데 번거로움이 있을 것 같았습니다. 역할과 환경 모두 의도적으로 딥머지되고 배열 속성으로 우선순위 순서대로 초기화되어 있어서, 이 수정이 꽤 무거운 것 같아요. 또한 데이터_bags 기능이 없는 점도 정말 짜증납니다. 다른 곳으로 마이그레이션하려면 셰프 늪에 갇힌 것 같아요. 또한, 커뮤니티 버전에서는 Chef-Server의 HA 기능이 NG였던 적도 있었습니다.
현실적으로는 localmode일 테니, 평소처럼 서로 확인해봤고, 메모 형태입니다.
셰프에 관한 정보는 많지만, 모호크족(기술 수준이 너무 높은 사람들)만 있어서 초보자들이 어디서 혼란스러운지 상상하지 못하는 핵심 포인트를 이해하기 어렵습니다. 사용하는 방법은 다양하고 환경마다 다르기 때문에 미쳐버리거나 약간 혼란스러워질 수 있습니다.
이해하기 쉬운 좋은 차트를 보고 나중에 추가할게요. 어떤 셰프가 당신에게 맞나요? 〜 추천 구성 확인 차트 #getchef - 크리에이션라인 주식회사
이해의 용이함이 전파와 발전에 매우 중요하다고 생각합니다. 이런 글이 어느 정도 기여할 수 있기를 바랍니다.
참고문헌
여러 가지를 살펴봤으니, 참고 정보를 바탕으로 소개해 보겠습니다. 패턴을 나누겠습니다. Chef-Zero의 메커니즘과 기능을 따로 구글링하면 더 이해하기 쉽지만, 메모리 내 Chef-Server와 로컬 모드는 차이가 있고, 제가 하려는 것은 로컬 모드입니다. 메모리 내 Chef-Server로 사용하려면 Chef-Zero를 시작하고 knife 명령어로 cookbook, role, environment, data_bags 데이터를 등록해야 합니다. 메모리 내이기 때문에 Chef-Zero를 멈추면 등록된 데이터는 사라집니다. 시간을 고려할 때, Chef-Server로 이전을 앞두고 chef-shell에서 얻을 수 있는 정보를 보고 싶을 때 유용할 것 같다고 생각했습니다. 브라우저에서 접근할 때 등록된 JSON 정보를 보는 것이 편리할 수 있지만, 아마도 git 수준이었던 것 같습니다. 로컬 모드로 사용할 때는 명령어가 실행될 때만 내부적으로 시작하고, 레시피가 적용될 때만 떨어지는 것 같으며, knife.rb에 작성된 Chef-repo 경로를 별도의 노력 없이 확인하기 때문에 추가적인 번거로움이 없는 것 같습니다.
・Chef-Zero를 메모리 내 Chef-서버로 실행하려는 타입 아 마존 리눅스에서 간단한 chef 서버(chef-zero)를 실행해 보았어요 | Developers.IO CentOS에 chef-zero 설치 - clavier의 일기, chef-zero를 만들고 knife-xenserver와 연결해 - 요헤이의 데일리 헌신 XP 루비 - knife zero 부트스트랩 원격으로 chef를 설치할 수 없습니다 - Qiita 가볍고 단순한 Chef Server "chef-zero" #opschef_ja « CREATIONLINE, INC. #Docker Chef Zero를 경량 인메모리 Chef 서버로 사용하여 호스트 OS에서 Docker 컨테이너를 관리하기 위해 Chef #Chef #GetChef_ja - Qiita를 사용합니다
・로컬 모드로 Chef-Zero를 돌리고 싶은 타입 Knife-Zero를 Chef-Zero로만 운영할 수 있도록 만들었고, Chef의 로컬 모드로 로컬 모드 운영도 했습니다 . 노드 설정 정보도 얻을 수 있습니다. - Qiita 서버 관리자용 Chef Super Introduction (2): Knife-Zero로 요리책 생성/실행/삭제 및 git clone 명령어로 요리책 가져오기 @IT(1/2) - chef_localmode_tutorial/knife.rb at master · higanworks/chef_localmode_tutorial 구성 관리 도구를 사용해 보겠습니다 Chef - ConoHa VPS(가상 개인 서버)용 Chef Super 소개 서버 관리자 (2) - @IT 보조 자료, Cookbook Directory - Qiita Knife-Zero 부트스트랩으로 Amazon EC2에 Chef 설치 방법 - Qiita Chef-Solo에서 Chef-Client 로컬 모드로 마이그레이션 #opschef_ja #getchef_ja « CREATIONLINE, INC. 오레노 나이프-제로 노트 - 오레노블로그
・ DevOps 구현을 위한 기타 Chef 실용적 기법 Chef # 1 시작 – 개요, EC2에 Chef Server 설치, 워크스테이션 구성 | Developers.IO #GetChef_ja - 트위터 검색 "knife-helper"라는 플러그인을 만들었습니다. 나이프 명령이 너무 번거로워서 #getchef_ja - 기타 노트 " knife-helper"라는 플러그인을 만들었습니다. 나이프 명령어가 너무 번거로웠기 때문입니다 - Qiita knife.rb — Chef Docs GNU 병렬 | 홈페이지는 없습니다
또한 "셰프 사용 가이드"를 좀 더 자세히 살펴보세요. 튜토리얼 없는 사전 같지만, 최근에야 일본어로 'man'을 읽을 수 있다는 게 행운♪이라고 생각했어요.
셰프-제로, 나이프-제로 설치
운영체제는 CentOS 6.5입니다. 당분간은 루비 버전이 낮으면 오하이가 화낼까 봐 2.1.5를 rbenv에 넣고 전역으로 만들었습니다. (하지만 약간의 DL 경고가 있습니다.) chef-dk도 있는데, 진입 경로가 걱정돼서 당분간 Gem에 넣었습니다.
Bundler는 당신에게 더 의존적이니 다음 방법은 하지 마세요: $ sudo -i gem install chef-zero json --no-ri --no-rdoc $ sudo -i gem install knife-zero --no-ri --no-rdoc
번들 전에 스위치 사용자 루팅을 하세요
$ 스도 수 -
# CD /path_to_chef-리포/
# vi 보석 파일
출처 'https://rubygems.org'
gem 'berkshelf', '~>3.0.0'
# 버크셸프는 해시/hash_extensions 파일을 필요로 합니다.
젬 '해시', '>=2.0.2', '<3.0.0' 젬 '셰프' #追加석 '셰프-제로' #追加 젬 '나이프-제로' #追加 그룹 :테스트 도보석 '푸드크리틱', '~>3.0.0'
gem 'test-kitchen', '~>1.3.0'
gem 'mixlib-shellout', '~>1.3.0'
gem 'kitchen-ec2', '~>0.8.0'
보석 '서버스펙'
끝
# 번들 설치
net-ssh-2.9.3.beta1 성공적으로 설치되었습니다
net-scp-1.2.1 성공적으로 설치되었습니다
~생략~
mixlib-authentication-1.3.0을 성공적으로 설치했습니다
chef-12.2.1 *Chef12가 포함됨
knife-zero-1.4.0 성공적으로 설치됨
34개의 보석 설치
목록
# 번들 쇼
chef-client의 경우, sudo curl -L https://www.opscode.com/chef/install.sh | bash -x 이렇게 하면 워크스테이션이 chef-12.2.1-1.el6.x86_64.rpm을 입력하려고 시도합니다. (2015년 4월 기준) knife-zero를 입력하면 chef-12도 스스로 입력되어 당분간은 작동합니다. 하지만 원격 측에 knife zero 부트스트랩을 넣으면 chef (11.12.4)와 chef-zero (2.0.2)가 포함됩니다. 레시피를 적용할 수 있습니다.
도움말에는 '$ Knife 도움말 목록'처럼 보이는 항목이 나올 수 있습니다. 'knife zero bootstrap --help'라고 하면 'knife zero' 도움말도 보일 것입니다. 만약 보이지 않는다면, 아마도 잘 안 된 것일 겁니다.
셰프-클라이언트의 로컬 모드에서 Localhost에 레시피를 적용하기
IAM 역할과 cloud-init를 사용해 AMI에서 시작하자마자 localhost에 레시피를 적용하고 싶다면, chef-zero를 설정할 필요가 없고, git clone으로 Chef-Repo를 얻어 키를 얻고 매개변수를 전달한 후 다음 작업을 실행하는 것이 좋습니다.
$ sudo chef-client -z -r role[web] -E 샌드박스 --validation_key/etc/chef/validation.pem
-z를 추가하면 chef-zero가 그 시점에만 실행되는 것 같고, chef-zero가 이미 시작되어 있고 포트가 충돌 중이면 오류가 종료됩니다. 옵션 세부사항은 명령어 --help에 추가할 수 있는 것 같습니다. client.rb로 작성된 옵션만 지정하면 굳이 지정할 필요는 없습니다. git clone 같은 방법으로 chef 저장소를 삭제한 후에는 이런 종류의 작업이 괜찮은 것 같습니다. sudo를 추가하지 않으면 권한이 필요한 프로세스로 오류가 종료됩니다. knife.rb, client.rb, varidation-key 설정이 필요합니다. (chef 저장소를 수정할 필요가 없었어요!) 네!! 사실 chef-zero가 포함되지 않아도 chef-client는 로컬 모드 옵션으로 실행하면 레시피를 적용할 수 있는 것 같습니다. (INFO에서는 chef-zero 서버가 NotFound로 표시되며, 내부적으로는 명령이 실행될 때만 시작되며, 명령이 끝난 후 크래시가 발생하는 것은 아니지만 레시피는 계속 진행됩니다.)
chef-repo/.chef/knife.rb 는 다음과 같습니다: localmode true, -z 없이도 로컬 모드에서는 작동하는 것 같습니다.
chef_repo = File.join(File.dirname(__FILE__), "..")
current_dir = File.dirname(__FILE__)
log_level :정보
log_location STDOUT
#node_name '우나메 -n'
client_key "#{current_dir}/dummy.pem"
validation_client_name '셰프-검증자'
validation_key "#{current_dir}/dummy.pem"
#validation_key "/etc/chef/validation.pem"
cookbook_path ["#{chef_repo}/cookbooks", "#{chef_repo}/site-cookbooks"]
node_path "#{chef_repo}/nodes"
role_path "#{chef_repo}/roles"
environment_path "#{chef_repo}/environments"
data_bag_path "#{chef_repo}/data_bags"
encrypted_data_bag_secret "path_to_databagkey"
나이프[:berkshelf_path] = "#{chef_repo}/요리책"
#knife[:ssh_user] = ""
#knife[:ssh_password] = ""
칼[:ssh_port] = 22
knife[:editor] = "vim"
localmode true
chef_server_url 'http://127.0.0.1:8889'
syntax_check_cache_path "#{current_dir}/syntax_check_cache"
#puts Chef::Config.inspect
어떻게든 chef 설정 파일이 루비처럼 보인다는 것을 깨달았습니다. (backquote를 붙여 node_name에 전달하려고 했고, 작동은 했지만 chef-client가 멈춘 것 같습니다. 다음 단계로 키를 준비했습니다. chef-zero는 인증이 필요한 것 같지만, 공식 키가 필요 없으면 Knife를 실행할 수 없고 오류가 발생합니다.
$ ssh-keygen -t rsa -N "" -f ~/chef-repo/.chef/dummy.pem
/etc/chef/client.rb는 다음과 같습니다. 작성할 수 있는 매개변수는 "Chef Usage Guide"에 나열되어 있습니다.
log_level :정보
log_location STDOUT
chef_server_url "https://127.0.0.1:8889" ## Chef-Zero의 API 엔드포인트
#validation_client_name '셰프-검증자'
client_fork 맞아요
client_registration_retries 5
#node_name '우나메 -n'
#puts Chef::Config.inspect
워크 스테이션에서 레시피를 원격 클라이언트에 적용하고 싶을 때
여러 반전과 전환 끝에 KniFe Zero는 다음과 같이 해결되었습니다.
url=https://www.opscode.com/chef/install.sh
newip=xxx.xxx.xxx.xxx
역할=웹
env=샌드박스
사용자=호게
dpas='cat /pashto_sshpassword_file'
$ 나이프 제로 부트스트랩 --node-name $newip --bootstrap-url $url -i .chef/dummy.pem -x $user --sudo \
-E $env -r 역할\[역할명\] -z -s $(cat ./databag_key) -P $dpas $newip
부트스트랩이었지만, 레시피를 적용하는 명령 하나만으로 끝났습니다. 로그인하자 /etc/chef/client.rb가 자동으로 생성되었고, data_bags 키가 복사되어 배치되었습니다. 다음 시도 이후에는 -s가 필요 없었습니다. (저장소가 어디에도 없었고, rsync 부하가 초과되면 워크스테이션에서 여러 프로세스를 실행하는 프로세스 중 하나가 중단될 거라고 생각했습니다.) Mr. Sawanobori가 최대 2000노드까지 운영할 수 있다는 기사를 본 기억이 있지만, 저는 기계 사양이 다루지 않는다고 생각했던 기억이 납니다. )
$ 이즈 /etc/셰프
client.pem client.rb encrypted_data_bag_secret first-boot.json validation.pem
$ sudo cat /etc/chef/client.rb
log_location STDOUT
chef_server_url "http://localhost:8889"
validation_client_name "셰프-검증자"
node_name "10.xxx.xxx.xxx"
그래서 저는 기뻤어요. 잠깐 키를 인증하고 싶은데, 그게 비밀번호 인증이 된다는 걸 이해가 안 돼요! 아마도 그렇게 생각하는데, 아직 아무것도 안 했어요. 걸리기 쉽기도 해요. 포트 포워딩에 익숙하지 않아서 그런 건지 궁금해요. 잘 모르겠어요. knife.rb에 평문으로 쓸 수 있어서, 굳이 약속하지 않으려고 조심하는 것 같아요. #knife[:ssh_user] = "" #knife[:ssh_password] = " "
knife zero에는 클라이언트와 diagnate 두 개의 하위 명령어가 더 있습니다. 클라이언트는 두 번째와 그 이후의 레시피를 적용하는 데 사용되는 것 같고, Diagnase는 설정을 보러 가는 것 같습니다.
·클라이언트가 제가 다음에 했을 때 작동했습니다: -o 이것은 레시피를 부분적으로 적용한 예입니다.
$ 나이프 제로 chef_client -c ~/chef-repo/.chef/knife.rb '이름:10.xxx.xxx.xxx' \
-x $user -i .chef/dummy.pem --sudo -E $env -o base::openssl -a ipaddress 10.xxx.xxx.xxx --remote-chef-zero-port 8889 -z
・진단은 아래에 보이는 현재 인식된 값들의 목록과 같습니다. 명령어가 작동하지 않을 때 확인하면 누락된 설정이나 옵션이 있는지 확인할 수 있습니다.
$ 나이프 제로 진단 -c ~/셰프-레포/.chef/knife.rb -z
Chef::Config
====================
---
:local_mode: 맞아요
:knife_zero: 맞아요
:장황함:
:config_file: "/path-to-config/.chef/knife.rb"
:log_level: :오류
:log_location: !ruby/object:IO {}
:node_name: |
~생략~
"Knife Zero 부트스트랩 ≒ knife solo prepare+cook", "knife zero chef_client ≒ knife ssh+search+cook" 등등. 지금까지 Knife Zero를 유지하고 있었지만, Knife Solo도 로컬 모드를 지원할 계획인 것 같습니다. (노드 구성을 관리하기 싫어하는 이유는 BlueGreen 배포와 유사한 스왑 작업에서 노드 구성이 꽤 동적으로 변하기 때문에, 나이프 제로는 너무 과한 것 같습니다.) ) Chef-Solo, Chef-Client LocalMode, Knife-Solo, Knife-Zero 그리고 우리. — sawanoboly.net solo.rb에 local_mode 추가하세요 · 이슈 #353 · matschaffer/knife-solo (관련 디렉터리 전체를 전송하거나, LocalMode 동등한 실행 형식으로 원격으로 변경하는 등)
knife-zero가 번거롭다면, knife-solo와 같은 양의 처리를 로컬 모드에서 직접 해도 괜찮다고 생각합니다. 즉, Chef-Repo를 옮기고 sh를 통해 chef-client를 누르는 것이 좋은 생각이라고 생각합니다. (만약 sdo를 만들고 싶다면, ssh에 -t를 추가할 수 있습니다)
병렬 처리에 대하여
CPU가 한 코어였기 때문에 병렬성을 느끼지 못했지만, GNU의 병렬 명령어를 사용해 이동할 수 있었습니다. 표준 출력은 완료 후 하나씩 나오는 느낌이었습니다. 출력은 각 호스트별로 혼합되지 않았습니다.
$ 평행 -j 3 나이프 제로 부트스트랩 -c ~/셰프-레포/.chef/knife.rb -z -E $env -r 역할\[역할명\] \
-I .chef/dummy.pem -s $(cat ~/path_to_databag-key) --sudo --no-host-key-verify ::: $host 1 $host 2
Parallel의 남자는 파일에서 먹을 수 있는 것 같았어요. 칼 도움말을 찾아서 오류가 생기는 것보다 쉬울 수도 있어요. 하지만 rpm이 없으니 직접 rpm을 만들어야 해요.
검색 기능을 써봤어
・데이터 검색 예시_bags
$ 나이프 쇼 data_bags/베이스/* --local-mode
$ 나이프 검색 nginx 'id:nginx_status' --local-mode
$ knife search nginx 'servername:"proxy01"' --local-mode
$ 나이프 검색 nginx 'servername:"*.net"' --local-mode --id-only"
$ knife search nginx 'servername:*.net AND certificatename:xxx-wildcard' --local-mode
'--id-only'를 추가하면 id만 나옵니다. AND 외에도 OR과 NOT도 사용할 수 있는 것 같습니다. 다음 특수 문자는 반드시 백슬래시(Chef Usage Guide P242 부근에서) '+ - &&& || ! () {} [] ^ " ~ * ? : `
검색 결과를 병렬로 실행할 수 있다면 좋겠지만, 노드를 제대로 관리해야 할 것 같았습니다.
글쎄요, 좀 길어서 여기서 실례하겠습니다. 시청해 주셔서 감사합니다.