随着基础架构需求的扩展,手动管理每台服务器变得越来越困难。这种困难因重复性要求而变得复杂,如果节点出现故障或需要水平缩放,则需要再现性。
配置管理解决方案旨在通过将基础架构管理转变为代码库来解决这些问题。这些工具不是在许多机器上执行单独的任务,而是允许您将需求提交到每个组件可以连接的中央位置,下拉其配置并应用它。
在本教程中,我们将安装实际的软件。我们将设置一个集中的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建议此服务器至少使用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
和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站点找到必须安装的软件包。特别是,对于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
接下来,我们需要创建一个管理员用户。这将是有权访问我们将创建的组织中的基础架构组件的用户名。
我们可以使用user-create
命令的子命令chef-server-ctl
来完成此操作。该命令需要在创建过程中传递许多字段。一般语法是:
chef-server-ctl user-create USERNAME FIRST_NAME LAST_NAME EMAIL PASSWORD
我们将包含此信息,并且还将在末尾添加一个-f
附加标志,以指定用于输出新用户的私有RSA密钥的文件名。我们将需要这个以便稍后使用knife
管理命令进行身份验证。
对于我们的示例,我们将使用以下信息创建用户:
创建具有此信息的用户所需的命令是(您应该更改此信息以反映您的信息,尤其是密码):
sudo chef-server-ctl user-create admin admin admin [邮件] examplepass -f admin.pem
您现在应该在当前目录中调用一个私钥admin.pem
。
现在您拥有了一个用户,您可以使用org-create
子命令创建一个组织。组织只是Chef中的一组基础架构和配置。该命令具有以下一般语法:
chef-server-ctl org-create SHORTNAME LONGNAME --association_user USERNAME
短名称是您将用于从Chef内部引用组织的名称。长名称是组织的实际名称。该--association_user
指定可以访问管理组织中的用户名。同样,我们将添加-f
标志,以便我们可以指定放置私钥的文件名。将创建的密钥用于验证新客户端作为组织的一部分,直到他们可以获得自己唯一的客户端密钥。
我们将创建一个具有以下特点的组织:
要创建具有上述质量的组织,我们将使用以下命令:
sudo chef-server-ctl org-create tencentcloud "TencentCloud, Inc." --association_user admin -f tencentcloud-validator.pem
在此之后,您的主目录中应该有两个.pem
密钥文件。在我们的例子中,他们将被称为admin.pem
和tencentcloud-validator.pem
。我们需要连接到此服务器并立即将这些密钥下载到我们的工作站。目前,我们的Chef服务器安装已完成。
现在我们的Chef服务器已启动并运行,我们的下一步操作是配置工作站。Chef服务器上不会进行实际的基础架构协调和配置。此工作在工作站上完成,然后工作站将数据上载到服务器以影响Chef环境。
基础结构的Chef配置维护在一个分层文件结构中,统称为Chef repo。可以在Chef团队提供的GitHub存储库中找到它的一般结构。我们将使用git
将此repo克隆到我们的工作站上,以作为我们基础架构的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 repo结构下拉到主目录中调用的目录chef-repo
中。
Chef repo本身内部编写的配置最好在版本控制系统中以与管理代码相同的方式进行管理。由于我们克隆了上面的git
repo,因此已经初始化了repo。
要为新提交设置工作站,您应该做一些事情。
首先,设置git
用于标记您所做提交的任何提交的名称和电子邮件。这是git
接受提交的要求。我们在全局设置它,以便git
我们创建的任何repo都将使用这些值:
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
repo 保持最新状态。
接下来,我们需要安装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
命令下载该包。如果已发布较新的开发工具包版本,您复制的链接可能与下面的链接不同:
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服务器的方法将决定我们下载密钥的准确程度。请按照下面与您的设置匹配的方法:
如果使用基于密码的身份验证通过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会话留给工作站。我们需要使用新参数重新连接:
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密钥保存在内存中。现在,您可以在连接时使用ssh
的-A
选项将存储的密钥转发到工作站。这将允许您从工作站连接到任何计算机,就像从本地计算机连接一样:
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
现在您已在工作站上获得了Chef资源,我们可以使用knife
连接和控制Chef基础结构所需的信息来配置命令。这是通过我们将与键一起放在~/chef-repo/.chef
目录中的knife.rb
文件来完成的。
在文本编辑器中打开该目录中调用的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"]
应根据您的基础设施调整以下项目:
knife
将用于连接到Chef服务器的名称。这应该与您的用户名匹配。knife.rb
文件位于同一目录中,我们可以使用#{current_dir}
代码段填写路径。knife
用于引导新节点的验证客户端的名称。这将采用您的组织短名称的形式,以-validator
结尾。client_key
类似,这包括从Chef服务器复制的验证密钥的名称和路径。同样,如果验证密钥与knife.rb
文件位于同一目录中,则可以使用Ruby#{current_dir}
代码段指定当前目录。https://
开头。之后附加指定组织的路径/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在我们的基础架构中配置新服务器。
这通过称为“bootstrapping”的过程发生,其中Chef客户端可执行文件安装在新计算机上,组织验证器密钥也被传递。然后,新节点使用验证器密钥与Chef服务器联系,并作为回报,接收其自己唯一的客户端密钥以及已分配给它的任何配置。此过程使新服务器进入其初始状态,并为将来的管理进行设置。
要连接到新服务器,我们需要有关新节点的一些信息:
root
,也可以是配置了sudo
权限的用户。root
用户来说,这是不必要的。对于依赖sudo
权限的用户,通常需要密码。该命令的一般语法将是:
knife bootstrap node_domain_or_IP [options]
您可能最终使用的一些常见选项是:
sudo
命令的密码,这是必要的。sudo
用于执行管理操作,则需要此标志。默认情况下,它会提示输入sudo
密码。-P
标志的密码,除了--sudo
标志外,请使用此标志将使用-P
密码。使用该-A
选项时,必须在本地计算机上启动SSH代理,添加可用于连接到新节点的SSH密钥,并通过-A
最初连接标志将该信息转发到工作站。有关如何执行此操作的详细信息,请参阅工作站配置部分中有关从Chef服务器下载密钥的信息。
使用上述信息,可以为各种情况构造正确的自举命令。
例如,要使用名称为“testing”的节点引导,使用配置了sudo
权限的用户名demo
,并且需要密码进行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
如果你在上面的场景中不介意被提示输入sudo
密码,你可以改为输入:
knife bootstrap node_domain_or_IP -x demo -A --sudo -N name
一旦您的新节点被引导,您应该有一个新的客户端:
knife client list
digitalocean-validator
name
您还应该有一个同名的新节点:
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》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。