如何使用DigitalOceanPluginforKnife在Chef中管理Droplet
介绍
Chef 是一个配置管理系统,可让您以可控且可重复的方式构建和管理基础架构。 使用 Chef,您可以确保所有基础设施决策都集中记录,并且可以随时轻松地重新实施。
在之前的文章中,我们讨论了基本厨师术语,如何安装软件(使用Chef 12或Chef 11),如何使用食谱 和 如何使用角色和环境 。
在本文中,我们将讨论如何使用 Knife 插件(Chef 配置工具)来处理您的 DigitalOcean 液滴。 使用这个工具,我们可以在我们的 Chef 系统中创建基础设施 Droplet 并轻松配置它们。
我们将假设您已经安装并配置了您的服务器和工作站,并且您知道如何创建和引导新节点。
安装 Knife DigitalOcean 插件
在我们开始在 Chef 系统中使用 DigitalOcean 液滴之前,我们需要为刀工具安装 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
这将安装 DigitalOcean 刀插件,允许您利用包含的功能。
使用您的 DigitalOcean 凭据配置 Knife 插件
为了使用刀插件,您需要给刀授权才能使用您的 DigitalOcean 帐户。 这可以使用您帐户的 API 密钥和客户端 ID 来完成。
在您的 DigitalOcean 控制面板中,单击左侧导航菜单中的 API 链接。 您应该在此处看到您帐户的“客户 ID”:
稍后您将需要此值作为配置文件。
如果您已经生成了 API 密钥,则需要从另一个应用程序收集该值,该应用程序使用它连接到您的 DigitalOcean 帐户。 作为安全措施,无法从接口检索当前 API 值。
如果您尚未生成 API 密钥,或者您丢失或不再需要旧密钥,您可以通过键入“生成新密钥”按钮生成新密钥:
生成新密钥后,您需要在离开屏幕之前复制生成的值。 如上所述,您将 not 能够在离开此页面后访问此值,因此您将不得不生成一个新值或从已经使用它的应用程序中检索您的 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' ] 刀[:digital_ocean_client_id ] = ' your_client_id ' 刀 [:digital_ocean_api_key] = ' your_api_key '
完成后保存并关闭文件。
现在,我们可以通过询问我们当前活动的液滴列表来测试刀是否可以连接到 DigitalOcean 服务器。 在运行刀命令之前,请确保您位于 Chef 存储库中:
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 工作站上配置 SSH 密钥
现在您可以使用刀工具连接到您的 DigitalOcean 帐户,我们需要更进一步来帮助自动化液滴创建过程。 我们需要为我们的 Chef 工作站创建一个 SSH 密钥,以嵌入我们将要创建的 Droplet。
在我们的工作站计算机上,我们应该通过键入以下内容创建一个新的 SSH 密钥:
ssh-keygen
在提示中按 enter 以接受默认值。 这将在用户的主目录中创建一个名为 .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 密钥”按钮:
在下一页上,为新密钥创建一个名称,然后将文件的内容粘贴到给定的区域:
完成后单击下面的“创建 SSH 密钥”按钮。
您现在应该能够将 SSH 密钥从您的 Chef 服务器嵌入到新的 Droplet 中。 这应该允许您从界面中创建液滴,然后登录以使用您创建的说明书和角色配置您的服务器,所有这些都在一个步骤中完成。
使用刀插件
让我们开始使用刀插件。
我们可以再次查询与您的 DigitalOcean 帐户关联的液滴开始:
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
这为我们提供了对液滴的概述。
刀插件相当简单,但包含控制帐户中的液滴所需的所有部分,可能除了 DNS 功能。 主要功能是使用您可以从查询中获得的信息创建和销毁液滴。
使用 Knife 插件查询信息
我们可以使用不同的刀查询找到创建和销毁命令可能需要的所有信息。
要找出我们可以将哪些标准 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 图像,包括可用于部署新液滴的所有一键式应用程序。 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
我们现在知道如何获取创建和销毁液滴所需的所有信息。
我们可以从破坏液滴开始,因为破坏总是比创造需要更少的努力。
销毁液滴所需的只是液滴的 ID。 这在液滴列表的第一列中可用:
knife digital_ocean droplet list
ID 名称 大小 区域 IPv4 映像状态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 43GB New York 2 33333038838333. (Ubuntu-Init) Debian 7.0 x64) 活动4444444 snmp 4GB 纽约 2 444.444.444.444 1575388 (Ubuntu-Init) 活动5555555节点 4GB 纽约 2 555.555.555.555 1575388 (Ubuntu-Init) 活动
获得要删除的液滴的 ID 后,您可以通过键入以下内容来使用它:
刀 digital_ocean 水滴破坏111111
这应该将液滴排队等待删除。
为了创建液滴,您将需要更多信息。 您通常需要在 DigitalOcean 控制面板中填写的任何字段都需要作为参数输入到此命令中。
该命令将如下所示:
刀 digital_ocean 水滴创建 --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 区域的 1G droplet 上创建一个名为“hello”的 x86_64 Ubuntu 12.04 实例,SSH 密钥为 1111,我们可以输入:
刀 digital_ocean 水滴创建 --server-name hello --image 1505447 --location 4 --size 63 --ssh-keys 22222
确保您正在传递 Chef 工作站的 SSH 密钥,以便您能够在线连接到它。
如果我们想在创建 droplet 时引导它并传递一个 run_list 来安装和配置一些软件,我们可以添加其他参数。 在这里,我们可以告诉它将我们的新服务器配置为 Web 服务器:
刀 digital_ocean 水滴创建 --server-name hello --image 1505447 --location 4 --size 63 --ssh-keys 22222 --bootstrap --run-list “role[web_server]”
这将应用角色中固有的所有配方和属性,就像我们在创建节点后编辑了节点的 run_list 一样。
结论
使用 DigitalOcean 刀插件,您可以根据需要轻松启动新的基础设施资源。 例如,如果您的数据库获得的流量比以前更多,那么启动额外的数据库服务器来管理该负载是微不足道的。
通过在您管理基础架构的同一环境中包含创建新 VPS 实例的功能,可以通过精心设计的说明书、角色和属性轻松扩展您的基础架构。 扩展可以简单地成为一个何时而不是如何的问题。