用刀引导GCE实例

本文介绍了工具在Chef工作流程中的角色,以及如何通过创建将用于其引导过程的SSH部署密钥来开始使用Google Cloud

Knife是一种编排工具,可与Chef Server进行交互以更新Chef组件 (例如节点,环境,角色和食谱),并引导新创建的节点。

引导过程将执行以下操作:

  1. 在Chef服务器上注册节点配置
  2. 在远程系统上安装Chef代理
  3. 配置远程系统以访问Chef服务器
  4. 继续在远程系统上应用角色或食谱

所有这些神奇的事情都是由于SSH而发生的,只要您在目标系统上配置SSH并启用了部署密钥 ,就可以将它们远程配置为初始所需的状态。

本指南将向您展示如何与GCP(Google Cloud Platfrom)AWS(Amazon Web Services)一起使用

如果您是GCP的新手,则可以免费开始使用,然后下载并安装Google Cloud SDK 。 这将创建一个默认项目 ,即Google用于管理云资源的组织类别。

此时,我们需要执行以下步骤:

  1. 生成SSH密钥对(我们的部署密钥
  2. 将SSH密钥安装到我们的项目中
  3. 创建一些系统
  4. 使用我们的密钥引导一些系统

生成SSH密钥对

这是生成密钥对的典型过程,该过程将创建gce.key的私钥和gce.key的公共SSH密钥。

  KEYPATH =“ $ {HOME} /。ssh” 
ssh-keygen -t rsa -b 4096 -f“ $ {KEYPATH} /gce.key” -C ubuntu -q -N“”

将SSH公钥安装到我们的项目中

我们需要创建gcloud工具为此需要的特殊密钥文件格式。 处理。 此keysfiles的格式如下所示(用户foobarbaz ):

  foo:ssh-rsa  foo 
bar:ssh-rsa 条
baz:ssh-rsa baz

我们可以使用以下命令在shell中轻松制作此文件:

  KEYPATH =“ $ {HOME} /。ssh” 
GCE_KEYSFILE =“ $ {KEYPATH} /gce.keysfile”
printf'%s:%s \ n''ubuntu'“ $(cat $ {KEYPATH} /gce.key.pub)” \
>> $ {GCE_KEYSFILE}

拥有密钥文件后,我们可以将数据上传到我们的默认项目,以便将来的系统将使用已安装的公钥创建Ubuntu帐户:

  GCE_KEYSFILE =“ $ {HOME} /。ssh / gce.keysfile” 
gcloud computing project-info add-metadata \
--metadata-from-file ssh-keys = $ {GCE_KEYSFILE}

创建一些系统

现在,我们可以创建一些系统,例如三节点ElasticSearch集群(或您想要的任何集群)。 在Google Cloud中,您可以在Compute Engine区域和VM Instances子部分中找到它。 有一个CREATE INSTANCE按钮,为您提供一些图形界面,如下所示:

选择Ubuntu 14映像,然后创建系统,例如es-01es-02es-03 。 默认值适用于此类别。 我们可以使用gcloud compute instances list查看结果,并使用gcloud compute instances describe 检查有关系统的元数据。

有了这些信息,我们可以使用它的公共外部IP地址和为ubuntu用户生成的私有SSH密钥登录系统:

  IP = $(gcloud计算实例列表| grep es-01 | awk'{print $ 5}') 
ssh -i〜/ .ssh / gce.key ubuntu @ $ {IP}

使用私钥引导某些系统

现在我们可以使用生成和安装的密钥访问我们的系统,我们可以轻松地使用脚本进行引导(需要bash v4,例如,用于macOS用户的brew install bash ),如下所示:

上面的代码片段是一个简化的示例,需要针对您的环境进行定制。 您的厨师库有一些假设和要求:

  • 环境配置: /path/to/chef_repo/environments/production.json
  • knife.rb配置的凭据到您的厨师服务器。
  • 这个角色称为elasticsearch,带有必不可少的厨师食谱,可以使这种魔术实现。

另外,为简洁起见,以下内容也未涉及:

  • 系统不是有序的,因此如果需要按照特定的顺序引导它们(例如共享依赖项),那么您将需要重新排序系统列表。
  • 如果需要覆盖属性,例如生成内部IP列表以在ElasticSearch中配置发现,则需要将--json-attribute与定制的JSON字符串结合使用。

关于脚本本身的注释:脚本在代码逻辑中嵌入了短暂状态,在我看来这是一种反模式。 具体来说,脚本根据节点名称响应硬编码的静态run-list 。 为了简洁起见,一个更好的解决方案是:

  • 创建从文件(例如TSV或其他分隔符分隔的文件)中提取的数据结构,该文件具有系统名称(或grep模式)和相应的运行列表,该运行列表本身是带有逗号分隔列表的字符串。
  • 查找运行列表,并将其插入“ kick bootstrap”命令中。

我按原样保留了脚本以说明所涉及的过程,我们可以在以后的文章中对此进行扩展。

您已掌握了通过安装在您的Google Project中的SSH 部署密钥用刀引导系统的过程。 在第二部分中,我将记录如何使用AWS进行相同的过程。