如何在Ubuntu上使用Chef和Knife管理集群

来自菜鸟教程
跳转至:导航、​搜索

介绍

Chef 是一个配置管理系统——它旨在为您提供一组可重复的 配方 来构建您的基础架构,允许您以与应用程序代码几乎相同的方式自动化、版本化和测试您的基础架构。

这是 使用 Chef 开始管理您的基础架构系列的第六篇教程。 在本指南中,我们假设您已完成其他五个教程,因此您已经拥有了 Chef 服务器、工作站和一个或多个节点并正在运行。

我们的目标

knife是Chef打包的命令行工具。 您可能已经使用刀创建和管理 Chef 食谱、数据包或角色。 当您使用刀发出命令时,您通常会键入以下内容:

knife cookbook create

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

我们将介绍:

  • knife status
  • knife ssh
  • knife node

先决条件

本教程假定您已经学习到第 5 个指南,如何使用 DigitalOcean 插件来管理 Chef 中的 Droplets,在 Getting Started Management Your Infrastructure Using Chef 系列中。

创建示例角色和服务器

如果您没有已建立的 Chef 集群,或者您想密切关注本指南并查看相同的输出,我们可以设置一些示例角色和服务器。

首先,在您的 工作站 上,切换到您的 chef-repo 目录:

cd ~/chef-repo

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

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 界面单击 Nodes > Delete 来删除这些节点。

用刀状态显示状态

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 - 它在大约 20 小时内没有成功运行 chef-client(用 Chef 的说法“签入”)。

如果您有一个节点处于类似情况,请检查您的 chef-client 错误日志,或从 Chef 服务器的 Web 界面使用 Reports > Run History

使用刀 ssh 发出命令

我们可以使用 knife ssh 一次向我们的节点(或某些节点子集)发出命令。 例如,我们可以使用 knife ssh 在角色为 frontend 的所有节点上重新启动 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 的内容,但您也可以通过许多其他属性进行搜索(并将它们与布尔运算符结合使用)。 例如,要仅在 platform 属性中具有 ubuntu 的节点上运行命令,您可以运行:

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

上面的 * 是通配符。 它将匹配属性值中的零个或多个字符。 在这种情况下,它将允许我们匹配我们之前看到的 knife status 输出中显示的值 ubuntu 14.04

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 中,您可以在其中发出一系列命令并快速查看结果。 您可以使用 interactive 代替 SSH 命令来启动交互式 knife ssh shell。

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>

您只需键入命令并按 Enter 即可向搜索结果中的所有服务器发出命令。

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 (follow) 选项跟踪日志,结果将不断打印到您的控制台.

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

(根据 Nginx 的设置方式,您可能必须在此命令前使用 sudo。)

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

用刀节点管理节点

如果您已遵循 如何创建简单的 Chef Cookbooks 以在 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"
  }
}

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

结论

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

使用 knife ssh,您可以编写一个命令并让它同时在多个节点上运行——对于任何 devops 工程师来说,这是一个非常强大的工具。