介绍
Chef是一个配置管理系统,允许您以受控和可重复的方式构建和管理您的基础架构。使用Chef,您可以确保您的基础设施决策都集中记录,并且可以随时轻松重新实现。 在以前的文章中,我们已经讨论了 基本的Chef术语 ,如何安装软件(与 Chef12或 Chef11 ), 如何与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”: 稍后您将需要此配置文件的值。 如果您已生成API密钥,则需要从使用它来连接到您的DigitalOcean帐户的其他应用程序收集该值。作为安全措施,无法从接口检索当前API值。 如果您尚未生成API密钥,或者您已丢失或不再需要您的旧密钥,则可以通过键入“生成新密钥”按钮生成新密钥: 生成新密钥后,您需要复制在离开屏幕之前生成的值。正如上面提到的,你将 无法离开这个页面后访问这个值,所以你将不得不产生一个新值或检索从已经使用它的应用程序的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密钥”按钮:
在下一页上,为新密钥创建一个名称,然后将文件的内容粘贴到给定的区域中:
完成后,单击下面的“创建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