如何使用DigitalOcean插件Knife的Chef来管理Droplet

Chef是一个伟大的配置管理系统,可用于自动化的基础设施系统的设立。在本指南中,我们将讨论如何使用DigitalOcean插件Chef的刀命令,将让你轻松旋转起来更多的服务器和配置它们,你需要更多的资源。

介绍


Chef是一个配置管理系统,允许您以受控和可重复的方式构建和管理您的基础架构。使用Chef,您可以确保您的基础设施决策都集中记录,并且可以随时轻松重新实现。 在以前的文章中,我们已经讨论了基本的Chef术语 ,如何安装软件(与Chef12Chef11 ), 如何与Recipe工作 ,以及如何与角色和环境中工作 。 在本文中,我们将讨论如何使用Knife插件,Chef配置工具,使用您的DigitalOceanDroplet。使用这个工具,我们可以创建基础设施Droplet,并从我们的Chef系统中轻松配置。 我们假设您已经安装和配置了您的服务器和工作站,并且您知道如何创建和引导新节点。

安装Knife DigitalOcean插件


在我们开始使用Chef系统内的DigitalOceanDroplet之前,我们需要为Knife安装DigitalOcean插件。 我们可以简单地通过安装一个gem来做到这一点。 使用我们的工作站配置方式,如果我们要输入:
gem install knife-digital_ocean
我们会得到这样的错误:
Fetching: knife-digital_ocean-0.4.0.gem (100%)
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions into the /opt/chef/embedded/lib/ruby/gems/1.9.1 directory.
同样,如果我们运行这个命令sudo ,我们会得到未找到命令:
sudo gem install knife-digital_ocean

sudo: gem: command not found
问题是,我们已经在我们的用户环境中指定了我们的Chef可执行文件的路径,但是我们没有正确执行该命令所需的权限。 我们可以通过使用完整路径Chef解决这个gem可执行文件:
sudo /opt/chef/embedded/bin/gem install knife-digital_ocean
这将安装DigitalOceanKnife插件,允许您利用包含的功能。

使用您的DigitalOcean凭据配置Knife插件


为了使用Knife插件,你需要给Knife授权使用您的DigitalOcean帐户。这可以使用您帐户的API密钥和客户ID。 在DigitalOcean控制面板中,点击左侧导航菜单中的API链接。您应该在此处看到您的帐户的“客户ID”: DigitalOcean客户端ID 稍后您将需要此配置文件的值。 如果您已生成API密钥,则需要从使用它来连接到您的DigitalOcean帐户的其他应用程序收集该值。作为安全措施,无法从接口检索当前API值。 如果您尚未生成API密钥,或者您已丢失或不再需要您的旧密钥,则可以通过键入“生成新密钥”按钮生成新密钥: DigitalOcean生成密钥 生成新密钥后,您需要复制在离开屏幕之前生成的值。正如上面提到的,你将无法离开这个页面后访问这个值,所以你将不得不产生一个新值或检索从已经使用它的应用程序的API密钥。 一旦您同时拥有客户端ID和API密钥,就可以配置Knife使用这些值。 在您的工作站上,导航到Chef库中的Chef配置目录:
cd ~/chef-repo/.chef
我们将编辑knife.rb位于中的文件:
nano knife.rb

log_level                :info
log_location             STDOUT
node_name                'station1'
client_key               '/home/demo/chef-repo/.chef/station1.pem'
validation_client_name   'chef-validator'
validation_key           '/home/demo/chef-repo/.chef/chef-validator.pem'
chef_server_url          'https://chef_server.com:443'
syntax_check_cache_path  '/home/demo/chef-repo/.chef/syntax_check_cache'
cookbook_path [ '/home/demo/chef-repo/cookbooks' ]
在文件的底部,我们需要添加我们的凭据,如下所示:
log_level                :info
log_location             STDOUT
node_name                'station1'
client_key               '/home/demo/chef-repo/.chef/station1.pem'
validation_client_name   'chef-validator'
validation_key           '/home/demo/chef-repo/.chef/chef-validator.pem'
chef_server_url          'https://chef_server.com:443'
syntax_check_cache_path  '/home/demo/chef-repo/.chef/syntax_check_cache'
cookbook_path [ '/home/demo/chef-repo/cookbooks' ]
knife[:digital_ocean_client_id] = 'your_client_id'
knife[:digital_ocean_api_key] = 'your_api_key'
完成后保存并关闭文件。 现在,我们可以通过询问我们当前活动的Droplet列表来测试Knife是否可以连接到DigitalOcean服务器。在运行knife命令之前,确保你在你的Chef repo中:
cd ~/chef-repo
knife digital_ocean droplet list

ID       Name             Size   Region      IPv4             Image                         Status
111111   irssi            512MB  New York 1  111.111.111.111  479972 (N/A)                  active
222222   try              4GB    New York 2  222.222.222.222  1575388 (Ubuntu-Init)         active
333333   nftables         4GB    New York 2  333.333.333.333  308287 (Debian 7.0 x64)       active
4444444  snmp             4GB    New York 2  444.444.444.444  1575388 (Ubuntu-Init)         active
5555555  node             4GB    New York 2  555.555.555.555  1575388 (Ubuntu-Init)         active
如果您获得了当前Droplet的列表,则说明您已成功连接,并且您的身份验证正在工作。

在Chef Workstation上配置SSH密钥


现在您可以使用Knife工具连接到您的DigitalOcean帐户,我们需要进一步帮助自动化Droplet创建过程。我们需要为我们的Chef工作站创建一个SSH密钥,以嵌入我们将要创建的Droplet中。 在我们的Workstation计算机上,我们应该通过键入以下内容创建一个新的SSH密钥:
ssh-keygen
按提示输入以接受默认值。这将创建在用户的主目录下的子目录隐藏叫.ssh与公共和内部的私钥。 现在通过键入以下内容切换到此目录:
cd ~/.ssh
ls

id_rsa  id_rsa.pub  known_hosts
我们现在需要的文件是id_rsa.pub文件。您可以通过键入以下内容查看此文件的内容:
cat id_rsa.pub

sh-rsa AAAAB3NzaC1yc2EAAAAxAQABAAABAQCv60WjxoM39LgPDbiW7ne3gu18q0NIV.....................lANpl5qmhDQ+GS/sO............mHWL2irjuB9xBXr00+44vSd2q/vtXdGXhdSMTf4/XK17fjKSG/9y3yD6nml6q9XgQxx9Vf/IKaKdlK0hbC1ds0+8/83PTb9dF3L7hf3Ch/ghvj5++twJFdFeG+VI7EDuKNA4zL8C5FdY.....................XIIeZvZ/z9Kp.....................nyiIuEAmn8fbnosWcsovw0IS1Hz6HsjYo4bu/gA82LWt3sdRUBZ/7ZsVD3ELip
email@domain.com
回到DigitalOcean控制面板,点击左侧菜单中的“SSH Keys”链接。点击右上角的“添加SSH密钥”按钮: DigitalOcean添加SSH密钥 在下一页上,为新密钥创建一个名称,然后将文件的内容粘贴到给定的区域中: DigitalOcean创建密钥 完成后,单击下面的“创建SSH密钥”按钮。 您现在应该能够将您的Chef服务器中的SSH密钥嵌入到新的Droplet中。这应该允许您从界面中创建Droplet,然后登录以使用您创建的烹饪书和角色配置您的服务器,所有操作都在一个步骤中完成。

使用Knife插件


让我们开始使用Knife插件。 我们可以再次开始查询与您的DigitalOcean帐户相关的Droplet:
knife digital_ocean droplet list

ID       Name             Size   Region      IPv4             Image                         Status
111111   irssi            512MB  New York 1  111.111.111.111  479972 (N/A)                  active
222222   try              4GB    New York 2  222.222.222.222  1575388 (Ubuntu-Init)         active
333333   nftables         4GB    New York 2  333.333.333.333  308287 (Debian 7.0 x64)       active
4444444  snmp             4GB    New York 2  444.444.444.444  1575388 (Ubuntu-Init)         active
5555555  node             4GB    New York 2  555.555.555.555  1575388 (Ubuntu-Init)         active
这给了我们对我们的Droplet的概述。 Knife插件是相当简单,但包含您需要控制您的帐户内的Droplet的所有部分,可能除了DNS功能。主要功能是创建和破坏Droplet与您可以从查询获得的信息。

使用Knife插件查询信息


我们可以找到我们可能需要的用于使用不同的Knife查询的create和destroy命令的所有信息。 要找出我们可以用作基本图像的哪些标准DigitalOcean映像,我们可以键入。该-G标志代表“全球性”:
knife digital_ocean image list -G

ID       Distribution  Name                                             Global
361740   Arch Linux    Arch Linux 2013.05 x32                           +
350424   Arch Linux    Arch Linux 2013.05 x64                           +
1602     CentOS        CentOS 5.8 x32                                   +
1601     CentOS        CentOS 5.8 x64                                   +
376568   CentOS        CentOS 6.4 x32                                   +
. . .
这将提供所有标准的DigitalOcean映像,包括您可以使用部署一个新的Droplet的所有一键应用程序。 ID列是您需要注意的项目,以便从正确的映像进行部署。 同样,如果你希望你的快照,备份等的列表,你可以不带类型相同的命令-G标志:
knife digital_ocean image list

ID       Distribution  Name             Global
11xxxxx  Ubuntu        Dokku            -
15xxxxx  Ubuntu        Ubuntu-Init      -
15xxxxx  Ubuntu        Ubuntu-LAMP      -
15xxxxx  Ubuntu        Ubuntu-WP        -
您可以使用此列表中的图像ID作为基本图像,以提高灵活性。 要找出可用于部署Droplet的区域,请键入:
knife digital_ocean region list

ID  Name
1   New York 1
2   Amsterdam 1
3   San Francisco 1
4   New York 2
5   Amsterdam 2
有关部署Droplet的大小列表,您可以键入:
knife digital_ocean size list

ID  Name
63  1GB
62  2GB
64  4GB
65  8GB
61  16GB
. . .
要列出我们可以嵌入图像中的SSH密钥,我们可以发出以下命令:
knife digital_ocean sshkey list

ID     Name
11111  Home key
22222  Chef key

创建和销毁Droplet


我们现在知道如何获得创建和破坏Droplet所需的所有信息。 我们可以从破坏Droplet开始,因为破坏总是需要比创造更少的努力。 我们需要破坏一Droplet是Droplet的ID。这在Droplet列表的第一列中可用:
knife digital_ocean droplet list

ID       Name             Size   Region      IPv4             Image                         Status
111111   irssi            512MB  New York 1  111.111.111.111  479972 (N/A)                  active
222222   try              4GB    New York 2  222.222.222.222  1575388 (Ubuntu-Init)         active
333333   nftables         4GB    New York 2  333.333.333.333  308287 (Debian 7.0 x64)       active
4444444  snmp             4GB    New York 2  444.444.444.444  1575388 (Ubuntu-Init)         active
5555555  node             4GB    New York 2  555.555.555.555  1575388 (Ubuntu-Init)         active
一旦你有你想要删除的Droplet的ID,你可以使用它通过键入:
knife digital_ocean droplet destroy 111111
这应该排队Droplet删除。 为了创建Droplet,您将需要更多的信息。您通常需要在DigitalOcean控制面板中填写的任何字段都需要作为参数输入到此命令中。 命令将如下所示:
knife digital_ocean droplet create --server-name name_for_server --image image_id --location region_id --size size_id --ssh-keys ssh_key_ids --bootstrap --run-list "nodes_run_list"
例如,要在NY2区域的1GDroplet上使用SSH密钥1111创建一个名为“hello”的x86_64 Ubuntu 12.04实例,我们可以键入:
knife digital_ocean droplet create --server-name hello --image 1505447 --location 4 --size 63 --ssh-keys 22222
确保您传递了您的Chef工作站的SSH密钥,以便您能够连接到它的在线。 如果我们想在创建Droplet时引导它,并通过一个run_list来安装和配置一些软件,我们可以添加其他参数。在这里,我们可以告诉它将我们的新服务器配置为Web服务器:
knife digital_ocean droplet create --server-name hello --image 1505447 --location 4 --size 63 --ssh-keys 22222 --bootstrap --run-list "role[web_server]"
这将应用角色中固有的所有配方和属性,就像我们在创建节点的run_list之后编辑它一样。

结论


使用DigitalOceanKnife插件,您可以根据需要轻松启动新的基础架构资源。例如,如果您的数据库获得比以前更多的流量,那么启动其他数据库服务器来管理该负载就很容易。 通过包含在管理基础架构的同一环境中创建新VPS实例的功能,可以轻松地使用精心设计的烹饪书,角色和属性扩展您的基础架构。缩放可以简单地成为一个问题,而不是如何。
作者:Justin Ellingwood