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

介绍

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

在本指南中,我们将假设你已经完成了其他五个教程,因此你有一个厨师服务器,工作站和一个或多个节点。

我们的目标

knife 是由 Chef 组成的命令行工具,您可能已经使用了刀来创建和管理 Chef 烹饪书、数据袋或角色。

1knife cookbook create

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

我们将覆盖:

  • knife status
  • knife ssh
  • knife node

前提条件

本教程假定您已遵循第五个指南(How To Use the DigitalOcean Plugin for Knife to Manage Droplets in Chef)(https://andsky.com/tech/tutorials/how-to-use-the-digitalocean-plugin-for-knife-to-manage-droplets-in-chef),在 Getting Started Managing Your Infrastructure Using Chef系列中。

创建示例角色和服务器

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

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

1cd ~/chef-repo

现在它将是空的,但稍后你可以把它变成一个数据库或应用程序服务器。

1nano roles/backend.rb

将此内容添加到backend.rb文件中:

1name "backend"
2description "Backend for application servers"

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

1knife role from file roles/backend.rb

一旦完成,我们可以使用DigitalOcean Knife插件创建一些样本节点。

(注: 此插件自2014年10月起未经维护。

1knife digital_ocean droplet create --server-name frontend01 --image 6918990 --location 4 --size 63 --ssh-keys 22222 --bootstrap --run-list "role[web_server]"
2
3knife digital_ocean droplet create --server-name frontend02 --image 6918990 --location 4 --size 63 --ssh-keys 22222 --bootstrap --run-list "role[web_server]"
4
5knife digital_ocean droplet create --server-name backend01 --image 6918990 --location 4 --size 63 --ssh-keys 22222 --bootstrap --run-list "role[backend]"
6
7knife 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-repo目录并键入:

1knife status

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

13 minutes ago, frontend01, fe1.yourdomain.com, 111.111.111.111, ubuntu 14.04.
23 minutes ago, frontend02, fe2.yourdomain.com, 222.222.222.222, ubuntu 14.04.
320 hours ago, backend01, be1.yourdomain.com, 333.333.333.333, ubuntu 14.04.
43 minutes ago, backend02, be2.youdomain.com, 333.333.333.333, ubuntu 14.04.

我们可以立即从这里看出,我们需要更仔细地看看 backend01 - 它在大约20小时内没有成功运行chef-client(Check in在厨师演讲中)。

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

使用刀子 ssh 发出命令

我们可以使用knife ssh同时发出命令给我们的节点(或某些节点子集),例如,我们可以使用knife ssh在我们的所有节点上重新启动 Nginx 以 frontend的角色。

你需要一个用户授权进入SSH服务器(即,你可以运行ssh [email protected]并获得一个壳)。

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

你应该得到一个看起来像:

1111.111.111.111  * Restarting nginx nginx      [ OK ] 
2222.222.222.222  * Restarting nginx nginx      [ OK ]

我们只是通过发出一个单一的刀指令在我们的所有 frontend服务器上运行一个命令,让我们将论点分开,并了解更多关于knife ssh的功能。

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

knife ssh的第一个论点是 Chef 搜索查询 - 通常你会想要一些类似的role:YOUR_ROLE_NAME,但你也可以通过许多其他属性搜索(并将它们与布尔运算符相结合)。

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

上面的 *****是野卡字符,它将匹配属性值中的零或多个字符,在这种情况下,它将允许我们匹配值 ubuntu 14.04,如前面观察的刀具状态输出中所显示的。

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

knife ssh的第二个论点是您希望在服务器上运行的命令(匹配搜索查询)。

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

这将产生类似的东西:

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

我们已经涵盖的-x论点 - 这是用于登录的 SSH 用户名。

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

互动刀 SSH

「knife ssh」还具有将你放入交互式壳的能力,在那里你可以发出一系列命令并快速看到结果。

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

这将向我们展示:

1Connected to 111.111.111.111 and 222.222.222.222
2
3To run a command on a list of servers, do:
4  on SERVER1 SERVER2 SERVER3; COMMAND
5  Example: on latte foamy; echo foobar
6
7To exit interactive mode, use 'quit!'
8
9knife-ssh>

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

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

如果您想进一步完善您的服务器列表,只需使用启用,正如帮助消息所示。请注意,您应该在示例命令中用您使用的属性代替SERVER1;对于我们来说,这是节点的IP地址。

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

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

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

(根据 Nginx 是如何设置的,您可能需要在这个命令前面使用sudo

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

用刀子节点管理节点

如果你遵循了 How To Create Simple Chef Cookbooks to Manage Infrastructure on Ubuntu]的指南,那么你已经使用了‘knife node’来列出你的 Chef 服务器上的所有节点,并编辑节点属性。

1knife node list
2knife node edit frontend01

您也可以使用刀条节点来删除节点。

1knife node delete frontend01

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

 1knife node show frontend01
 2*******
 3Node Name:   frontend01
 4Environment: _default
 5FQDN:        fe01.yourdomain.com
 6IP:          111.111.111.111
 7Run List:    role[frontend]
 8Roles:       web_server
 9Recipes:     apt, nginx, apt::default, nginx::default
10Platform:    ubuntu 14.04
11Tags:

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

1knife node show -l frontend01

这将返回一个非常长的属性列表,其中大多数被自动填充到 Ohai,这是一个厨师工具,每次运行都会自动将属性传递给chef-client

一个长的印刷属性列表并不一定对我们非常有用,但是,刀子也在那里覆盖我们,我们可以指定 - 格式选项,以获得节点属性的 JSON 或 YAML 表示。

 1knife node show frontend01 --format json
 2*******
 3
 4{
 5  "name": "frontend01",
 6  "chef_environment": "_default",
 7  "run_list": [
 8  "role[web_server]"
 9]
10,
11  "normal": {
12    "tags": [
13
14    ]
15  }
16}

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

1knife node show frontend01 --format json -a ipaddress
2*******
3{
4  "frontend01": {
5    "ipaddress": "111.111.111.111"
6  }
7}

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

结论

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

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

Published At
Categories with 技术
comments powered by Disqus