介绍
随着基础设施需求的扩大,手动管理每个服务器的任务变得越来越困难,这种困难被可重复性要求所加重,如果节点失败或需要水平扩展时,这就变得必要。
配置管理解决方案旨在通过将基础设施管理转化为代码库来解决这些问题,而不是在多台机器上执行单个任务,这些工具允许您将您的需求定位为一个中心位置,每个组件都可以连接,拉下配置并应用。
在 前一篇中,我们在概念层面上讨论了厨师组件的总体结构以及它们如何相互作用以实现管理员的目标。
在本指南中,我们将安装实际的软件。我们将设置一个集中式厨师服务器,该服务器将存储和服务配置指令和节点配置信息。我们还将设置一个工作站,管理员可以与代码库工作并改变基础设施的特性。
前提和目标
在本指南中,我们将设置 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
标题下,右键单击下载链接并复制链接位置:
回到您的服务器上,更改到您的主目录. 粘贴您复制的链接,并使用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.pem
和digitalocean-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
下的下载按钮右键,并复制链接位置:
回到您的工作站,更改到您的主目录. 粘贴您复制的链接,并使用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 将应用于您的基础设施的配置。
在 下一个指南中,我们将展示如何使用一些厨师构造来设计节点的配置。