Chef是一个“能够实现将基础架构模型转换为代码形式”的自动化平台,它允许用户跨越数个服务器(或者数个节点)来管理和部署资源。Chef自动化平台还允许用户创建及下载“菜谱”(“菜谱”存储在“烹饪手册”cookbook
之中),“菜谱”的作用就是自动化这些节点上的内容和策略。
Chef由一个Chef服务器、一个或者多个待配置的工作站服务器、以及由安装在每个节点上的Chef客户端管理的众多节点所组成。
本指南介绍了如何在各个Linode(VPS服务提供商)主机上创建和配置Chef服务器,虚拟工作站以及如何通过引导节点来运行chef客户端。
注意本指南是为非root用户所编写的。遇到需要提权的命令可以加上前缀
sudo
。如果您不熟悉sudo
命令,可以查看我们的用户和组指南。
先决条件
一台用于托管Chef服务器的主机,要求内存4GB,运行Ubuntu 18.04操作系统
两个内容小任意的Linode主机,每台都运行Ubuntu 18.04操作系统,分别用于托管工作站和节点主机
请根据Linode入门指南和如何保护您的服务器这两篇文章的介绍来配置每台Linode主机
每台Linode主机都需要配置有效的FQDN(全限定域名)
请确保所有主机上的软件都是最新的:
代码语言:txt复制sudo apt update && sudo apt upgrade
Chef服务器
Chef服务器是所有Chef工作站和chef节点之间交互中心。在工作站所进行的配置变更可以上传到Chef服务器,然后就可以由Chef客户端来访问Chef服务器,并将配置变更同步到每一个节点。
安装Chef Server
下载最新的Chef服务核心安装包:
代码语言:txt复制wget https://packages.chef.io/files/current/chef-server/12.17.54 20180531095715/ubuntu/18.04/chef-server-core_12.17.54 20180531095715-1_amd64.deb
安装Chef服务:
代码语言:txt复制sudo dpkg -i chef-server-core_*.deb
删除下载的文件:
代码语言:txt复制rm chef-server-core_*.deb
Chef服务器包含一个名为的命令行实用程序chef-server-ctl
。运行chef-server-ctl
以启动Chef服务器服务:
sudo chef-server-ctl reconfigure
创建Chef用户和用户组
为了将众多的工作站和站点链接到chef服务器上,我们需要创建一个管理员和用户组,并且通过RSA私钥将这两者关联起来。
在 /home
目录下,创建一个.chef
目录,用于存储私钥:
mkdir .chef
通过执行chef-server-ctl
命令来建用户。在本例中,需要对命令中如下几个关键词进行一些调整:USER_NAME
,FIRST_NAME
,LAST_NAME
,EMAIL
,和PASSWORD
。调整USER_NAME.pem 时只需更改USERNAME
,其后缀名.pem
需要保留
sudo chef-server-ctl user-create USER_NAME FIRST_NAME LAST_NAME EMAIL 'PASSWORD' --filename ~/.chef/USER_NAME.pem
接下来,创建一个用户组,并将上一步创建的管理员用户绑定到该安全用户组。将ORG_NAME
改为用户组的短标识符,将ORG_FULL_NAME
更改为用户组的全称,将USER_NAME
改为上一步骤所创建用户的用户名,最后将ORG_NAME.pem
中的ORG_NAMEG
改为用户组短标识符,并且保留其后缀名.pem
:
sudo chef-server-ctl org-create ORG_NAME "ORG_FULL_NAME" --association_user USER_NAME --filename ~/.chef/ORG_NAME.pem
当安装完成Chef服务器并生成RSA密钥后之,您就可以开始配置各个工作站了,这些工作站将为Chef节点执行所有的主要工作。
Chef工作站
在Chef工作站中,您可以创建和配置任意的“菜谱”、“烹饪手册”、属性和其他更改,这些对于工作站来说都是有效的。尽管本地的主机可以运行任意的的操作系统,但将远程服务器作为工作站主机的话,有些好处还是显而易见的,因为这样您就可以从任何地方访问它了。
设置工作站
下载最新的Chef Development Kit(Chef开发工具包):
代码语言:txt复制wget https://packages.chef.io/files/stable/chefdk/3.1.0/ubuntu/18.04/chefdk_3.1.0-1_amd64.deb
安装ChefDK(Chef开发工具包缩写):
代码语言:txt复制sudo dpkg -i chefdk_*.deb
删除已安装文件:
代码语言:txt复制rm chefdk_*.deb
生成chef-repo
并移动到刚刚创建的目录中:
chef generate app chef-repo
cd chef-repo
创建.chef
目录,用来存储knife.rb
(“菜谱”配置文件)、ORGANIZATION-validator.pem
以及USER.pem
文件:
mkdir .chef
添加RSA私钥
设置Chef服务器的时候,需要将生成的RSA私有密钥放在工作站上。这背后的具体过程取决于您登录linode主机的时候是否使用了SSH密钥身份验证的登录方式。
如果没有使用密钥身份验证的登录方式,请直接从Chef服务器复制文件。对于下面的命令,我们需要将user改成你的Chef服务器上的用户名,IP改成Chef服务器的IP,或者Chef服务器上的URL地址:
代码语言:txt复制scp user@192.0.2.0:~/.chef/*.pem ~/chef-repo/.chef/
如果使用RSA密钥对身份验证的登录方式,则需要从本地终端使用scp
命令将以.pem
为后缀名的文件从服务器复制到工作站。将user
改为对应的用户名,将下面命令中的192.0.2.0
和203.0.113.0
分别改成实际的Chef服务器IP和站点服务器IP:
scp -3 user@192.0.2.0:~/.chef/*.pem user@203.0.113.0:~/chef-repo/.chef/
通过ls
列出.chef
目录下的文件内容,以确保文件已成功复制:
ls ~/chef-repo/.chef
这里应该显示该目录下所有以.pem
为后缀名文件。
添加版本控制
Chef工作站一般用于创建和编辑“烹饪手册”cookbook
以及其他的配置文件,而对工作站进行某种形式的版本控制是很有用处的。ChefDK将会把Git组件安装到您的工作站,并在创建Chef repo仓库目录的时候初始化Git版本库。在此之前,我们需要在GIT中全局配置您的用户名和电子邮箱,并且添加和提交在上述步骤中生成的任何新文件。
全局配置git的用户名和电子邮箱,请您根据实际情况修改下面的值:
代码语言:txt复制git config --global user.name yourname
git config --global user.email user@email.com
将.chef
目录添加到.gitignore
文件中:
echo ".chef" > .gitignore
添加并提交所有的现有文件:
代码语言:txt复制git add .
git commit -m "initial commit"
请确保工作目录是干净的:
代码语言:txt复制git status
它应该输出:
代码语言:txt复制On branch master
nothing to commit, working directory clean
生成knife.rb(“菜谱”配置文件)
进入~/chef-repo/.chef
文件夹,使用你的文本编辑器来创建knife.rb
配置文件。
将下面代码复制到knife.rb文件中
代码语言:txt复制current_dir = File.dirname(__FILE__)
log_level :info
log_location STDOUT
node_name 'node_name'
client_key "USER.pem"
validation_client_name 'ORG_NAME-validator'
validation_key "ORGANIZATION-validator.pem"
chef_server_url 'https://example.com/organizations/ORG_NAME'
cache_type 'BasicFile'
cache_options( :path => "#{ENV['HOME']}/.chef/checksums" )
cookbook_path ["#{current_dir}/../cookbooks"]
更改下面的对应值
将node_name
改为在您在chef服务器上创建的用户名。
将client_key
对应的USER.pem
改成chef服务器上的用户创建的USER.pem
,建立映射关系。
将validation_client_name
对应的ORG_NAME-validator
改为你的ORG_NAME
改成拼接上-validator
将validation_key
对应的ORGANIZATION-validator.pem
改成你的ORG_NAME
拼接上-validator.pem
最后将chef_server_url
改成你自己服务器的全限定域名,并且在最后面加上你的用户组短标识ORG
进入chef-repo目录,从服务器复制必要的SSL证书文件到该目录下
代码语言:txt复制cd ..
knife ssl fetch
注意这些SSL证书是在安装Chef服务器的时候自动生成的。很明显,这类证书是自签名的。这也意味着不需要使用第三方的签名证书颁发机构(CA)的服务。Chef服务器的主机名和FQDN应该相同,以便工作站可以获取并验证SSL证书。您可以分别通过运行
hostname
和hostname -f
验证Chef服务器的主机名和FQDN 。有关重新生成SSL证书的详细信息,请参阅Chef说明文档。
请在客户端运行命令knife.rb
,验证客户端均已正确配置:
knife client list
此命令应输出验证器名称。
配置完成服务器和工作站之后,我们就可以引导到节点了。
引导节点
引导客户机节点的过程中会自动安装Chef客户端并验证节点有效性,引导过程中允许节点从Chef服务器读取相关信息,以后也可以有chef客户端根据需要修改相关配置信息。
从您的工作站导进入到您的~/chef-repo/.chef
目录:
cd ~/chef-repo/.chef
使用客户机节点的root用户或者可以提升权限的用户来引导客户机节点:
作为拥有节点root权限的用户,请根据需要更改root的密码password以及客户机节点的名称nodename。如果您希望使用客户机节点的默认主机名,则可以将修改客户机节点名称的选项忽略:
代码语言:txt复制knife bootstrap 192.0.2.0 -x root -P password --node-name nodename
作为具有sudo权限的用户,请根据需要更改用户名username、用户密码password以及客户机节点的名称nodename。如果您希望使用客户机节点的默认主机名,则可以将修改客户机节点名称的选项忽略:
代码语言:txt复制knife bootstrap 192.0.2.0 -x username -P password --sudo --node-name nodename
作为具有密钥对身份验证权限的用户,请根据需要更改主机用户名username和客户机节点名称nodename。如果您希望使用客户机节点的默认主机名,则可以将修改客户机节点名称的选项忽略:
代码语言:txt复制knife bootstrap 192.0.2.0 --ssh-user username --sudo --identity-file ~/.ssh/id_rsa.pub --node-name hostname
通过列出客户机节点来确保节点均已被引导:
代码语言:txt复制knife client list
该列表应包含所有最新的客户机。
下载Cookbook(‘烹饪手册’)(可选)
使用Chef服务时,您将希望Chef客户端可以定期在您的节点上运行,并将所有配置更改推送到Chef中央服务器。出于安全考虑,您还希望删除节点客户机在引导节点时上传到Chef服务器的验证文件validation.pem
。虽然这些步骤都可以手动完成,但将其设置为“菜谱”之后,执行起来更加容易和高效。
这部分内容是可选的,我们仅提供有关将“菜谱”如何下载到工作站,然后如何将其推送到服务器的说明,这部分内容同时包含可扩展和可试验的基本“菜谱”框架。
从您的工作站进入到~/chef-repo/.chef
目录:
cd ~/chef-repo/.chef
下载cookbook及其依赖项:
代码语言:txt复制knife cookbook site install cron-delvalidate
打开default.rb文件以检查默认的cookbook"配方":
代码语言:txt复制#
# Cookbook Name:: cron-delvalidate
# Recipe:: Chef-Client Cron & Delete Validation.pem
#
#
cron "clientrun" do
minute '0'
hour '*/1'
command "/usr/bin/chef-client"
action :create
end
file "/etc/chef/validation.pem" do
action :delete
end
cron "clientrun"do
定义了一个定时操作,它的含义是每隔一小时(*/1
含义是每小时而不是每天凌晨1点),执行一次chef-client(/usr/bin/chef-client)
命令,action对应的create标识创建一个新的定时作业。
"/etc/chef/validation.pem"
文件被validation.pem
文件进行调用,当满足条件的时候会执行对应操作“删除命令”来移除该文件。
在Ruby中,这是两个非常基本的操作,在创建Chef的“烹饪手册”cookbook时,会提供最基本的代码结构示例。我们可以根据需要对这些示例代码进行编辑和扩展。
将配方添加到节点的运行列表中,替换nodename
为节点的名称:
knife node run_list add nodename 'recipecron-delvalidate::default'
将菜谱cookbook推送到Chef服务器:
代码语言:txt复制knife cookbook upload cron-delvalidate
更新cookbook时也使用此命令。
切换到您的自检(自动定时拉取服务器的cookbook)客户机节点并运行初始chef-client
命令:
chef-client
如果以非root用户身份运行此命令,请在命令前面加上sudo
。
运行列表中的配方cookbook时,节点将会从服务器中拉取对应程序并运行。在这种情况下,这种食谱一般都是含有cron-delvalidate
定时作业的。这样从服务器拉取的配方可以保证能够完整制作,然后Chef站点和节点可以将变更的配置推送到Chef服务器,并将这些信息同步到节点列表上,各个节点和工作站每隔一小时会自动拉取cookbook“烹饪手册“到自己的节点上。这种自动化步骤避免了将来连接到节点时手动更改客户机的操作。