概述
knife是一个命令行工具, 它提供了一个本地的chef库和Chef服务器. Knife可以帮助用户进行如下管理:
* 待部署机器节点Nodes
* Cookbook和Recipe
* Roles
* Json数据
* 环境数据
* chef-client的部署安装
* 查询chef-server上的索引数据
Knife位于chef workstation和chef server之间. 通过REST API同Chef Server进行交互, 这个API也可以被chef client使用. Knife使用RBAC(Role-based authentication controls)基于角色的鉴权控制来跟Chef Server通信. Knife在workstation初始化的时候会被配置好, 配置文件是knife.rb 一般位于用户目录下的~/.chef/knife.rb
knife有很多内置的命令, 这些命令一起可以提供很多功能来设置一个机构的所有资源, 如cookbook, nodes, roles, data bags, environments 以及users.
Knife插件可以拓展这些内置的命令.
Knife主要有如下命令:
* bootstrap 该命令是执行bootstrap操作, 在目标系统上安装chef-client. boostrap操作必须有FQDN的支持
* client 该命令是用来管理API的客户端列表和与他们关联的RSA公钥. 通过它可以允许任何实体, 包括chef-client和Knife来访问Chef-Server
* configure 该命令用来创建knife.rb和client.rb文件. 用来配置chef workstation和chef nodes
* cookbook 该命令用来跟位于Chef Server和本地chef-repo上的cookbook交互
* cookbook site 该命令是用来跟位于https://cookbooks.opscode.com上的cookbook交互. 不过如果要写入权限的话得申请公用账号
* data bag 该命令是用来管理全局变量的JSON数据
* delete 该命令是用来删除Chef Server上的对象
* diff 该命令是用来比较Chef Server和本地之间的chef-repo的文件和目录的不同
* download 该命令是用来从Chef Server上下载roles, cookbooks, environments, nodes, data bags到当前工作目录
* environment 该命令是用来管理Chef Server上的一个机构的环境
* exec 该命令是用来执行Ruby脚本, 其上下文环境是chef-client. 该命令是执行一些当前的knife子命令还没有覆盖到的操作
* index rebuild 该命令是用来执行在Chef Server上重建搜索索引. 这个操作会花费一些时间
* list 该命令是用来查看Chef Server上的对象列表
* node 该命令是用来管理Chef Server上的node列表
* recipe list 该命令是用来查看Chef Server上所有的recipes. 此处可以通过简单的正则表达式来查看recipe.
* role 该命令用来管理Chef Server上的跟nodes关联的各种角色
* search 该命令用来执行在Chef Server上执行一个搜索查询语句
* show 该命令是用来查看Chef Server一个或多个对象的详细信息
* ssh 该命令是用来在一个组织的一个或多个节点上执行SSH命令(支持并发), 这些节点可以是基于查询拿到的结果值
* status 该命令是用来呈现Chef Server的概要信息, 主要包括最近的成功运行的chef-client信息
* tag 该命令是用来在Chef Server上应用tags到nodes
* upload 该命令是用来从当前工作路径的chef-repo上传roles, cookbooks, environments和data bags到Chef Server.
* user 该命令是用来管理用户列表和他们的RSA公钥对
Knife包含一系列的由动词组成的子命令: delete, deps, diff, download, edit, list, show, upload, xargs. 这些子命令允许Knife通过这些命令跟存储在chef-repo里或Chef Server内的任何对象进行交互. 这些子命令的重要的准则主要如下:
* 当命令用在chef-repo的对象上时, 命令首先是目标行为: 也就是上面的verb, 然后是对象所在的目录, 如(clients, cookbooks/,data_bags/, environments/, nodes, roles/, users/). 命令可以组成为: download cookbooks/
* 当命令作用在外部的Chef Server上时, 主要操作acls, groups, containers等
* 当把Chef Server看成是一个文件系统时, 可以将Chef Server上的chef-repo看成是workstation上的一个chef-repo备份. Chef Server会有跟本地一样的chef-repo. 在修改文件时, 只需要从Chef Server上下载下来, 修改后,再上传上去
* 运行命令的时候要注意上下文环境. 比如当在roles目录下shi, Knife会有上下文环境的嘻嘻你. 即输入knife show base.json和输入knife show roles/base.json显示的信息一样, 都是返回Chef Server上的基本角色.
* Chef Server支持并发的请求,不过得基于每个指令的配置
Knife命令的基础参数
以下这些参数可以在knife的任何一个子命令中或插件中有效:
-c CONFIG, —config CONFIG 设置配置文件
—color 指明输出的颜色
-d, —disable-editing 指明$EDITOR不会被使用, 呈现出最原始的数据
—defaults 指明Knife将使用默认值, 而不是用户提供的
-e EDITOR, —editor EDITOR 指明$EDITOR在所有交互命令中被使用
-E ENVIRONMENT, —environment ENVIRONMENT 环境名. 当这个参数被添加时, 命令将只会运行被指明的环境名
-f FILE_NAME, —file FILE_NAME 指明私有密钥会被存储的文件
-F FORMAT, —format FORMAT 指明输出文件格式: summary(默认), text, json, yaml 和 pp
-h, —help 显示help信息
-k KEY, —key KEY Knife将会使用的跟Chef Server通信的私有密钥
—no-color 指明输出不会有颜色区分
-p PASSWORD, —password PASSWORD 用户密码
—print-after 指明shuu会在解构后显示
-s URL, —server-url URL Cher Server的URL地址
-u USER, —user USER Knife用来登录Chef Server的用户名, 如果该参数被使用后,请确定带的key也是该用户的, 否则会失败
-v, —version Chef-Client的版本
-V, —verbose 设置更多的输出 -VV是最大输出
-y, —yes 指明会对所有的确认操作回答”yes”, Knife可以不用向用户确认
如何创建一个chef-repo
主要有如下几个方法:
* 从github上clone下来
* 下载源码包, 然后放到本地的源码管理上
注意 Opscode强烈建议在chef-repo目录上使用源码管理. Opscode使用git来管理所有东西, 包括cookbooks.
Clone
clone的位置:https://github.com/opscode/chef-repo
大致步骤:
1. 安装git
2. git clone https://github.com/opscode/chef-repo
3. 如果使用其他源码管理工具, 可以手动移除.git目录,然后用其他工具对其进行初始化
下载
大致步骤:
1. wget http://github.com/opscode/chef-repo/tarball/master
2. tar -zxvf master
3. mv opscode-chef-repo-* chef-repo
TODO 待阅读资料
创建chef-repo http://docs.opscode.com/essentials_repository_create.html
Knife的基础命令 http://docs.opscode.com/knife_common_options.html
使用Knife http://docs.opscode.com/knife_using.html 正在阅读 未完成
Knife的子命令介绍 http://docs.opscode.com/knife.html 重点弄明白如何下载一个cookbook, 如何自制一个cookbook, 如何向node节点传送一个cookbook