如何在 Ubuntu 14.04 服务器上设置 Chef 12 配置管理系统

介绍

随着基础设施需求的扩大,手动管理每个服务器的任务变得越来越困难,这种困难被可重复性要求所加重,如果节点失败或需要水平扩展时,这就变得必要。

配置管理解决方案旨在通过将基础设施管理转化为代码库来解决这些问题,而不是在多台机器上执行单个任务,这些工具允许您将您的需求定位为一个中心位置,每个组件都可以连接,拉下配置并应用。

前一篇中,我们在概念层面上讨论了厨师组件的总体结构以及它们如何相互作用以实现管理员的目标。

在本指南中,我们将安装实际的软件。我们将设置一个集中式厨师服务器,该服务器将存储和服务配置指令和节点配置信息。我们还将设置一个工作站,管理员可以与代码库工作并改变基础设施的特性。

前提和目标

在本指南中,我们将设置 Chef 12 版本. 配置可能在不同版本之间有显著的差异,因此确保您在本指南的相同主要版本号内运行,以获得最佳结果。

主管文档(http://docs.chef.io/server/install_server_pre.html#hardware-software)告诉我们,你的 Chef 服务器应该至少有 4 个核心和 4 GB 的 RAM. 它也应该有 64 位操作系统

工作站和节点有很少的要求. 我们将使用Ubuntu 14.04在这些也是为了一致性。

当我们完成时,我们将有一个集中式厨师服务器来存储和服务我们的配置数据,我们的工作站将被用来进行更改,将其上传到服务器,并启动和管理新的节点。

配置主服务器

请记住, Chef 建议至少为此服务器设置 4 个内核和 4 GB 的 RAM,因此相应地计划。

确保服务器可通过 Hostname 访问

一旦您登录到您计划安装 Chef 服务器的服务器,您需要执行的第一个任务是确保服务器的主机名称是可解除的完全合格域名 (FQDN) 或 IP 地址。

1hostname -f

结果应该是一个可以访问服务器的地址. 如果不是这样,您可以将此设置为域名或IP地址,通过编辑此文件来访问服务器:

1sudo nano /etc/hosts

檔案將看起來像這樣:

1127.0.1.1 current_hostname current_hostname_alias
2127.0.0.1 localhost
3
4. . .

修改顶行以反映完全合格的域名或 IP 地址,随后为您的主机添加一个字符串 beneath 显示的两个行中包含您的服务器的公共 IP 地址在第一列,以及您在127.0.1.1行末尾修改的信息。

1127.0.1.1 fqdn_or_IP_address host_alias
2127.0.0.1 localhost
3IP_address fqdn_or_IP_address host_alias

因此,如果我没有域名,我的公共IP地址是123.123.123.123,如果我也希望我的主机可以通过主机名称chef访问,我可以有一个文件,看起来像这样:

1127.0.1.1 123.123.123.123 chef
2127.0.0.1 localhost
3123.123.123.123 123.123.123.123 chef

另一方面,如果这个服务器有完全合格的域名chef.example.com和IP地址234.234.234.234,我的文件可能看起来像这样:

1127.0.1.1 chef.example.com chef
2127.0.0.1 localhost
3234.234.234.234 chef.example.com chef

保存并关闭文件完成后. 您可以通过键入检查该值是否正确设置:

1hostname -f

结果应该是一个您可以从基础设施中的任何地方访问 Chef 服务器的值。

下载和安装 Chef 12 服务器软件

接下来,我们可以继续下载 Chef 12 服务器软件. 您可以通过访问 Chef 网站找到必须安装的软件包. 具体来说,对于 Ubuntu 安装,您可以遵循 此链接

Ubuntu Linux 14.04标题下,右键单击下载链接并复制链接位置:

Chef server download

回到您的服务器上,更改到您的主目录. 粘贴您复制的链接,并使用wget命令来下载该包. 您复制的链接可能与下面的链接不同,如果自此写作以来有较小的版本更新:

1cd ~
2wget https://web-dl.packagecloud.io/chef/stable/packages/ubuntu/trusty/chef-server-core_12.0.5-1_amd64.deb

一旦下载完成,通过键入安装包:

1sudo dpkg -i chef-server-core_*.deb

此操作将将 Base Chef 12 系统安装到服务器上. 如果您已选择一个硬件强度低于推荐数量的服务器,则此步骤可能会失败。

一旦安装完成,您必须拨打重新配置命令,该命令将构成服务器的组件配置为在您的特定环境中共同工作:

1sudo chef-server-ctl reconfigure

创建一个 Admin 用户和组织

接下来,我们需要创建一个管理员用户,这将是用户名,可以访问我们正在创建的组织的基础设施组件的更改。

我们可以使用chef-server-ctl命令的用户创建子命令来做到这一点,该命令需要在创建过程中传递一些字段。

1chef-server-ctl user-create USERNAME FIRST_NAME LAST_NAME EMAIL PASSWORD

我们将包括这些信息,并将添加f,一个额外的旗帜,在末尾,以指定一个文件名,以输出我们的新用户的私人RSA密钥。

对于我们的示例,我们将创建一个用户,其中包含以下信息:

  • 用户名: admin
  • 姓名: admin
  • 姓名: admin
  • 电子邮件: [email protected]
  • 密码:examplepass
  • 文件名: admin.pem

用此信息创建用户所需的命令是(您应该更改此命令以反映您的信息,特别是密码):

1sudo chef-server-ctl user-create admin admin admin [email protected] examplepass -f admin.pem

您现在应该在当前目录中有一个名为admin.pem的私钥。

现在你有一个用户,你可以使用org-create子命令创建一个组织. 一个组织只是 Chef 内部的基础设施和配置的组合。

1chef-server-ctl org-create SHORTNAME LONGNAME --association_user USERNAME

短名是您将从 Chef 内部使用的名称,长名是组织的实际名称。 --association_user 指明有权访问管理组织的用户名。 再次,我们将添加 -f 旗,以便我们可以指定文件的名称,以便放置私钥。 将创建的密钥用于验证新客户端作为组织的一部分,直到他们能够获得自己的独特客户端密钥。

我们将创建一个具有以下素质的组织:

  • 简称: digitalocean
  • 长称: DigitalOcean, Inc.
  • 协会用户: admin
  • 文件名: digitalocean-validator.pem

要创建具有上述品质的组织,我们将使用以下命令:

1sudo chef-server-ctl org-create digitalocean "DigitalOcean, Inc." --association_user admin -f digitalocean-validator.pem

在此之后,您应该在您的家庭目录中有两个.pem密钥文件,在我们的情况下,它们将被称为admin.pemdigitalocean-validator.pem。我们需要连接到这个服务器并暂时将这些密钥下载到我们的工作站。

设置一个老板工作站

现在我们的厨师服务器已经启动并运行,我们的下一步行动是配置一个工作站. 实际的基础设施协调和配置不会发生在厨师服务器上. 这项工作是在工作站上完成的,然后将数据上传到服务器上,以影响厨师环境。

克隆老板 Repo

您的基础设施的厨师配置在一套被称为厨师复制件的层次性文件结构中进行维护,其总体结构可以在厨师团队提供的GitHub存储库中找到,我们将使用git来将这个复制件克隆到我们的工作站,以便作为基础为基础。

首先,我们需要通过apt包装工具安装git。更新您的包装索引并通过键入安装该工具:

1sudo apt-get update
2sudo apt-get install git

一旦你安装了git,你可以将厨师存储库克隆到你的机器上。 对于本指南,我们将简单地将其克隆到我们的家庭目录:

1cd ~
2git clone https://github.com/chef/chef-repo.git

这将把基本的 Chef repo 结构拖入您的家庭目录中的名为chef-repo的目录中。

将你的 Chef Repo 置于版本控制之下

由 Chef repo 本身编写的配置在版本控制系统中最好地管理,就像你管理代码一样. 自从我们在上面克隆了 repo,一个git repo 已经被初始化了。

为了为你的工作站设置新的承诺,你应该做一些事情。

首先,设置git将使用的名称和电子邮件来标记您所做的任何承诺,这是git接受承诺的要求,我们将此设置为全球性,以便我们创建的任何git重复使用这些值:

1git config --global user.name "Your Name"
2git config --global user.email "[email protected]"

接下来,我们会告诉git忽略~/chef-repo/.chef目录中的任何信息,我们会在几分钟内创建此目录,以存储一些敏感信息。

1echo ".chef" >> ~/chef-repo/.gitignore

由于我们已经对.gitignore 文件进行了更改,所以我们可以继续向版本控制系统做出我们的第一个新承诺。

1cd ~/chef-repo
2git add .

现在,我们将使用-m旗帜来指定一条在线的 commit 消息,描述我们正在进行的更改:

1git commit -m "Excluding the ./.chef directory from version control"

当我们为我们的基础设施编写配置时,我们可以使用上述两个命令来保持我们的git复制更新。

下载和安装 Chef 开发套件

接下来,我们需要安装 Chef Development Kit,这是一套为 Chef 工作站设计的软件套件,其中包括许多用于设计基础设施配置的实用工具。我们目前感兴趣的工具是包装的命令,它可以与 Chef 服务器和任何 Chef 客户端进行通信和控制。

由于我们正在使用Ubuntu 14.04作为我们的工作站,页面(https://downloads.chef.io/chef-dk/ubuntu/#/)将包含最新的下载链接. 请注意,在本文写作时,下载链接只参考Ubuntu 12.04和Ubuntu 13.10,但它仍然应该安装在Ubuntu 14.04上没有问题。

Ubuntu Linux下的下载按钮右键,并复制链接位置:

Ubuntu Chef dev kit

回到您的工作站,更改到您的主目录. 粘贴您复制的链接,并使用wget命令下载包. 您复制的链接可能与下面的链接不同,如果发布了更新的开发套件版本:

1cd ~
2wget https://opscode-omnibus-packages.s3.amazonaws.com/ubuntu/12.04/x86_64/chefdk_0.4.0-1_amd64.deb

一旦下载了 .deb 包,您可以通过键入来安装它:

1sudo dpkg -i chefdk_*.deb

安装后,您可以通过新的chef命令验证所有组件是否在预期位置可用:

1chef verify

如果您的工作站主要用于管理您的基础设施的 Chef,您可能希望默认使用与 Chef 安装的 Ruby 版本。

1echo 'eval "$(chef shell-init bash)"' >> ~/.bash_profile

之后,您可以源您的 .bash_profile 文件,以为当前会话设置正确的环境变量:

1source ~/.bash_profile

如果您想独立管理 Ruby 版本,您可以跳过上述步骤。

将身份验证密钥下载到工作站

此时,您的工作站拥有与 Chef 服务器互动并构建基础设施配置所需的所有软件,但尚未配置以与 Chef 服务器和环境互动。

我们将使用scp实用程序下载我们在 Chef 服务器上创建的用户密钥和组织验证密钥。

1mkdir ~/chef-repo/.chef

您使用的连接到 Chef 服务器的方法将确定我们如何下载密钥。

如何在使用密码连接到厨师服务器时下载密钥

如果您通过 SSH 连接到 Chef 服务器,使用基于密码的身份验证,则scp命令将无需进行重大修改。

在您的工作站上,指定使用的用户名和域名或 IP 地址连接到 Chef 服务器. 立即跟进它与一个 colon (:) 和通往您要下载的文件的路径. 添加一个空间后,表示在 local 计算机上的目录,您希望下载的文件将被放置(~/chef-repo/.chef在我们的情况下)。

如果您使用root用户帐户登录 Chef 服务器,您的命令将看起来像这样的东西. 请记住改变域名或 IP 地址以及您试图下载的关键文件的名称,以匹配您的环境:

1scp root@server_domain_or_IP:/root/admin.pem ~/chef-repo/.chef
2scp root@server_domain_or_IP:/root/digitalocean-validator.pem ~/chef-repo/.chef

如果您使用非根用户连接到 Chef 服务器,则命令看起来更像这样:

1scp username@server_domain_or_IP:/home/username/admin.pem ~/chef-repo/.chef
2scp username@server_domain_or_IP:/home/username/digitalocean-validator.pem ~/chef-repo/.chef

如何在使用SSH键连接到厨师服务器时下载密钥

如果您使用 SSH 键(推荐)连接到 Chef 服务器,则需要执行一些额外步骤。

首先,将您的 SSH 会话留给工作站,我们需要暂时重新连接到一个新的参数:

1exit

一旦你回到本地计算机上,你需要添加你用来连接到 Chef 服务器的 SSH 代理的 SSH 密钥。

1eval $(ssh-agent)

您应该看到这样的输出(数字可能会有所不同):

1Agent pid 13881

一旦代理启动,您可以添加您的SSH密钥:

1ssh-add
1Identity added: /home/demo/.ssh/id_rsa (rsa w/o comment)

这将使您的SSH密钥存储在内存中。现在,您可以通过使用-A选项与ssh连接时将存储的密钥转发到您的工作站。

1ssh -A username@workstation_domain_or_IP

现在,您可以连接到您的 Chef 服务器,而无需使用转发的 SSH 凭据使用密码。如果您的 Chef 服务器上的密钥是通过 root 用户可用的,您需要的命令将看起来类似于此。

1scp root@server_domain_or_IP:/root/admin.pem ~/chef-repo/.chef
2scp root@server_domain_or_IP:/root/digitalocean-validator.pem ~/chef-repo/.chef

如果为 Chef 服务器配置的 SSH 密钥用于将您身份验证到常规用户帐户,则您的命令将看起来如下:

1scp username@server_domain_or_IP:/home/username/admin.pem ~/chef-repo/.chef
2scp username@server_domain_or_IP:/home/username/digitalocean-validator.pem ~/chef-repo/.chef

配置刀来管理你的厨师环境

现在,你在工作站上有你的厨师凭证,我们可以配置knife命令,它需要连接到和控制你的厨师基础设施的信息,这是通过一个knife.rb文件,我们将把它放在~/chef-repo/.chef目录,以及我们的键。

在您的文本编辑器中打开名为knife.rb的文件:

1nano ~/chef-repo/.chef/knife.rb

在此文件中,插入以下信息:

 1current_dir = File.dirname(__FILE__)
 2log_level                :info
 3log_location STDOUT
 4node_name                "name_for_workstation"
 5client_key               "#{current_dir}/name_of_user_key"
 6validation_client_name   "organization_validator_name"
 7validation_key           "#{current_dir}/organization_validator_key"
 8chef_server_url          "https://server_domain_or_IP/organizations/organization_name"
 9syntax_check_cache_path  "#{ENV['HOME']}/.chef/syntaxcache"
10cookbook_path            ["#{current_dir}/../cookbooks"]

以下项目应适应您的基础设施:

  • 点名: 此选项指定了 用于连接您的主刀服务器的名称 。 这将符合您的用户名 。
  • QQ客户端_ key : 这应该是您从主厨服务器复制的用户密钥的名称和路径 。 如果密钥与 knife. rb 文件在同一目录中, 我们可以使用 {xx_ dir} 片段填入路径 。 ( ) ) * QQ验证_客户端_名称: 这是刀'将用来给新节点钉靴子的验证客户端的名称。 这将采取你的组织简称的形式,然后是验证人'。
  • 校验_键 : 与客户端_key一样,这包括您从主厨服务器复制的验证密钥的名称和路径。 再次, 您可以使用 QQxin_ dir}Ruby 片段可以指定当前目录, 如果验证密钥与 knife.rb' 文件在同一目录中 。 (_) ( )* ưμ㼯A **: 这是主厨服务器可以访问的 URL 。 它应该从https://'开始,然后从https://'开始。 主厨服务器的域名或IP地址. 之后,您的组织路径应通过附件 / organizations/ your_organization_name' 来指定。

对于我们的指南,‘knife.rb’文件将看起来类似于此. 如果您遵循,您仍然需要调整服务器的域名或IP地址:

 1current_dir = File.dirname(__FILE__)
 2log_level                :info
 3log_location STDOUT
 4node_name                "admin"
 5client_key               "#{current_dir}/admin.pem"
 6validation_client_name   "digitalocean-validator"
 7validation_key           "#{current_dir}/digitalocean-validator.pem"
 8chef_server_url          "https://server_domain_or_IP/organizations/digitalocean"
 9syntax_check_cache_path  "#{ENV['HOME']}/.chef/syntaxcache"
10cookbook_path            ["#{current_dir}/../cookbooks"]

完成后,保存并关闭knife.rb文件。

现在,我们将通过尝试一个简单的命令来测试配置文件,我们需要在我们的~/chef-repo目录中阅读我们的配置文件:

1cd ~/chef-repo
2knife client list

这个第一个尝试应该失败,错误看起来像这样:

1ERROR: SSL Validation failure connecting to host: server_domain_or_IP - SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
2ERROR: Could not establish a secure connection to the server.
3Use `knife ssl check` to troubleshoot your SSL configuration.
4If your Chef Server uses a self-signed certificate, you can use
5`knife ssl fetch` to make knife trust the server's certificates.
6
7Original Exception: OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

这是因为我们在工作站上没有我们的 Chef 服务器的 SSL 证书,我们可以通过键入获取:

1knife ssl fetch

这应该将 Chef 服务器的证书文件添加到我们的 ~/chef-repo/.chef 目录中的列表中:

1WARNING: Certificates from server_domain_or_IP will be fetched and placed in your trusted_cert
2directory (/home/demo/chef-repo/.chef/trusted_certs).
3
4Knife has no means to verify these are the correct certificates. You should
5verify the authenticity of these certificates after downloading.
6
7Adding certificate for server_domain_or_IP in /home/demo/chef-repo/.chef/trusted_certs/server_domain_or_IP.crt

在获取 SSL 证书后,先前的命令现在应该起作用:

1knife client list
1digitalocean-validator

如果上述命令返回正确,您的工作站现在已设置为控制 Chef 环境。

使用刀子启动一个新的节点

随着我们的 Chef 服务器和工作站的配置,我们可以开始使用 Chef 来配置我们的基础设施中的新服务器。

这是通过一个叫做bootstrapping的过程,在新计算机上安装了 Chef 可执行的客户端,并传递了组织验证器密钥,然后新的节点与 Chef 服务器联系了验证器密钥,反过来接收了自己的独特客户端密钥和任何已分配给它的配置。

要连接到新服务器,我们需要一些关于新节点的信息:

  • 域名或 IP 地址可以访问
  • 用于完成管理操作的用户名. 它可以是root或具有sudo特权配置的用户
  • 作为上述用户登录的方法。 它可以是密码或使用SSH密钥的能力
  • 是执行管理任务的方法。 对于root用户来说,这是不必要的。 对于依赖sudo特权的用户来说,通常需要使用密码

命令的通用语法将是:

1knife bootstrap node_domain_or_IP [options]

您可能最终使用的一些常见选项是:

  • -x: 通常用来指定用户名以通过 SSH 身份验证。 通常需要
  • -N: 在 Chef 中显示的节点的新名称。 将此排除通常会导致主机名为 Chef 节点命令使用 *-P**: 如果远程服务器上的用户名需要使用 sudo 来执行管理操作,则需要使用此标志。 默认情况下,如果用户名需要为 sudo 命令使用密码 *-sudo: 如果远程服务器上的用户名需要使用 sudo 来执行管理操作,则需要使用此标志。 默认情况下,它会提示 sudo 密码(`M_

当使用-A选项时,您必须在本地计算机上启动 SSH 代理,添加可用于连接到新节点的 SSH 密钥,并通过初始连接使用-A 旗帜将该信息传输到您的工作站。

使用上述信息,可以为各种情况构建正确的启动命令。

例如,要启动一个名为testing的节点,使用用户名demo,该节点配置有sudo特权,并且需要 SSH 和sudo验证的密码,我们可以键入:

1knife bootstrap node_domain_or_IP -N testing -x demo -P password --sudo --use-sudo-password

如果我们希望使用root用户启动,使用工作站可用的 SSH 密钥身份验证,并希望继续使用节点的主机名称作为厨师节点名称,我们可以键入:

1knife bootstrap node_domain_or_IP -x root -A

如果我们想使用SSH密钥来验证一个sudo用户,我们仍然需要提供一个使用P旗、--sudo旗和--use-sudo-password旗的密码来避免提示:

1knife bootstrap node_domain_or_IP -x demo -A -P password --sudo --use-sudo-password -N name

如果您处于上述情况,但不介意被承诺使用sudo密码,您可以只输入以下内容:

1knife bootstrap node_domain_or_IP -x demo -A --sudo -N name

一旦你的新节点启动,你应该有一个新的客户端:

1knife client list
1digitalocean-validator
2name

您还应该有一个新的同名节点:

1knife node list
1name

您可以使用上述程序轻松地在任何数量的新服务器上设置新的 Chef 客户端。

如果你想了解如何自动将你的新的DigitalOceanDropplets添加到你的现有厨师基础设施,而不必启动每一个, 检查本教程

结论

遵循本指南后,您应该为您的基础设施配置一个功能齐全的 Chef 服务器. 我们还设置了一个工作站,可以用来管理和维护 Chef 将应用于您的基础设施的配置。

下一个指南中,我们将展示如何使用一些厨师构造来设计节点的配置。

Published At
Categories with 技术
comments powered by Disqus