如何在Ubuntu14.04服务器上设置Chef12配置管理系统
介绍
随着您的基础架构需求的扩大,手动管理每台服务器变得越来越困难。 对可重复性的要求加剧了这种困难,如果节点发生故障或需要水平扩展,这将变得很有必要。
配置管理解决方案旨在通过将基础架构管理转变为代码库来解决这些问题。 这些工具无需在多台机器上执行单独的任务,而是允许您将您的需求提交到一个中央位置,每个组件都可以在该位置连接、下拉其配置并应用它。
在 previous guide 中,我们在概念层面上讨论了 Chef 组件的一般结构以及它们交互以实现管理员目标的方式。 我们讨论了相关术语并讨论了每个部分的责任。
在本指南中,我们将安装实际软件。 我们将建立一个集中的 Chef 服务器,它将存储和提供配置指令和节点分析信息。 我们还将建立一个工作站,管理员可以在其中使用代码库并更改基础架构的特性。 我们将通过引导一个新节点来跟进这一点,将其置于 Chef 生态系统的管理之下。
先决条件和目标
我们将在本指南中设置 Chef 版本 12。 版本之间的配置可能会有很大差异,因此请确保您在与本指南相同的主要版本号内操作以获得最佳效果。
Chef 文档 告诉我们,您的 Chef 服务器应该至少有 4 个内核和 4 GB 的 RAM。 它还应该有一个64位操作系统。 对于我们的指南,我们将使用 4 核 / 8 GB DigitalOcean Droplet 和 64 位 Ubuntu 14.04。
工作站和节点的要求很少。 我们将在这些设备上使用 Ubuntu 14.04 以保持一致性。
完成后,我们将拥有一个集中的 Chef 服务器来存储和提供我们的配置数据。 我们的工作站将用于进行更改,将它们上传到服务器,以及引导和管理新节点。 该节点代表我们基础架构中的单个服务器。
配置厨师服务器
我们将从设置 Chef 服务器开始。 请记住,Chef 建议此服务器至少使用 4 个内核和 4 GB RAM,因此请相应地进行计划。
确保服务器可通过主机名访问
登录到计划安装 Chef 服务器的服务器后,您需要执行的第一个任务是确保服务器的主机名是可解析的完全限定域名 (FQDN) 或 IP 地址。 您可以通过键入以下内容进行检查:
hostname -f
结果应该是可以访问服务器的地址。 如果不是这种情况,您可以将其设置为可以通过编辑此文件访问服务器的域名或 IP 地址:
sudo nano /etc/hosts
该文件将类似于以下内容:
127.0.1.1 current_hostname current_hostname_alias 127.0.0.1 localhost . . .
修改第一行以反映完全限定的域名或 IP 地址,后跟空格和要用于主机的任何别名。 在显示的两行中添加一行 在第一列中的 下,其中包含您的服务器的公共 IP 地址,并将您在 127.0.1.1
行末尾修改的信息添加到末尾。 它应该看起来像这样:
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”访问我的主机,我可以有一个文件看起来像这样:
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
的完全限定域名和 234.234.234.234
的 IP 地址,我的文件可能看起来像这样:
127.0.1.1 chef.example.com chef 127.0.0.1 localhost 234.234.234.234 chef.example.com chef
完成后保存并关闭文件。 您可以通过键入以下内容来检查该值是否设置正确:
hostname -f
结果应该是一个值,您可以使用该值从基础架构中的任何位置访问您的 Chef 服务器。
下载并安装 Chef 12 Server 软件
接下来,我们可以继续下载 Chef 12 服务器软件。 您可以通过访问 Chef 站点找到必须安装的软件包。 具体来说,对于 Ubuntu 安装,您可以按照 这个链接 。
在“Ubuntu Linux 14.04”标题下,右键单击下载链接并复制链接位置:
回到你的服务器,切换到你的主目录。 粘贴您复制的链接并使用 wget
命令下载包。 如果在撰写本文后有次要版本更新,您复制的链接可能与以下链接不同:
cd ~ wget https://web-dl.packagecloud.io/chef/stable/packages/ubuntu/trusty/chef-server-core_12.0.5-1_amd64.deb
下载完成后,输入以下命令安装包:
sudo dpkg -i chef-server-core_*.deb
这会将基本 Chef 12 系统安装到服务器上。 如果您选择的服务器的硬件功能低于推荐数量,则此步骤可能会失败。
安装完成后,您必须调用 reconfigure
命令,该命令将组成服务器的组件配置为在您的特定环境中协同工作:
sudo chef-server-ctl reconfigure
创建管理员用户和组织
接下来,我们需要创建一个管理员用户。 这将是有权对我们将创建的组织中的基础架构组件进行更改的用户名。
我们可以使用 chef-server-ctl
命令的 user-create
子命令来做到这一点。 该命令需要在创建过程中传入多个字段。 一般语法是:
chef-server-ctl user-create USERNAME FIRST_NAME LAST_NAME EMAIL PASSWORD
我们将包含此信息,并将在末尾添加一个附加标志 -f
,以指定输出新用户的私有 RSA 密钥的文件名。 我们将需要它以便稍后使用 knife
管理命令进行身份验证。
对于我们的示例,我们将使用以下信息创建一个用户:
- 用户名:管理员
- 名字:管理员
- 姓:管理员
- 电子邮件: admin@example.com
- 密码:examplepass
- 文件名:admin.pem
使用此信息创建用户所需的命令是(您应该更改它以反映您的信息,尤其是密码):
sudo chef-server-ctl user-create admin admin admin admin@example.com examplepass -f admin.pem
您现在应该在当前目录中有一个名为 admin.pem
的私钥。
现在您有了一个用户,您可以使用 org-create
子命令创建一个组织。 一个组织只是 Chef 中的一组基础设施和配置。 该命令具有以下一般语法:
chef-server-ctl org-create SHORTNAME LONGNAME --association_user USERNAME
短名称是您将用于在 Chef 中引用组织的名称。 长名称是组织的实际名称。 --association_user
指定有权管理组织的用户名。 同样,我们将添加 -f
标志,以便我们可以指定放置私钥的文件名。 将创建的密钥用于验证新客户作为组织的一部分,直到他们可以获得自己的唯一客户端密钥。
我们将创建一个具有以下品质的组织:
- 简称:digitalocean
- 长名称:DigitalOcean, Inc.
- 关联用户:admin
- 文件名:digitalocean-validator.pem
要创建具有上述品质的组织,我们将使用以下命令:
sudo chef-server-ctl org-create digitalocean "DigitalOcean, Inc." --association_user admin -f digitalocean-validator.pem
在此之后,您的主目录中应该有两个 .pem
密钥文件。 在我们的例子中,它们将被称为 admin.pem
和 digitalocean-validator.pem
。 我们需要连接到该服务器并将这些密钥下载到我们的工作站。 不过现在,我们的 Chef 服务器安装已经完成。
配置厨师工作站
现在我们的 Chef 服务器已启动并运行,我们的下一步行动是配置工作站。 实际的基础架构协调和配置不会在 Chef 服务器上进行。 这项工作在工作站上完成,然后将数据上传到服务器以影响 Chef 环境。
克隆 Chef 存储库
您的基础设施的 Chef 配置以分层文件结构维护,统称为 Chef 存储库。 它的一般结构可以在 Chef 团队提供的 GitHub 存储库中找到。 我们将使用 git
将此存储库克隆到我们的工作站上,作为我们基础架构的 Chef 存储库的基础。
首先,我们需要通过apt
打包工具安装git
。 通过键入以下内容更新您的打包索引并安装该工具:
sudo apt-get update sudo apt-get install git
安装 git
后,您可以将 Chef 存储库克隆到您的机器上。 对于本指南,我们将简单地将其克隆到我们的主目录:
cd ~ git clone https://github.com/chef/chef-repo.git
这会将基本的 Chef 存储库结构下拉到主目录中名为 chef-repo
的目录中。
将您的 Chef 存储库置于版本控制之下
在 Chef 存储库中创建的配置最好在版本控制系统中进行管理,就像管理代码一样。 由于我们克隆了上面的存储库,因此已经初始化了一个 git
存储库。
要为新提交设置工作站,您应该做一些事情。
首先,设置 git
将用于标记您所做的任何提交的名称和电子邮件。 这是 git
接受提交的要求。 我们将其设置为全局,以便我们创建的任何 git
存储库都将使用这些值:
git config --global user.name "Your Name" git config --global user.email "username@domain.com"
接下来,我们将告诉 git
忽略 ~/chef-repo/.chef
目录中包含的任何信息。 我们将在几分钟内创建这个目录来存储一些敏感信息。 现在,我们可以将此位置添加到我们的 .gitignore
文件中,这样 git
就不会存储不应暴露给其他人的数据:
echo ".chef" >> ~/chef-repo/.gitignore
由于我们已经对 .gitignore
文件进行了更改,因此我们可以继续对版本控制系统进行第一次新的提交。 首先,将所有修改后的文件添加到当前暂存区:
cd ~/chef-repo git add .
现在,提交更改。 我们将使用 -m
标志来指定描述我们所做更改的内联提交消息:
git commit -m "Excluding the ./.chef directory from version control"
我们的 Chef 存储库现在处于版本控制之下。 当我们为我们的基础设施编写配置时,我们可以使用上述两个命令来保持我们的 git
存储库是最新的。
下载并安装 Chef 开发工具包
接下来,我们需要安装 Chef Development Kit,这是一套专为 Chef 工作站设计的软件。 这包括许多实用程序,这些实用程序在为您的基础架构设计配置时非常有用。 我们现在感兴趣的工具是捆绑的 knife
命令,它可以与 Chef 服务器和任何 Chef 客户端进行通信和控制。
我们可以在 Chef 网站上找到 Chef 12 Development Kit。 由于我们使用 Ubuntu 14.04 作为我们的工作站,因此 here 页面将包含最新的下载链接。 请注意,在撰写本文时,下载链接仅引用了 Ubuntu 12.04 和 Ubuntu 13.10,但它仍应在 Ubuntu 14.04 上安装而不会出现问题。
右击“Ubuntu Linux”下的下载按钮,复制链接位置:
回到您的工作站,切换到您的主目录。 粘贴您复制的链接并使用 wget
命令下载包。 如果发布了较新的开发套件版本,您复制的链接可能与以下链接不同:
cd ~ wget https://opscode-omnibus-packages.s3.amazonaws.com/ubuntu/12.04/x86_64/chefdk_0.4.0-1_amd64.deb
下载 .deb
软件包后,您可以通过键入以下命令进行安装:
sudo dpkg -i chefdk_*.deb
安装后,您可以通过新的 chef
命令验证所有组件在其预期位置是否可用:
chef verify
如果您的工作站主要用于管理基础架构的 Chef,您可能希望默认使用随 Chef 一起安装的 Ruby 版本。 您可以通过修改 .bash_profile
来做到这一点,以便 Chef 的 Ruby 优先:
echo 'eval "$(chef shell-init bash)"' >> ~/.bash_profile
之后,您可以获取 .bash_profile
文件来为当前会话设置正确的环境变量:
source ~/.bash_profile
如果您希望独立管理 Ruby 版本,可以跳过上述步骤。
将身份验证密钥下载到工作站
此时,您的工作站拥有与 Chef 服务器交互和编写基础架构配置所需的所有软件。 但是,它尚未配置为与您的 Chef 服务器和您的环境进行交互。 在本节中,我们将下载我们在 Chef 服务器上创建的凭据。
我们将使用 scp
实用程序下载我们在 Chef 服务器上创建的用户密钥和组织验证器密钥。 在此之前,我们将创建一个隐藏目录,我们将在其中存储这些文件:
mkdir ~/chef-repo/.chef
您用于连接到 Chef 服务器的方法将决定我们如何准确地下载密钥。 按照以下与您的设置匹配的方法:
使用密码连接到 Chef 服务器时如何下载密钥
如果您使用基于密码的身份验证通过 SSH 连接到 Chef 服务器,则 scp
命令无需进行重大修改即可工作。
在您的工作站上,指定用于连接到 Chef 服务器的用户名和域名或 IP 地址。 紧随其后的是冒号 (:) 和您要下载的文件的路径。 添加空格后,在本地计算机上指明您希望下载文件的目录(在我们的例子中为~/chef-repo/.chef
)。
如果您使用 root
用户帐户登录 Chef 服务器,您的命令将如下所示。 请记住更改域名或 IP 地址以及您尝试下载的密钥文件的名称以匹配您的环境:
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 服务器,则命令看起来更像这样:
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 会话与工作站保持一致。 我们需要立即使用新参数重新连接:
exit
回到本地计算机后,您需要将用于连接 Chef 服务器的 SSH 密钥添加到 SSH 代理。 OpenSSH 是标准的 SSH 套件,包括一个 SSH 代理,可以通过键入以下命令启动:
eval $(ssh-agent)
您应该会看到如下所示的输出(数字可能会有所不同):
Agent pid 13881
代理启动后,您可以向其中添加 SSH 密钥:
ssh-add
Identity added: /home/demo/.ssh/id_rsa (rsa w/o comment)
这将使您的 SSH 密钥存储在内存中。 现在,您可以在连接时使用 -A
选项和 ssh
将存储的密钥 转发 到您的工作站。 这将允许您从工作站连接到任何计算机,就像您从本地计算机连接一样:
ssh -A username@workstation_domain_or_IP
现在,您可以使用转发的 SSH 凭据连接到您的 Chef 服务器,而无需密码。 如果您的 Chef 服务器上的密钥可通过 root 用户获得,您将需要的命令将与此类似。 请记住根据需要更改 Chef 服务器的域名或 IP 地址以及密钥名称:
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 密钥用于向常规用户帐户验证您的身份,则您的命令将如下所示:
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 凭证,我们可以使用连接和控制 Chef 基础架构所需的信息来配置 knife
命令。 这是通过一个 knife.rb
文件完成的,我们将把它与我们的密钥一起放在 ~/chef-repo/.chef
目录中。
在文本编辑器的该目录中打开一个名为 knife.rb
的文件:
nano ~/chef-repo/.chef/knife.rb
在此文件中,粘贴以下信息:
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
文件位于同一目录中,则可以使用#{current_dir}
Ruby 代码段指定当前目录。 - chef_server_url:这是可以访问 Chef 服务器的 URL。 它应该以
https://
开头,然后是您的 Chef 服务器的域名或 IP 地址。 之后,应通过附加/organizations/your_organization_name
指定组织的路径。
对于我们的指南,knife.rb
文件看起来与此类似。 如果您跟随,您仍然需要调整服务器的域名或 IP 地址:
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
目录中才能正确读取我们的配置文件:
cd ~/chef-repo knife client list
第一次尝试应该会失败,并出现如下所示的错误:
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 证书。 我们可以通过键入:
knife ssl fetch
这应该将 Chef 服务器的证书文件添加到我们的 ~/chef-repo/.chef
目录中的列表中:
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 证书后,前面的命令现在应该可以工作了:
knife client list
digitalocean-validator
如果上述命令正确返回,您的工作站现在已设置为控制您的 Chef 环境。
使用 Knife 引导新节点
配置好 Chef 服务器和工作站后,我们可以开始使用 Chef 在我们的基础架构中配置新服务器。
这是通过一个称为“引导”的过程发生的,在该过程中,Chef 客户端可执行文件安装在新计算机上,并且组织验证器密钥也被传递。 然后,新节点使用验证器密钥联系 Chef 服务器,作为回报,它会收到自己唯一的客户端密钥和分配给它的任何配置。 此过程使新服务器进入其初始状态,并将其设置为任何未来的管理。
要连接到新服务器,我们需要一些关于新节点的信息:
- 可以访问的域名或IP地址
- 用于完成管理操作的用户名。 这可以是
root
或配置有sudo
权限的用户。 - 一种以上述用户身份登录的方法。 这可以是密码,也可以是使用 SSH 密钥的能力。
- 一种执行管理任务的方法。 对于
root
用户,这是不必要的。 对于依赖sudo
权限的用户,通常需要密码。
该命令的一般语法为:
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”的节点,使用用户名 demo
,该用户配置有 sudo
权限,并且需要 SSH 密码和 [X182X ] 验证,我们可以输入:
knife bootstrap node_domain_or_IP -N testing -x demo -P password --sudo --use-sudo-password
如果我们想使用 root
用户进行引导,使用工作站上可用的密钥进行 SSH 密钥身份验证,并希望继续使用节点的主机名作为 Chef 节点名,我们可以输入:
knife bootstrap node_domain_or_IP -x root -A
如果我们想使用 SSH 密钥对 sudo
用户进行身份验证,我们仍然需要使用 -P
标志、--sudo
标志和 --use-sudo-password
标志以避免提示:
knife bootstrap node_domain_or_IP -x demo -A -P password --sudo --use-sudo-password -N name
如果您处于上述情况,但不介意提示输入 sudo
密码,您可以输入以下内容:
knife bootstrap node_domain_or_IP -x demo -A --sudo -N name
一旦你的新节点被引导,你应该有一个新的客户端:
knife client list
digitalocean-validator name
您还应该有一个同名的新节点:
knife node list
name
您可以使用上述过程在任意数量的新服务器上轻松设置新的 Chef 客户端。
如果您想了解如何将新的 DigitalOcean Droplets 自动添加到现有的 Chef 基础架构中,而无需引导每个基础架构,查看本教程。
结论
遵循本指南后,您应该为您的基础架构配置了一个功能齐全的 Chef 服务器。 我们还设置了一个工作站,可用于管理和维护 Chef 将应用于您的基础架构的配置。 我们已经演示了如何使用 knife
命令引导将由 Chef 配置的服务器。
在 下一个指南 中,我们将演示如何使用一些 Chef 结构为您的节点设计配置。 我们将介绍 Chef 食谱和食谱的基础知识,作为使用声明性配置控制基础架构的方法。