在Ubuntu 18.04上安装Chef服务器工作站

2018-09-07 11:23:55 浏览数 (1)

Chef是一个“能够实现将基础架构模型转换为代码形式”的自动化平台,它允许用户跨越数个服务器(或者数个节点)来管理和部署资源。Chef自动化平台还允许用户创建及下载“菜谱”(“菜谱”存储在“烹饪手册”cookbook

之中),“菜谱”的作用就是自动化这些节点上的内容和策略。

Chef由一个Chef服务器、一个或者多个待配置的工作站服务器、以及由安装在每个节点上的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服务器服务:

代码语言:txt复制
sudo chef-server-ctl reconfigure

创建Chef用户和用户组

为了将众多的工作站和站点链接到chef服务器上,我们需要创建一个管理员和用户组,并且通过RSA私钥将这两者关联起来。

/home 目录下,创建一个.chef目录,用于存储私钥:

代码语言:txt复制
mkdir .chef

通过执行chef-server-ctl命令来建用户。在本例中,需要对命令中如下几个关键词进行一些调整:USER_NAMEFIRST_NAMELAST_NAMEEMAIL,和PASSWORD。调整USER_NAME.pem 时只需更改USERNAME,其后缀名.pem需要保留

代码语言:txt复制
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

代码语言:txt复制
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并移动到刚刚创建的目录中:

代码语言:txt复制
chef generate app chef-repo 
cd chef-repo

创建.chef目录,用来存储knife.rb(“菜谱”配置文件)、ORGANIZATION-validator.pem以及USER.pem文件:

代码语言:txt复制
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.0203.0.113.0分别改成实际的Chef服务器IP和站点服务器IP:

代码语言:txt复制
scp -3 user@192.0.2.0:~/.chef/*.pem user@203.0.113.0:~/chef-repo/.chef/

通过ls列出.chef目录下的文件内容,以确保文件已成功复制:

代码语言:txt复制
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文件中:

代码语言:txt复制
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证书。您可以分别通过运行hostnamehostname -f验证Chef服务器的主机名和FQDN 。有关重新生成SSL证书的详细信息,请参阅Chef说明文档。

请在客户端运行命令knife.rb,验证客户端均已正确配置:

代码语言:txt复制
knife client list

此命令应输出验证器名称。

配置完成服务器和工作站之后,我们就可以引导到节点了。

引导节点

引导客户机节点的过程中会自动安装Chef客户端并验证节点有效性,引导过程中允许节点从Chef服务器读取相关信息,以后也可以有chef客户端根据需要修改相关配置信息。

从您的工作站导进入到您的~/chef-repo/.chef目录:

代码语言:txt复制
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目录:

代码语言:txt复制
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为节点的名称:

代码语言:txt复制
knife node run_list add nodename 'recipecron-delvalidate::default'

将菜谱cookbook推送到Chef服务器:

代码语言:txt复制
knife cookbook upload cron-delvalidate

更新cookbook时也使用此命令。

切换到您的自检(自动定时拉取服务器的cookbook)客户机节点并运行初始chef-client命令:

代码语言:txt复制
chef-client

如果以非root用户身份运行此命令,请在命令前面加上sudo

运行列表中的配方cookbook时,节点将会从服务器中拉取对应程序并运行。在这种情况下,这种食谱一般都是含有cron-delvalidate定时作业的。这样从服务器拉取的配方可以保证能够完整制作,然后Chef站点和节点可以将变更的配置推送到Chef服务器,并将这些信息同步到节点列表上,各个节点和工作站每隔一小时会自动拉取cookbook“烹饪手册“到自己的节点上。这种自动化步骤避免了将来连接到节点时手动更改客户机的操作。

访问管理rubyunixnode.js数据加密服务访问管理rubyunixnode.js数据加密服务

0 人点赞