Knife는 chef를 제어하기 위한 CLI기반의 툴이다. 관리자는 knife를 이용해서 node, cookbook, roles, databags, envirionments 등 chef의 모든 것을 관리할 수 있다.
Knife도 chef client와 마찬가지로 chef server에서 제공하는 REST API를 이용해서 작업을 한다. chef server와 상호작용하기 위한 CLI 버전이라고 볼 수 있다.
테스트 환경
Virtualbox로 두 대의 centos6.3 운영체제를 올려서 chef-server와 chef-client를 설치했다.
도움말 시스템
# knife --help
Usage: knife sub-command (options)
-s, --server-url URL Chef Server URL
-k, --key KEY API Client Key
--color Use colored output
-c, --config CONFIG The configuration file to use
--defaults Accept default values for all questions
-e, --editor EDITOR Set the editor to use for interactive commands
-E, --environment ENVIRONMENT Set the Chef environment
-F, --format FORMAT Which format to use for output
--no-color Don't use colors in the output
-n, --no-editor Do not open EDITOR, just accept the data as is
-u, --user USER API Client Username
...
knife는 하위 명령에 대한 help도 제공한다.
# knife ssh --help
knife ssh QUERY COMMAND (options)
-a, --attribute ATTR The attribute to use for opening the connection - default is fqdn
-s, --server-url URL Chef Server URL
-k, --key KEY API Client Key
--color Use colored output
-C, --concurrency NUM The number of concurrent connections
-c, --config CONFIG The configuration file to use
--defaults Accept default values for all questions
-e, --editor EDITOR Set the editor to use for interactive commands
-E, --environment ENVIRONMENT Set the Chef environment
-F, --format FORMAT Which format to use for output
-i IDENTITY_FILE The SSH identity file used for authentication
--identity-file
-m, --manual-list QUERY is a space separated list of servers
--no-color Don't use colors in the output
-n, --no-editor Do not open EDITOR, just accept the data as is
--no-host-key-verify Disable host key verification
-u, --user USER API Client Username
--print-after Show the data after a destructive operation
-P, --ssh-password PASSWORD The ssh password
-p, --ssh-port PORT The ssh port
-x, --ssh-user USERNAME The ssh username
...
knife help list로 하위 명령어들을 확인할 수 있다.
# knife help list
Available help topics are:
bootstrap
client
configure
cookbook
cookbook-site
data-bag
environment
exec
index
knife
node
...
knife 설정
knife는 chef client와 같은 레벨에서 작동한다. 따라서 chef server API에 접근하기 위한 설정들이 필요하다. knife 설정파일이름은 ~/.chef/knife.rb 이다.
설정 매개변수들은 다음과 같다.
# knife configure -i
WARNING: No knife configuration file found
Where should I put the config file? [~/.chef/knife.rb]
Please enter the chef server URL: [http://localhost:4000] http://192.168.57.2:4000
Please enter a clientname for the new client: [root] joinc
Please enter the existing admin clientname: [chef-webui]
Please enter the location of the existing admin client's private key: [/etc/chef/webui.pem] webui.pem
Please enter the validation clientname: [chef-validator]
Please enter the location of the validation key: [/etc/chef/validation.pem] validation.pem
Please enter the path to a chef repository (or leave blank):
Creating initial API user...
Created client[joinc]
Configuration file written to /root/.chef/knife.rb
chef API를 사용하기 위해서는 chef cleint로 등록을 해야 한다.
하지만 노드가 처음 만들어진 상태에서 chef-client를 실행하면, 아직 API client 권한을 가지고 있지 않기 때문에 chef server에 요청을 할 수가 없다. 요청을 하기 위해서는 client key 파일을 가지고 있어야 한다. chef 관리자는 knife를 이용해서 client를 등록하고, 이때 만들어진 client key 파일을 배포할 수 있다. 이 key 파일을 이용해서 등록하면 된다.
client를 등록하는 또 다른 (일반적인)방법은 chef-validator으로 등록하는 방법이다. 처음 chef-client가 실행되면 clinet는 먼저 client key 파일을 찾는다. 만약 client key 파일이 없다면 validation.pem 파일을 이용해서 등록을 시도한다. validation.pem 파일은 chef-server의 /etc/chef 디렉토리에 있다. validation.pem 파일을 이용해서 등록된 client는 일반 (none-admin) client로 등록된다.
client 타입
Client는 아래의 두 가지 타입이 있다.
Admin API client : 관리자 권한을 가지는 client다. 읽기와 쓰기권한 모두를 가지고 있다. cookbook을 수정하고, node와 client를 등록하고, data bag을 편집할 수 있다.
일반 client : cookbook에 대한 읽기 권한만을 가지는 client다. validation.pem을 이용해서 등록된 client들은 일반 cleint 권한을 가진다. cookbook을 다운로드 받아서 실행할 수 있다.
create
새로운 API client를 등록할 수 있다. 등록하고 나면 API client를 위한 RSA key pair가 만들어진다. Public key는 chef server에 저장되고 Private key는 화면에 출력되거나 파일로 저장할 수 있는데, 이 private key를 client에 배포하면 된다.
chef-client(일반 client)를 위한 private key 파일은 /etc/chef/client.pem으로 복사한다.
Knife(Admin API client)를 위한 private key 파일은 (보통) ~/.chef/client_name.pem 파일로 복사한다.
사용법
사용법은 다음과 같다.
# knife client create CLIENT_NAME (options)
사용할 수 있는 옵션들이다.
-a, --admin : Admin API client를 만든다. 모든 chef 자원에 접근할 수 있다. -a 옵션이 없을 경우 일반 client를 만든다.
mgmtclient 라는 이름의 admin API client를 만든다.
# knife client create mgmtclient -a -f mgmtclient.pem
kinfe는 chef server의 자원을 말그대로 칼질하는 관리도구다. 따라서 권한 인증을 위한 private key 파일이 필요하다(여기에서는 yundream.pem). 이제 knife를 이용해서 chef 자원을 요리(읽기/쓰기)할 수 있다.
chef 클라이언트 설정파일을 만든다.
Node는 chef-client가 설치된 모든 서버로 물리적인 서버와 (클라우드 기반의)가상화 서버까지 포함하나. chef는 물리 노드와 가상화 노드의 조합으로 이루어진다. chef-client는 각 노드에서 실행되며, Ohai를 이용해서 클라이언트 시스템에 대한 정보를 수집한다.
Chef server는 node의 sub command를 이용해서 노드들을 관리한다.
knife node [ARGUMENT] (options)
create
chef 서버에 노드를 추가한다. 추가된 노드 정보는 chef server에 JSON 형테로 저장된다. knife로 node를 편집하기 위해서는 환경변수 EDITOR에 편집기를 등록해야 한다.
chef에 등록된 노드들에 대해서 ssh로 명령을 수행할 수 있다. 개인적으로 설정이 변경된 노드의 chef-client를 재시작하기 위해서 주로사용한다. 사용법은 아래와 같다.
# knife ssh SEARCH_QUERY SSH_COMMAND (options)
옵션 들
-a, --attribute SSH_ATTR : SSH 연결에 사용 할 attribute를 지정한다. 기본값으로 FQDN이 사용되며, ipaddress와 hostname을 사용할 수 있다. chef client를 등록할때, 호스트의 fqdn 이름을 이용하지 않고 chef-client -N 옵션으로 등록할 수도 있다. 이 경우 fqdn을 이용하면 제대로 접속이 안되므로 -a 옵션을 사용해야 한다.
-P, --ssh-password PASSWORD : SSH 패스워드
-x, --ssh-user USERNAME : SSH 유저이름
-i, --identity-file IDENTITY_FILE : 인증에 사용할 ssh key 파일
-p, --ssh-port PORT : SSH Port 이름
-C, --concurrency NUM : 동시 연결 수. 질의어에 따라서 여러 개의(심지어는 수백개) 노드가 검색될 수 있다. 이 옵션으로 동시 접속 가능한 ssh 수를 제한할 수 있다.
SSH_COMMAND : 실행할 ssh 명령
모든 node의 chef-client를 작동한다.
# knife ssh 'name:*' 'sudo chef-client'
web role을 가지는 모든 node의 uptime을 가져온다. yundream/12345를 이용하며, ip 주소로 접근한다.
Role이 변경됐을 때, 원격 node의 chef-client를 실행하기 위한 유일한 방법이다. 물론 corn에 등록하거나 chef-client -i옵션등을 이용해서 주기적으로 실행하는 방법이 있긴 하지만, 그다지 권할만한 방법은 아닌 것 같다. chef를 이용해서 시스템을 자동화할 경우 unix 계정도 함께 관리할 텐데, 이때 ssh-key를 함께 관리하도록 하자. 그러면 knife ssh와 ssh key를 이용해서, 원하는 시점에 chef-cliet를 실행할 수 있다.
Contents
Knife
테스트 환경
도움말 시스템
knife 설정
EDITOR 환경 변수 설정
knife sub commands
bootstrap
client
client 타입
create
사용법
delete
list
reregister
show
configure
cookbook
create
upload
delete
download
list
show
test
node
create
delete
list
run_list add
run_list remove
show
cookbook-site
data-bag
data bag create
data bag list
data bag 업로드
data bag show
data bag 삭제
environment
exec
role
search
Search 색인 테이블 이름
shef
ssh
status
tag
히스토리
Recent Posts
Archive Posts
Tags