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

2018-10-22 11:59:11 浏览数 (1)

介绍

随着基础架构需求的扩展,手动管理每台服务器变得越来越困难。这种困难因重复性要求而变得复杂,如果节点出现故障或需要水平缩放,则需要再现性。

配置管理解决方案旨在通过将基础架构管理转变为代码库来解决这些问题。这些工具不是在许多机器上执行单独的任务,而是允许您将需求提交到每个组件可以连接的中央位置,下拉其配置并应用它。

在本教程中,我们将安装实际的软件。我们将设置一个集中的Chef服务器,它将存储和提供配置指令和节点分析信息。我们还将建立一个工作站,管理员可以使用该工作站来更改代码库并更改基础结构的特征。我们将通过引导一个新节点来实现这一目标,将其置于Chef生态系统的管理之下。

准备条件和目标

我们将在本教程中设置Chef的第12版。版本之间的配置可能会有很大差异,因此请确保您在与本指南相同的主要版本号下运行,以获得最佳结果。

该Chef文件告诉我们,你的Chef服务器至少应有4个核心和4 GB的RAM。它还应该有一个64位操作系统。对于我们的教程,我们将使用4核/ 8 GB CVM和64位Ubuntu 14.04。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。

工作站和节点的要求很少。我们将在这些上使用Ubuntu 14.04以保持一致性。

完成后,我们将有一个集中的Chef服务器来存储和提供我们的配置数据。我们的工作站将用于进行更改,将其上载到服务器,以及引导和管理新节点。该节点代表我们基础架构中的单个服务器。

配置Chef服务器

我们将从设置Chef服务器开始。请记住,Chef建议此服务器至少使用4个内核和4 GB RAM,因此请进行相应的规划。

确保服务器可通过主机名访问

登录到计划安装Chef服务器的服务器后,您需要执行的第一项任务是确保服务器的主机名是可解析的完全限定域名(FQDN)或IP地址。您可以输入以下命令来检查:

代码语言:javascript复制
hostname -f

结果应该是可以到达服务器的地址。如果不是这种情况,您可以通过编辑此文件将其设置为可以访问服务器的域名或IP地址:

代码语言:javascript复制
sudo nano /etc/hosts

该文件看起来类似于:

代码语言:javascript复制
127.0.1.1 current_hostname current_hostname_alias
127.0.0.1 localhost
​
. . .

修改顶行以映射完全限定的域名或IP地址,后跟空格和要用于主机的任何别名。在显示的两行中添加一行,其中第一列包含服务器的公共IP地址,以及在行末尾修改127.0.1.1的信息。它应该看起来像这样:

代码语言:javascript复制
127.0.1.1 fqdn_or_IP_address host_alias
127.0.0.1 localhost
IP_address fqdn_or_IP_address host_alias

所以,如果我没有域名,我的公共IP地址是123.123.123.123,如果您希望您的主机可以通过主机名“chef”访问,您可以有一个如下所示的文件:

代码语言:javascript复制
127.0.1.1 123.123.123.123 chef
127.0.0.1 localhost
123.123.123.123 123.123.123.123 chef

另一方面,如果此服务器具有完全限定的域名chef.example.com和IP地址234.234.234.234,则您的文件可能看起来像这样:

代码语言:javascript复制
127.0.1.1 chef.example.com chef
127.0.0.1 localhost
234.234.234.234 chef.example.com chef

完成后保存并关闭文件。您可以通过输入以下内容来检查是否正确设置了值:

代码语言:javascript复制
hostname -f

结果应该是一个值,您可以使用该值从基础结构中的任何位置访问Chef服务器。

下载并安装Chef 12 Server软件

接下来,我们可以继续下载Chef 12服务器软件。您可以通过访问Chef站点找到必须安装的软件包。特别是,对于Ubuntu安装,您可以点击此链接。

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

返回您的服务器,切换到您的主目录。粘贴您复制的链接并使用该wget命令下载该包。如果自撰写本文以来发生了次要版本更新,则您复制的链接可能与下面的链接不同:

代码语言:javascript复制
cd ~
wget https://web-dl.packagecloud.io/chef/stable/packages/ubuntu/trusty/chef-server-core_12.0.5-1_amd64.deb

下载完成后,输入以下命令安装包:

代码语言:javascript复制
sudo dpkg -i chef-server-core_*.deb

这将基本Chef 12系统安装到服务器上。如果您选择的硬件功能低于建议的数量,则此步骤可能会失败。

安装完成后,必须调用该reconfigure命令,该命令将组成服务器的组件配置为在特定环境中协同工作:

代码语言:javascript复制
sudo chef-server-ctl reconfigure

创建管理员用户和组织

接下来,我们需要创建一个管理员用户。这将是有权访问我们将创建的组织中的基础架构组件的用户名。

我们可以使用user-create命令的子命令chef-server-ctl来完成此操作。该命令需要在创建过程中传递许多字段。一般语法是:

代码语言:javascript复制
chef-server-ctl user-create USERNAME FIRST_NAME LAST_NAME EMAIL PASSWORD

我们将包含此信息,并且还将在末尾添加一个-f附加标志,以指定用于输出新用户的私有RSA密钥的文件名。我们将需要这个以便稍后使用knife管理命令进行身份验证。

对于我们的示例,我们将使用以下信息创建用户:

  • 用户名:admin
  • 名字:admin
  • 姓氏:admin
  • 电子邮件
  • 密码:examplepass
  • 文件名:admin.pem

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

代码语言:javascript复制
sudo chef-server-ctl user-create admin admin admin [邮件] examplepass -f admin.pem

您现在应该在当前目录中调用一个私钥admin.pem

现在您拥有了一个用户,您可以使用org-create子命令创建一个组织。组织只是Chef中的一组基础架构和配置。该命令具有以下一般语法:

代码语言:javascript复制
chef-server-ctl org-create SHORTNAME LONGNAME --association_user USERNAME

短名称是您将用于从Chef内部引用组织的名称。长名称是组织的实际名称。该--association_user指定可以访问管理组织中的用户名。同样,我们将添加-f标志,以便我们可以指定放置私钥的文件名。将创建的密钥用于验证新客户端作为组织的一部分,直到他们可以获得自己唯一的客户端密钥。

我们将创建一个具有以下特点的组织:

  • 短名称:tencentcloud
  • 长名:TencentCloud,Inc。
  • 协会用户:admin
  • 文件名:tencentcloud-validator.pem

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

代码语言:javascript复制
sudo chef-server-ctl org-create tencentcloud "TencentCloud, Inc." --association_user admin -f tencentcloud-validator.pem

在此之后,您的主目录中应该有两个.pem密钥文件。在我们的例子中,他们将被称为admin.pemtencentcloud-validator.pem。我们需要连接到此服务器并立即将这些密钥下载到我们的工作站。目前,我们的Chef服务器安装已完成。

配置Chef Workstation

现在我们的Chef服务器已启动并运行,我们的下一步操作是配置工作站。Chef服务器上不会进行实际的基础架构协调和配置。此工作在工作站上完成,然后工作站将数据上载到服务器以影响Chef环境。

克隆Chef Repo

基础结构的Chef配置维护在一个分层文件结构中,统称为Chef repo。可以在Chef团队提供的GitHub存储库中找到它的一般结构。我们将使用git将此repo克隆到我们的工作站上,以作为我们基础架构的Chef存储库的基础。

首先,我们需要通过apt包装工具进行安装git。通过输入以下内容更新打包索引并安装该工具:

代码语言:javascript复制
sudo apt-get update
sudo apt-get install git

一旦你已经安装git了,你可以克隆Chef库到您的计算机。对于本教程,我们只需将其克隆到我们的主目录:

代码语言:javascript复制
cd ~
git clone https://github.com/chef/chef-repo.git

这会将基本的Chef repo结构下拉到主目录中调用的目录chef-repo中。

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

Chef repo本身内部编写的配置最好在版本控制系统中以与管理代码相同的方式进行管理。由于我们克隆了上面的gitrepo,因此已经初始化了repo。

要为新提交设置工作站,您应该做一些事情。

首先,设置git用于标记您所做提交的任何提交的名称和电子邮件。这是git接受提交的要求。我们在全局设置它,以便git我们创建的任何repo都将使用这些值:

代码语言:javascript复制
git config --global user.name "Your Name"
git config --global user.email "username@domain.com"

接下来,我们将告诉git忽略~/chef-repo/.chef目录中包含的任何信息。我们将在几分钟内创建此目录以存储一些敏感信息。目前,我们可以将此位置添加到我们的.gitignore文件中,以便git不存储不应向其他人公开的数据:

代码语言:javascript复制
echo ".chef" >> ~/chef-repo/.gitignore

由于我们对.gitignore文件进行了更改,因此我们可以继续对版本控制系统进行第一次新的提交。首先,将所有已修改的文件添加到当前暂存区域:

代码语言:javascript复制
cd ~/chef-repo
git add .

现在,提交更改。我们将使用该-m标志来指定描述我们正在进行的更改的内联提交消息:

代码语言:javascript复制
git commit -m "Excluding the ./.chef directory from version control"

我们的Chef repo现在受版本控制。在我们为基础架构编写配置时,我们可以使用上述两个命令来使我们的gitrepo 保持最新状态。

下载并安装Chef Development Kit

接下来,我们需要安装Chef Development Kit,这是一套专为Chef工作站设计的软件。这包括许多在为基础架构设计配置时非常有用的实用程序。我们此时感兴趣的工具是捆绑knife命令,它可以与Chef服务器和任何Chef客户端通信并控制它们。

我们可以在Chef网站上找到Chef 12 Development Kit。由于我们使用Ubuntu 14.04作为我们的工作站,因此这里的页面将包含最新的下载链接。请注意,在撰写本文时,下载链接仅引用Ubuntu 12.04和Ubuntu 13.10,但它仍应在Ubuntu 14.04上安装时没有问题。

右键单击“Ubuntu Linux”下的下载按钮并复制链接位置:

回到工作站上,切换到您的主目录。粘贴您复制的链接并使用该wget命令下载该包。如果已发布较新的开发工具包版本,您复制的链接可能与下面的链接不同:

代码语言:javascript复制
cd ~
wget https://opscode-omnibus-packages.s3.amazonaws.com/ubuntu/12.04/x86_64/chefdk_0.4.0-1_amd64.deb

一旦.deb包已被下载,您可以通过输入以下内容进行安装:

代码语言:javascript复制
sudo dpkg -i chefdk_*.deb

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

代码语言:javascript复制
chef verify

如果您的工作站主要用于管理基础架构的Chef,那么您可能希望默认使用Chef安装的Ruby版本。你可以通过修改.bash_profile来做到这一点,以便Chef的Ruby优先:

代码语言:javascript复制
echo 'eval "$(chef shell-init bash)"' >> ~/.bash_profile

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

代码语言:javascript复制
source ~/.bash_profile

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

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

此时,您的工作站具有与Chef服务器交互并组成基础结构配置所需的所有软件。但是,它尚未配置为与Chef服务器和您的环境进行交互。在本节中,我们将下载在Chef服务器上创建的凭据。

我们将使用该scp实用程序下载我们在Chef服务器上创建的用户密钥和组织验证程序密钥。在这之前,我们将创建隐藏目录,我们将存储这些文件:

代码语言:javascript复制
mkdir ~/chef-repo/.chef

用于连接Chef服务器的方法将决定我们下载密钥的准确程度。请按照下面与您的设置匹配的方法:

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

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

在工作站上,指定用于连接Chef服务器的用户名和域名或IP地址。请使用冒号(:)和您要下载的文件的路径。添加空格后,在本地计算机上指明您希望下载文件的目录(在我们的示例中是~/chef-repo/.chef)。

如果使用root用户帐户登录Chef服务器,则命令将如下所示。请记住更改域名或IP地址以及您尝试下载的密钥文件的名称以符合您的环境:

代码语言:javascript复制
scp root@server_domain_or_IP:/root/admin.pem ~/chef-repo/.chef
scp root@server_domain_or_IP:/root/digitalocean-validator.pem ~/chef-repo/.chef

如果使用非root用户连接到Chef服务器,则命令将如下所示:

代码语言:javascript复制
scp username@server_domain_or_IP:/home/username/admin.pem ~/chef-repo/.chef
scp username@server_domain_or_IP:/home/username/digitalocean-validator.pem ~/chef-repo/.chef
如何使用SSH密钥连接到Chef服务器时下载密钥

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

首先,将SSH会话留给工作站。我们需要使用新参数重新连接:

代码语言:javascript复制
exit

重新使用本地计算机后,需要将用于连接Chef服务器的SSH密钥添加到SSH代理。OpenSSH是标准的SSH套件,包含一个SSH代理,可以通过输入以下命令来启动:

代码语言:javascript复制
eval $(ssh-agent)

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

代码语言:javascript复制
Agent pid 13881

代理启动后,您可以将SSH密钥添加到其中:

代码语言:javascript复制
ssh-add
Identity added: /home/demo/.ssh/id_rsa (rsa w/o comment)

这将使您的SSH密钥保存在内存中。现在,您可以在连接时使用ssh-A选项将存储的密钥转发到工作站。这将允许您从工作站连接到任何计算机,就像从本地计算机连接一样:

代码语言:javascript复制
ssh -A username@workstation_domain_or_IP

现在,您可以使用转发的SSH凭据连接到Chef服务器,而无需密码。如果Chef服务器上的键可通过root用户使用,则您需要的命令将与此类似。请记住根据需要更改Chef服务器域名或IP地址以及密钥名称:

代码语言:javascript复制
scp root@server_domain_or_IP:/root/admin.pem ~/chef-repo/.chef
scp root@server_domain_or_IP:/root/digitalocean-validator.pem ~/chef-repo/.chef

如果为Chef服务器配置的SSH密钥用于向常规用户帐户进行身份验证,则命令将如下所示:

代码语言:javascript复制
scp username@server_domain_or_IP:/home/username/admin.pem ~/chef-repo/.chef
scp username@server_domain_or_IP:/home/username/digitalocean-validator.pem ~/chef-repo/.chef

配置Knife来管理Chef环境

现在您已在工作站上获得了Chef资源,我们可以使用knife连接和控制Chef基础结构所需的信息来配置命令。这是通过我们将与键一起放在~/chef-repo/.chef目录中的knife.rb文件来完成的。

在文本编辑器中打开该目录中调用的knife.rb文件:

代码语言:javascript复制
nano ~/chef-repo/.chef/knife.rb

在此文件中,粘贴以下信息:

代码语言:javascript复制
current_dir = File.dirname(__FILE__)
log_level                :info
log_location             STDOUT
node_name                "name_for_workstation"
client_key               "#{current_dir}/name_of_user_key"
validation_client_name   "organization_validator_name"
validation_key           "#{current_dir}/organization_validator_key"
chef_server_url          "https://server_domain_or_IP/organizations/organization_name"
syntax_check_cache_path  "#{ENV['HOME']}/.chef/syntaxcache"
cookbook_path            ["#{current_dir}/../cookbooks"]

应根据您的基础设施调整以下项目:

  • node_name:这指定knife将用于连接到Chef服务器的名称。这应该与您的用户名匹配。
  • client_key:这应该是您从Chef服务器复制的用户密钥的名称和路径。如果密钥与knife.rb文件位于同一目录中,我们可以使用#{current_dir}代码段填写路径。
  • validation_client_name:这是knife用于引导新节点的验证客户端的名称。这将采用您的组织短名称的形式,以-validator结尾。
  • validation_key:与client_key类似,这包括从Chef服务器复制的验证密钥的名称和路径。同样,如果验证密钥与knife.rb文件位于同一目录中,则可以使用Ruby#{current_dir}代码段指定当前目录。
  • chef_server_url:这是可以访问Chef服务器的URL。它应该以您的Chef服务器的域名或IP地址的https://开头。之后附加指定组织的路径/organizations/your_organization_name

对于我们的教程,该knife.rb文件看起来与此类似。如果您遵循以下内容,仍需要调整服务器的域名或IP地址:

代码语言:javascript复制
current_dir = File.dirname(__FILE__)
log_level                :info
log_location             STDOUT
node_name                "admin"
client_key               "#{current_dir}/admin.pem"
validation_client_name   "digitalocean-validator"
validation_key           "#{current_dir}/digitalocean-validator.pem"
chef_server_url          "https://server_domain_or_IP/organizations/digitalocean"
syntax_check_cache_path  "#{ENV['HOME']}/.chef/syntaxcache"
cookbook_path            ["#{current_dir}/../cookbooks"]

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

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

代码语言:javascript复制
cd ~/chef-repo
knife client list

第一次尝试失败,出现如下错误:

代码语言:javascript复制
ERROR: 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
ERROR: Could not establish a secure connection to the server.
Use `knife ssl check` to troubleshoot your SSL configuration.
If your Chef Server uses a self-signed certificate, you can use
`knife ssl fetch` to make knife trust the server's certificates.

Original Exception: OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

发生这种情况是因为我们的工作站上没有Chef服务器的SSL证书。我们可以输入以下内容获取:

代码语言:javascript复制
knife ssl fetch

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

代码语言:javascript复制
WARNING: Certificates from server_domain_or_IP will be fetched and placed in your trusted_cert
directory (/home/demo/chef-repo/.chef/trusted_certs).

Knife has no means to verify these are the correct certificates. You should
verify the authenticity of these certificates after downloading.

Adding certificate for server_domain_or_IP in /home/demo/chef-repo/.chef/trusted_certs/server_domain_or_IP.crt

获取SSL证书后,上一个命令现在应该可以工作:

代码语言:javascript复制
knife client list
digitalocean-validator

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

用刀引导新节点

通过配置Chef服务器和工作站,我们可以开始使用Chef在我们的基础架构中配置新服务器。

这通过称为“bootstrapping”的过程发生,其中Chef客户端可执行文件安装在新计算机上,组织验证器密钥也被传递。然后,新节点使用验证器密钥与Chef服务器联系,并作为回报,接收其自己唯一的客户端密钥以及已分配给它的任何配置。此过程使新服务器进入其初始状态,并为将来的管理进行设置。

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

  • 可以访问的域名或IP地址。
  • 用于完成管理操作的用户名。这可以是root,也可以是配置了sudo权限的用户。
  • 以上述用户登录的方法。这可以是密码,也可以是SSH密钥。
  • 一种执行管理任务的方法。对于root用户来说,这是不必要的。对于依赖sudo权限的用户,通常需要密码。

该命令的一般语法将是:

代码语言:javascript复制
knife bootstrap node_domain_or_IP [options]

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

  • -x:用于指定通过SSH进行身份验证的用户名。这通常是必需的。
  • -N:Chef中显示的节点的新名称。保留此选项通常会导致主机名用于Chef节点名称。
  • -P:用于指定远程服务器上用户名的密码。如果任何 SSH会话需要密码验证或者如果用户名需要sudo命令的密码,这是必要的。
  • --sudo:如果远程服务器上的用户名需要sudo用于执行管理操作,则需要此标志。默认情况下,它会提示输入sudo密码。
  • --use-sudo-password:如果您已经为与用户提供-P标志的密码,除了--sudo标志外,请使用此标志将使用-P密码。
  • -A:此选项将SSH密钥转发到远程主机以进行登录,而不是使用密码身份验证。

使用该-A选项时,必须在本地计算机上启动SSH代理,添加可用于连接到新节点的SSH密钥,并通过-A最初连接标志将该信息转发到工作站。有关如何执行此操作的详细信息,请参阅工作站配置部分中有关从Chef服务器下载密钥的信息。

使用上述信息,可以为各种情况构造正确的自举命令。

例如,要使用名称为“testing”的节点引导,使用配置了sudo权限的用户名demo,并且需要密码进行SSH和sudo验证,我们可以输入:

代码语言:javascript复制
knife bootstrap node_domain_or_IP -N testing -x demo -P password --sudo --use-sudo-password

如果我们想要使用root用户进行引导,使用工作站上可用密钥进行SSH密钥身份验证,并希望继续使用节点的主机名作为Chef节点名称,我们可以输入:

代码语言:javascript复制
knife bootstrap node_domain_or_IP -x root -A

如果我们想使用SSH密钥对sudo用户进行身份验证,我们仍然需要使用-P标志,--sudo标志和--use-sudo-password标志来提供密码以避免提示:

代码语言:javascript复制
knife bootstrap node_domain_or_IP -x demo -A -P password --sudo --use-sudo-password -N name

如果你在上面的场景中不介意被提示输入sudo密码,你可以改为输入:

代码语言:javascript复制
knife bootstrap node_domain_or_IP -x demo -A --sudo -N name

一旦您的新节点被引导,您应该有一个新的客户端:

代码语言:javascript复制
knife client list
digitalocean-validator
name

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

代码语言:javascript复制
knife node list
name

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

结论

遵循本教程后,您应该为基础架构配置功能齐全的Chef服务器。我们还设置了一个工作站,可用于管理和维护Chef将应用于您的基础架构的配置。我们已经演示了如何使用该knife命令来引导将由Chef配置的服务器。

想要了解更多关于Ubuntu的开源信息教程,请前往腾讯云 社区学习更多知识。

参考文献:《How To Set Up a Chef 12 Configuration Management System on Ubuntu 14.04 Servers》

0 人点赞