如何管理您的Chef 和 Knife在Ubuntu集群

使用Chef的刀命令查看和管理自己的Chef集群。

介绍

Chef是一个配置管理系统-它的设计给你一个可重复的一套Recipe建设基础设施,帮助客户自动完成,版本,并在大致相同的方式为您的应用程序代码,测试你的基础设施。

这是第六教程入门管理您的基础架构使用Chef系列。 在本指南中,我们假设您已经完成了其他五个教程,因此您已经启动了Chef服务器,工作站和一个或多个节点。

我们的目标

是Chef打包一个命令行工具。 您可能已经使用刀创建和管理Chef烹饪书,数据包或角色。 当你发出带刀的命令时,你通常输入以下命令:

knife cookbook create

上面的例子命令使用cookbook刀子命令。 本指南将向您介绍一些新的刀子命令,用于发出命令和获取有关Chef集群的信息。

我们将涵盖:

  • knife status
  • knife ssh
  • knife node

先决条件

本教程假设你已经沿着直到第五导向,其次如何使用DigitalOcean插件刀的Chef来管理Droplet ,在入门管理您的基础架构使用Chef系列。

创建示例角色和服务器

如果您没有已经建立的Chef集群,或者您希望仔细阅读本指南并看到相同的输出,我们可以设置一些示例角色和服务器。

首先,你的工作站上,更改为chef-repo目录:

cd ~/chef-repo

我们将后端角色添加到我们现有的web_server作用。 现在它将是空白,但以后你可以把它变成一个数据库或应用程序服务器。

nano roles/backend.rb

添加这些内容到backend.rb文件:

name "backend"
description "Backend for application servers"

然后将新角色上传到您的Chef服务器。

knife role from file roles/backend.rb

一旦你这样做,我们可以使用DigitalOcean Knife插件创建一些示例节点。

(注: 此插件变得无人维护作为2014年10这取决于你是否要开始使用它。)

knife digital_ocean droplet create --server-name frontend01 --image 6918990 --location 4 --size 63 --ssh-keys 22222 --bootstrap --run-list "role[web_server]"

knife digital_ocean droplet create --server-name frontend02 --image 6918990 --location 4 --size 63 --ssh-keys 22222 --bootstrap --run-list "role[web_server]"

knife digital_ocean droplet create --server-name backend01 --image 6918990 --location 4 --size 63 --ssh-keys 22222 --bootstrap --run-list "role[backend]"

knife digital_ocean droplet create --server-name backend02 --image 6918990 --location 4 --size 63 --ssh-keys 22222 --bootstrap --run-list "role[backend]"

注意:如果在你的Chef集群中的各个主机的域名不从外部解决,而你让他们编辑的相互连接/etc/hosts的文件,该设置将无法工作,因为新的服务器实例将给予默认的/etc/hosts的文件。

您可能仍然有一些节点活动,您在Chef教程系列中创建。 这意味着我们将在本教程中运行的一些命令将有额外的行或信息。 如果您想沿着准确传达跟随,你可以随时通过点击节点中删除这些节点>从Chef服务器的Web界面删除

显示刀状态的状态

status子命令的目的是显示您的节点的状态信息。 要使用knife status ,只是改变你的chef-repo目录,然后键入:

knife status

你会看到你的Chef服务器知道的节点,包括他们最后的时间列表chef-client运行时,节点名称,完全合格的域名,IP地址和平台。

3 minutes ago, frontend01, fe1.yourdomain.com, 111.111.111.111, ubuntu 14.04.
3 minutes ago, frontend02, fe2.yourdomain.com, 222.222.222.222, ubuntu 14.04.
20 hours ago,  backend01, be1.yourdomain.com, 333.333.333.333, ubuntu 14.04.
3 minutes ago, backend02, be2.youdomain.com, 333.333.333.333, ubuntu 14.04.

我们可以从这个,我们需要采取在backend01细看立即看到-它没有成功地运行chef-client (在Chef的说法“签入”),在大约20小时。

如果你有类似的情况的一个节点,请检查您的chef-client错误日志,或使用报告>运行历史从Chef服务器的Web界面。

用刀ssh发出命令

我们可以用knife ssh一下子发给我们的节点(或节点的某个子集)的命令。 例如,我们可以用knife ssh重启Nginx的我们与作用前端的所有节点上。

你需要授权SSH到服务器的用户(例如,您可以运行ssh yourusername@fe1.yourdomain.com ,并得到一个shell)。 如果您还没有SSH密钥设置,则可以使用-P选项来提示输入密码。

knife ssh "role:web_server" "service nginx restart" -x yourusername -a ipaddress

你应该得到看起来像这样的输出:

111.111.111.111  * Restarting nginx nginx      [ OK ] 
222.222.222.222  * Restarting nginx nginx      [ OK ] 

我们只是通过发出一个命令,刀跑了我们所有的前端服务器上的命令。 让我们拉开的参数和学习一些有关如何knife ssh工作。

knife ssh "web_server" "service nginx restart" -x yourusername -a ipaddress

第一个参数knife ssh是一个Chef的搜索查询-通常你会想是这样role:YOUR_ROLE_NAME ,但你也可以通过很多其他属性进行搜索(与布尔运算符将它们结合起来)。 例如,运行在自己的平台属性的Ubuntu只是节点上的一个命令,你可以运行:

knife ssh "platform:ubuntu*" "service nginx restart" -x yourusername -a ipaddress

在上面的*是通配符。 它将匹配属性值中的零个或多个字符。 在这种情况下,它将使我们作为显示在匹配值的Ubuntu 14.04 knife status我们前面输出。

knife ssh "role:web_server" "service nginx restart" -x yourusername -a ipaddress

的第二个参数knife ssh是要在服务器(匹配搜索查询)上运行命令。 它几乎可以是任何你可以键入到shell。 你甚至可以加入用分号命令(;)。

knife ssh "role:web_server" "uptime;date" -x yourusername -a ipaddress

这将输出像:

111.111.111.111  12:53:36 up 2 days, 15:25,  1 user,  load average: 0.08, 0.03, 0.05
111.111.111.111 Wed Oct 22 12:53:36 UTC 2014
222.222.222.222  12:53:30 up 2 days, 15:21,  1 user,  load average: 0.00, 0.01, 0.05
222.222.222.222 Wed Oct 22 12:53:30 UTC 2014

-x我们已经覆盖的说法-这是SSH用户名用于登录。

-a参数指定哪个节点属性用来作为地址SSH。 默认情况下,这是你的节点(请记住,你可以用这个找到的FQDN knife status前面显示的命令),因此,如果您可以通过访问解决您的服务器http://fe1.yourdomain.com ,那么你可以省略-a选项。

互动刀ssh

knife ssh也有把你带入一个交互式shell,在那里你可以发出一系列命令和看到的结果非常快的能力。 您可以启动一个交互式knife ssh通过使用shell interactive的地方你的SSH命令的。

knife ssh "role:web_server" interactive -x yourusername -a ipaddress

这将告诉我们:

Connected to 111.111.111.111 and 222.222.222.222

To run a command on a list of servers, do:
  on SERVER1 SERVER2 SERVER3; COMMAND
  Example: on latte foamy; echo foobar

To exit interactive mode, use 'quit!'

knife-ssh>

您可以通过简单地输入命令,按回车键发出在搜索结果中的所有服务器的命令。

knife-ssh> uptime
111.111.111.111  18:43:55 up 2 days, 21:16,  1 user,  load average: 0.01, 0.03, 0.05
222.222.222.222  18:43:49 up 2 days, 21:11,  1 user,  load average: 0.00, 0.01, 0.05

如果您想进一步细化您的服务器列表,只需要使用on ,作为帮助信息提示。 需要注意的是,你应该在你作为属性的例子命令替换SERVER1 -a ; 对我们来说,这是节点的IP地址。

knife-ssh> on 111.111.111.111; echo hello digitalocean
111.111.111.111 hello digitalocean

一个非常酷的应用互动的knife ssh是用它来尾部服务器日志。 举例来说,如果你的Nginx的访问日志是在默认位置( /var/log/nginx/access.log ),您可以尾部的日志-f (后续)选项,然后将结果打印持续到控制台。

knife-ssh> tail -f /var/log/nginx/access.log

(根据Nginx的设置方式,您可能需要使用sudo这个命令的前面。)

如果您在Web浏览器中访问其中一个节点的IP地址,您将看到一个条目出现在Nginx访问日志中,而无需执行任何操作!

管理刀节点节点

如果您遵循了如何创建简单的RecipeChef来管理在Ubuntu基础设施指南,那么您已经使用了knife node列出您的Chef服务器上的所有节点,以及编辑节点属性。

knife node list
knife node edit frontend01

您还可以使用knife node来删除节点。

knife node delete frontend01

或者,显示更详细的节点属性:

knife node show frontend01
*******
Node Name:   frontend01
Environment: _default
FQDN:        fe01.yourdomain.com
IP:          111.111.111.111
Run List:    role[frontend]
Roles:       web_server
Recipes:     apt, nginx, apt::default, nginx::default
Platform:    ubuntu 14.04
Tags:     

你可以使用你的节点的属性的完整列表-l选项:

knife node show -l frontend01

这将返回一个很长的属性列表,其中大部分由Ohai,这是一个Chef工具,它会自动将属性自动填充chef-client每次运行的时间。

长打印的属性列表对我们来说不是非常有用。 然而,刀也有我们覆盖那里。 我们可以指定--format为了得到一个节点的属性的JSON或YAML表示选项。

knife node show frontend01 --format json
*******

{
  "name": "frontend01",
  "chef_environment": "_default",
  "run_list": [
  "role[web_server]"
]
,
  "normal": {
    "tags": [

    ]
  }
}

您还可以检索与单个节点属性-a

knife node show frontend01 --format json -a ipaddress
*******
{
  "frontend01": {
    "ipaddress": "111.111.111.111"
  }
}

如果我们想要构建涉及Knife的更复杂的脚本,或者甚至用于显示仪表板和指标,JSON或YAML输出可能非常有用。

结论

刀是一个强大的工具,不仅用于创建和更新Chef集群中的各种对象,还用于查看和管理集群的状态。

随着knife ssh ,你可以写一个命令,并让它在多个节点上同时运行-任何DEVOPS工程师一个非常强大的工具。