介绍
随着基础架构需求的扩展,手动管理每个服务器成为一项日益困难的任务。 这种困难由于对可再现性的要求而复杂化,如果节点故障或者如果需要水平缩放,则这是必要的。
配置管理解决方案旨在通过将基础架构管理转变为代码库来解决这些问题。 这些工具允许您将需求提交到每个组件可以连接,下拉其配置并应用它的中心位置,而不是在多个计算机上执行单个任务。
在先前的指导 ,我们谈到,在概念层面,对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服务器。 请记住,Chef建议此服务器至少使用4个内核和4 GB内存,因此请相应进行计划。
确保服务器可通过主机名访问
一旦您登录到服务器,计划安装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
,如果我也希望我的主机的主机名“大厨”访问,我能有一个看起来像这样的文件:
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
,我的文件可能是这个样子,而不是:
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服务器软件
接下来,我们可以下载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
这将把主厨12系统安装到服务器上。 如果您选择的服务器的硬件强度低于建议的量,则此步骤可能会失败。
一旦安装完成后,你必须调用reconfigure
命令,该命令配置,使服务器以在特定环境协同工作的组件:
sudo chef-server-ctl reconfigure
创建管理用户和组织
接下来,我们需要创建一个admin用户。 这将是有权访问的用户名,以更改我们将要创建的组织中的基础架构组件。
我们可以用做user-create
的子命令的chef-server-ctl
命令。 该命令需要在创建过程中传递多个字段。 一般的语法是:
chef-server-ctl user-create USERNAME FIRST_NAME LAST_NAME EMAIL PASSWORD
我们将包括此信息,并且也将增加-f
以指定要输出我们的新用户的专用RSA密钥文件名,一个额外的标志,到结束。 我们将需要这一点是为了使用验证knife
后的管理命令。
对于我们的示例,我们将使用以下信息创建一个用户:
- 用户名 :admin
- 首先名 :admin
- 最后名 :admin
- 电子邮件 : 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公司
- 协会用户 :admin
- 文件名 :digitalocean-validator.pem
要创建具有上述质量的组织,我们将使用以下命令:
sudo chef-server-ctl org-create digitalocean "DigitalOcean, Inc." --association_user admin -f digitalocean-validator.pem
在此之后,你应该有两个.pem
在你的home目录中的密钥文件。 在我们的例子,因为他们必称为admin.pem
和digitalocean-validator.pem
。 我们需要连接到此服务器,并将这些密钥立即下载到我们的工作站。 现在,我们的Chef服务器安装完成。
配置Chef Workstation
现在,我们的Chef服务器已启动并正在运行,我们的下一步行动是配置工作站。 实际的基础架构协调和配置不在Chef服务器上进行。 这项工作是在工作站上完成的,然后工作站将数据上传到服务器以影响Chef环境。
克隆ChefRepo
您的基础结构的Chef配置保存在一个称为Chef repo的分层文件结构中。 它的一般结构可以在Chef团队提供的GitHub存储库中找到。 我们将使用git
这个回购克隆到我们的工作站,作为我们的基础设施的Chef库的基础工作。
首先,我们需要安装git
通过apt
打包工具。 更新您的包装索引并通过键入以下内容安装该工具:
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 Repo放在版本控制下
Chef repo自身中创建的配置最好在版本控制系统中管理,方法与管理代码的方式相同。 由于我们上面克隆回购,一个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 repo现在受版本控制。 当我们编写配置为我们的基础设施,我们可以用上面的两个命令来保持我们的git
回购了最新的。
下载并安装Chef开发包
接下来,我们需要安装Chef开发包,这是一个为Chef工作站设计的软件套件。 这包括许多实用程序,在设计基础架构的配置时非常有用。 该工具,我们在这一点上感兴趣的是捆绑的knife
命令,它能够沟通,能够控制Chef服务器和任何Chef客户端都。
我们可以在Chef网站上找到Chef 12开发工具包。 由于我们使用的Ubuntu 14.04作为我们的工作站,该页面在这里将包含最新的下载链接。 注意在写这篇文章的时候,下载链接只引用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
在我们的例子)。
如果您登录到使用Chef服务器root
用户帐号,你的命令就会是这个样子。 请记住更改域名或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
一旦返回本地计算机,您将需要添加SSH密钥,用于连接到SSH代理的Chef服务器。 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
现在,您可以连接到您的Chef服务器,而不需要使用转发的SSH凭据的密码。 如果您的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,我们可以配置knife
与它需要连接和控制您的Chef基础设施信息的命令。 这是通过做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服务器复制的用户密钥。 我们可以使用#{current_dir}
片段,填补了路径,如果关键是在同一目录中knife.rb
文件。 -
validation_client_name
:这是验证客户端的名称knife
将用于引导新节点。 这将需要您的组织名称缩写的形式,其次是-validator
。 -
validation_key
:像client_key
,这包括名称和路径,你从Chef服务器复制的确认键。 同样,你可以使用#{current_dir}
Ruby片断如果验证关键是在同一目录中指定的当前目录knife.rb
文件。 -
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环境。
用刀子引导新节点
通过配置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服务器下载密钥的工作站配置部分中找到。
使用上述信息,可以为各种情况构造正确的引导命令。
例如,为了引导一个节点的名称为“测试”,使用用户名demo
,其被配置与sudo
特权,和其中需要对SSH和一个密码sudo
验证,我们可以输入:
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
如果你在上面的场景,但不介意被promted为sudo
密码,就可以而不是只输入:
knife bootstrap node_domain_or_IP -x demo -A --sudo -N name
一旦你的新节点被引导,你应该有一个新的客户端:
knife client list
digitalocean-validator
name
您还应该有一个相同名称的新节点:
knife node list
name
您可以使用上述过程在任意数量的新服务器上轻松设置新的Chef客户端。
如果您想了解如何自动将新DigitalOceanDroplet添加到您现有的基础设施,Chef,无需引导各一个, 看看这个教程 。
结论
遵循本指南后,您应该为您的基础架构配置一个功能齐全的Chef服务器。 我们还设置了一个工作站,可用于管理和维护Chef将应用于您的基础架构的配置。 我们已经证明了如何使用knife
命令来引导将由Chef被配置的服务器。
在接下来的指南中,我们将演示如何设计配置为使用一些Chef结构的节点。 我们将讨论Chef Recipe和烹饪书的基本原理,作为使用声明性配置来控制基础架构的方法。