自动化服务器配置管理工具Chef入门介绍

译文
开发 开发工具 自动化
本文将向您介绍Chef生态系统,如何实现配置管理,以及有关系统合规性的全面基础知识。

[[434207]]

【51CTO.com快译】本文将向您介绍Chef生态系统,如何实现配置管理,以及有关系统合规性的全面基础知识。我们的主要服务对象是那些编码经验有待提升的初学读者。闲言少叙,让我们从最基本的术语开始介绍:

  • Chef Cookbooks – Cookbooks(是Chef Code的组织方式。Cookbooks包含了许多非常重要的recipe、配置文件(profile)和子目录。它们定义了将各种应用于被管理系统的配置和合规性控制。
  • Chef Server – Chef Infra Server(架构服务器)会存储Cookbook、配置文件、策略文件(policyfile)、以及其他Chef代码,并将它们分享给被管理的目标节点。也就是说,它既包括了那些已分配的cookbook和配置文件的系统的信息,又维护着与目标环境有关的信息搜索索引,因此您可以按需便捷地识别和管理系统中的各个离散子集。
  • Chef Automate – 作为Chef的企业级平台,Chef Automate许开发人员、运营和安全工程师通过协作,交付出应用程序和基础架构的更改,以及合规性的状态。Chef Automate提供了横跨多个数据中心和云服务提供商的洞察力。它可以与Chef Infra Server和Habitat Builder一起被安装,以提供完整的Chef体验。您可以通过链接--https://www.youtube.com/watch?v=XlCyd_DH1YU,了解更多有关Automate的设置与运行。
  • Chef Client – Chef Client是运行在诸如Linux、Windows或MacOS等管理系统上的代理。它通过与Chef Server通信,以提取策略文件或run_list所需的cookbook、合规性配置文件、以及相关配置,然后执行recipe和合规性的扫描,并将其结果报告发回Chef Server。
  • Chef InSpec – 通过提供审计和合规性配置文件,Chef InSpec可用于测试您的Cookbook逻辑,并确保您的系统处于预期的状态。与Chef cookbook类似,其配置文件由Chef Client触发和应用,并通过CLI和Chef Automate仪表板返回输出的结果。那些被成功应用的配置文件,将显示系统是否合规。
  • Chef Workstation – Chef Workstation包含了着手编写和使用Chef cookbook所需的一切。其中包括:用于与Chef Server通信的命令行实用程序,以及在更新环境之前,在本地验证cookbook的测试工具。它可以免费地安装在Linux、macOS和Windows系统上,并包含嵌入式的Ruby和其他开箱即用的依赖项。由于该“工具箱”包含了用于创建和构建Chef的所有内容,因此它取代了现已过时的ChefDK。
  • Chef Repo – Chef Repo是Workstation或笔记本电脑上存储Chef内容的目录结构。它通常位于根目录下,例如:在Linux的/home/jsmith/chef-repo、macOS的/Users/jsmith/chef-repo、以及Windows的C:\Users\jsmith\chef-repo上。当然,它也可以被创建在系统中的任何位置(只是因为主目录更便于记住和引用)。一种常用的做法是,使用Git或其他版本控制工具,为版本、远程保存和共享代码初始化相应的目录。
  • Test Kitchen – Test Kitchen通过驱动程序的插件架构,以方便用户使用Docker、VMware、Hyper-V、VirtualBox、以及其他虚拟机管理程序,在本地测试Chef Cookbook和合规性配置文件。同时,它也能够对来自Amazon EC2、Google Compute Engine和Microsoft Azure等云服务提供商的云实例进行测试。而且,用户还能够使用Test Kitchen实现快速开发、测试和代码排障。
  • Chef Supermarket – 目前,Chef社区里有着4000多个由Chef工程师、以及合作伙伴编写的开源式Cookbook。Chef Supermarket为此提供了公开可用的存储库,以满足个人或组织的使用、检查或修改等特定需求。

第 1 部分:Chef Infra Server

虽然我们可以通过在Workstation上使用Chef Zero,实现在不运行完整Chef Infra Server的情况下,体验Chef,但是若要获得完整的使用体验,您最好还是运行本地或基于云端的Chef服务器。毕竟,成熟的Chef Infra Server并不需要太多的资源,单个VM或适当的云实例即可。而且,它可以为您提供在目标节点之间,存储和分发代码的完整体验。

Chef Infra Server的安装并不困难。它可以与Chef Automate和Chef Habitat Builder并行安装,以实现与应用程序的持续集成。实际上,每个Chef产品都可以使用独立的二进制文件--Chef-automate,通过“产品标志(product flag)”在大约15分钟内,对Chef服务器完成快速的安装和配置。

同时,您也可以从Amazon及其云端市场,部署Chef服务器。这些系统都已预先配置好了Chef Automate和Chef Infra Server,您只需创建一个管理员用户和一个组织即可开始使用。下面是其运行的先决条件:

  • 至少2颗CPU、8 GB RAM、以及32 GB的磁盘虚拟机,运行诸如Ubuntu 20.04或CentOS 8等操作系统(注意:这是远低于生产环境的最低系统要求)。
  • VM拥有静态的IP地址。
  • 具有sudo权限的非root用户。
  • 允许Chef服务器与Workstation、及Linux、Windows或macOS目标节点(可以是其他VM)通信的子网。
  • 子网上的可选DNS条目,允许服务器、节点和Workstation通过FQDN进行通信。如果没有DNS,则需编辑Chef服务器和目标节点上的hosts文件,以便它们可以通过name相互访问。
  • 或者已经完成了AWS或Azure Marketplace的部署。

请在一台原始的Linux VM中登录shell,并运行如下命令,或简单地复制deploy-chef-server.sh脚本中的内容(请在运行之前,更新变量):

  1. $ chmod +x deploy-chef-server.sh 
  2. $ ./deploy-chef-server.sh 

您也可以在没有脚本的情况下,通过如下步骤部署Chef服务器:

设置hostnamectl set-hostname hostname文件中的fqdn值与hostname –f的系统值相匹配,毕竟在安装的过程中,我们会使用FQDN去设置证书。

  1. $ hostnamectl set-hostname automate.chef.lab 

通过下载可执行的独立包,去安装Chef-automate工具。

  1. $ curl https://packages.chef.io/files/current/latest/chef- automate-cli/chef-automate_linux_amd64.zip | gunzip - > chef- automate && chmod +x chef-automate 

请按照如下方式调整环境设置:

  1. $ sudo sysctl -w vm.max_map_count=262144 
  2. $ sudo sysctl -w vm.dirty_expire_centisecs=20000 

为了防止重启后发生变化,请确保写入/etc/sysctl.conf。即,通过执行Chef-automate来部署Chef Infra Server:

  1. $ sudo ./chef-automate deploy --product infra-server 

为了能够在服务器和Workstation之间提供安全的访问,并定位Chef内容,请使用Chef服务器来创建管理员用户和组织。我们可以通过chef-server org-create命令,使用--association-user参数来创建用户名admin:

  1. $ sudo Chef-server-ctl user-create jsmith Jack Smith jsmith@gmail.com "password" --filename jsmith.pem 
  2. $ sudo Chef-server-ctl org-create lab“我的实验室”--association_user jsmith --filename lab-validator.pem 

上述命令生成了jsmith.pem和lab-validator.pem两个证书文件。在第 2 部分中,我们将把jsmith.pem文件复制到Workstation上,以实现Chef服务器和笔记本电脑之间的安全通信。

第 2 部分:Chef Workstation

作为一组工具,Chef Workstation包括Chef、knife、inspec、cookstyle、habitat、kitchen、以及嵌入式Ruby等依赖项。您可以通过下载特定于操作系统的安装程序,或使用Chef install.sh脚本,来安装Chef Workstation。

如果使用特定于操作系统的安装程序,请在环境中设置Chef shell-init,并添加嵌入式Chef二进制文件的路径。这可以确保Workstation工具使用嵌入式的Ruby版本。其中,在Linux系统上的语句为:

  1. $ echo 'eval "$(chef shell-init bash)"' >> /home/$USER/.bash_profile 
  2. $ echo 'export PATH="/opt/chef-workstation/embedded/bin:$PATH"' >> /home/$USER/.configuration_file 

我们可以通过在终端上运行如下命令,来确认安装:

  1. $ chef -v 
  2.   Chef Workstation version: 21.10.640 
  3.   Chef CLI version: 5.4.2 
  4.   Chef Habitat version: 1.6.351 
  5.   Test Kitchen version: 3.1.0 
  6.   Cookstyle version: 7.25.6 
  7.   Chef Infra Client version: 17.6.18 
  8.   Chef InSpec version: 4.46.13 

我们继续使用Chef生成器,来为所有的Chef Cookbook和其他文件创建Chef存储库,以及包括~/chef-repo/cookbooks在内的多个子目录:

  1. $ cd ~ 
  2. $ chef generate repo chef-repo 

为了便于Workstation能够与Chef服务器进行通信和交互,我们需要创建一个凭证文件。它位于主目录中的.chef目录中,例如:/home/jsmith/.chef。该文件夹和凭据文件,可以由另一个生成器所创建:

  1. $ knife configure init-config 

在终端里运行上述命令时,系统会向您提出包括:Chef服务器的URL和设置服务器时创建的用户名等问题。而命令完成后,系统会输出~/.chef/credentials文件,其内容为:

  1. [default
  2. client_name = 'jsmith' 
  3. client_key = '~/.chef/jsmith.pem' 
  4. Chef_server_url = 'https://automate.chef.lab/organizations/lab' 

通过编辑凭据文件,我们可以添加默认的cookbook位置,在本例中为~/chef-repo。当然,您也可以添加多个路径,例如:['/path/to/one', '/path/to/two']:

  1. cookbook_path = ['~/chef-repo/cookbooks'

上述.credentials文件中的client_key条目,会指向user.pem文件。我们可以将此文件从Chef服务器复制到Workstation,并使用scp之类的工具,将其放入~/.chef/目录。当然,您也可以复制Chef服务器上的user.pem文件内容,并粘贴到Workstation上的新文件中:

  1. $ cd ~ / .chef 
  2. $ scp jsmith@automate.chef.lab:/home/jsmith/jsmith.pem。  

接着,Chef Workstation会自动将准备好的证书放入~/.chef/trusted_certs文件夹中,以用于安全通信。

  1. $ knife ssl fetch 
  2. $ knife ssl check 

成功验证了证书后,我们可以使用另一个简单的Knife命令,去测试Workstation和 Chef服务器之间的连接。它将返回我们在设置Chef服务器时,所创建的客户端组织的名称:

  1. $ knife client list 
  2. lab-validator 

在完成了Chef Infra Server和Chef Workstation的设置后,我们可以开始使用Chef来配置和管理各个节点了。值得注意的是,这些配置步骤虽然对于实验室和企业内部环境都是理想的,但是在生产环境中,请务必遵循Chef服务器的系统要求。

接着,请在Workstation上安装VS Code并添加Chef扩展。其自动化完成功能和内置的Chef语言参考,会使您能够轻松地开始编写Chef代码。

第 3 部分:Chef Cookbook

在本节中,我们将创建一个简单的cookbook,以便在系统上运行Chef客户端代理时进行各项操作。

为了让Chef实现系统的自动化和合规性,Chef Infra Client会通过bootstrap进程被安装在每个节点上,并伴随着安装一个能够与Chef服务器进行通信client.rb文件。据此,您可以使用简单的Cookbook来自动化该过程,以实现系统每隔30分钟检查一次Chef服务器。

下面,我们将从近250个内置的Chef资源中,选用windows_taskcron源,通过创建一个recipe,在Linux和Windows系统上实现每隔30分钟运行一次Chef-client。其中,Linux是通过cron完成作业的;而Windows则是通过Windows Task完成的。

创建Cookbook

在Workstation上,请导航到~/chef-repo/cookbooks文件夹,并使用Chef cookbook生成器来创建一个名为run-chef-client的cookbook:

  1. $ cd ~/chef-repo/cookbooks 
  2. $ Chef generate Cookbookrun-chef-client -k dokken 

这将创建一个名为run-chef-client的新目录。其中,-k dokken标志生成一个Test Kitchen的kitchen.yml文件,实现预配置与Docker的协同。

请通过如下命令,切换到新的./run-chef-client目录,并列出其具体内容:

  1. $ cd ~/chef-repo/cookbooks/run-chef-client 
  2. $ tree 
  3. ├── CHANGELOG.md 
  4. ├── chefignore 
  5. ├── kitchen.yml 
  6. ├── LICENSE 
  7. ├── metadata.rb 
  8. ├── Policyfile.rb 
  9. ├── README.md 
  10. ├── recipes 
  11. │   └── default.rb 
  12. └── test 
  13.     └── integration 
  14.         └── default 
  15.             └── default_test.rb 

请使用如下命令创建两个目录,来分别保存属性(使用另一个Chef生成器)与合规性配置文件:

  1. $ cd ~/chef-repo/cookbooks/run-chef-client 
  2. $ chef generate attribute default $ mkdir -p ./compliance/profiles 

我们可以通过编辑metadata.rb文件,来包含维护者的信息。这些信息将被自动传递到Chef生成器,以创建诸如recipes、文件和模板等文件:

  1. name 'run-chef-client' 
  2. maintainer 'John Tonello' 
  3. maintainer_email 'jtonello@chef.lab' 
  4. license ' Apache-2.0' 
  5. description 'Set chef-client to run every 30 minutes' 
  6. version '0.1.0' 
  7. chef_version '>= 16.0' 

您在创建cookbook时,可以通过如下命令,标志maintainer、maintainer_email和license的值。

  1. $ chef generate cookbook run-chef-client -k dokken -C 'John Tonello' -m 'jtonello@chef.lab' -I 'apachev2' 

创建Recipe

请将如下内容输入./cookbooks/run-chef-client/recipes/default.rb文件,并按需更新其标题。注意,用户和密码应匹配您的环境。该recipe包括了在Windows和非Windows系统上工作的逻辑。在更为复杂的Cookbook中,您可能有不同名称的多个Cookbook。注意,请务必将带有路径的include_recipe资源运用到default.rb的recipe上。

  1. # Cookbook:: client-run 
  2. # Recipe:: default 
  3. # Copyright:: 2021, John Tonello, All Rights Reserved. 
  4.  
  5. include_profile 'run-chef-client::client-run' 
  6.  
  7. if platform?('windows'
  8.   windows_task 'run-chef-client' do 
  9. user 'WIN10\jtonello' 
  10.     password 'Sup3r!Us3r!' 
  11.     command 'chef-client' 
  12.     run_level :highest 
  13.     frequency :minute 
  14.     frequency_modifier 30 
  15.   end 
  16. else 
  17.   cron 'Run chef-client every 30 minutes' do 
  18.     minute '0,30' 
  19.     user 'root' 
  20.     command '/usr/bin/chef-client' 
  21.     action :create 
  22.   end 
  23. end 

其中,include_profile一行是Chef Infra Client 17.5.22的一项新功能。它允许您定义要在recipe中正确关联到Cookbook的合规性资料。据此,当您在第 5 部分中使用Policyfile工作流时,您的配置文件将被链接和上传。而在Chef中,'run-chef-client::client-run'是指向~/chef-repo/cookbooks/run-chef-client/compliance/profiles/client-run/的。

该recipe中的if...else语句会告知Chef去运行windows_task(如果平台是 Windows)或cron资源(如果平台是Linux和macOS)。而且,Windows Task需要用到用户、密码、以及以该用户的身份去运行的chef-client命令。最终,这两种资源都会将任务设置为每30分钟运行一次。

在保存了recipe后,我们便可以通过运行Chef Cookstyle,来检查其语法是否正确。如果检测到错误,它会使用-a标志来予以自动更正。

  1. $ cookstyle -a 

当结果报告“没有违规”时,Cookbook可被认为在语法上是正确的。

如果您只想将cookbook应用到一个节点,并不想添加合规性的话,则可以将cookbook上传至Chef服务器,引导单个节点,然后应用至cookbook。下面代码展示了该过程,不过,这往往认为是一种比较旧的工作流程:

  1. $ knife cookbook upload run-chef-client  
  2. $ knife cookbook list  
  3. chef-client       0.1.0  
  4. $ knife bootstrap ubuntuserver01.fakedomain.tld -U ubuntu -i ~/.ssh/id_rsa.pub --sudo -N ubuntuserver01 -r 'recipe[run-chef-client]' 

第 4 部分:Chef InSpec Profile

Chef InSpec Profiles提供了对于节点状态、及其合规性的洞察。也就是说,它会告诉您所应用的Cookbook是否处于期望状态。

当您从终端和Chef Automate Compliance仪表板处运行Chef-client命令时,Chef InSpec会执行复杂的任务,并通过CLI报告合规性数据。在完成该任务之后,您需要创建一个cookbook属性文件、以及一个包含有controls的配置文件。

创建属性文件

请在run-chef-clientCookbook文件夹的根目录中,运行如下命令,以在run-chef-clientCookbook文件夹中生成一个属性目录。同时,该文件夹也包含一个名为default.rb的文件:

  1. $ chef generate attribute default 

您可以编辑./attributes/default.rb,并添加如下内容:

  1. default['audit']['reporter'] = %w(chef-server-automate cli) 

默认的['audit']['reporter']条目会输出到Chef自动化和CLI处。

创建配置文件并编辑inspec.yml文件

我们可以使用Chef生成器,生成一个新的配置文件:

  1. $ inspec init profile [path-to-cookbook-root] [profile-name

例如:

  1. $ cd ~/chef-repo/cookbooks/run-chef-client/compliance/profiles/ 
  2. $ inspec init profile client-run 

上述命令会在新的./compliance/profiles/client-run目录中创建多个文件夹和文件,其中包括一个带有示例内容的controls/example.rb文件和一个inspec.yml文件。通过编辑inspec.yml,您可以按需修改其中的粗体项:

  1. name: client-run 
  2. title: Run the chef-client every 30 minutes 
  3. maintainer: John Tonello 
  4. copyright: John Tonello 
  5. copyright_email: jtonello@chef.lab 
  6. license: Apache-2.0 
  7. summary: Run the chef-client every 30 minutes 
  8. version: 0.1.0 
  9. supports: 
  10. platform: os 

创建InSpec配置文件

InSpec配置文件通过control,不但描述了待执行的每个测试,也向Chef-client表明了系统信息。在如下示例中,名为run-chef-client的control的impact为1.0,即具有最高优先级。接着,control会根据目标节点是否为Windows,来运行不同的测试。此处的describe条目会告知Chef去检查每个系统上的资源。

请将./compliance/profiles/client-run/controls/example.rb重命名为default.rb,并按如下方式进行编辑:

  1. control 'run-chef-client' do 
  2.   impact 0.7 
  3.   title 'Run the chef-client every 30 minutes' 
  4.   if os.windows? 
  5.     describe windows_task('run-chef-client') do 
  6.       it { should exist } 
  7.       it { should be_enabled } 
  8.     end 
  9.   else 
  10.     describe crontab do 
  11.       its('commands') { should include '/usr/bin/chef-client' } 
  12.       its('minutes') { should include '0,30' } 
  13.     end 
  14.   end 
  15. end 

第 5 部分:策略文件(Policyfiles)

我们在创建任何Chef cookbook时,都需要重点考虑它是否包含了受信任的代码。通过使用Policyfiles,您可以创建不可变的对象集-Cookbook、recipe、配置文件,并确保代码未以某种方式(意外或恶意)被更改。

我们在使用Chef生成器命令创建run-chef-client cookbook时,会在cookbook文件夹中自动创建一个Policyfile.rb文件。我们可以在编辑器中打开该文件,并按需进行修改(如下代码所示):

  1. # Policyfile.rb - Describe how you want Chef Infra Client to build your system. 
  2.  
  3. # A name describes what the system you're building with Chef does. 
  4. name 'run-chef-client' 
  5.  
  6. Where to find external cookbooks: 
  7. default_source :chef_repo, "~/chef-repo/cookbooks" do |s| 
  8.   s.preferred_for "run-chef-client" 
  9. end 
  10. default_source :supermarket 
  11. default_source :chef_server, 'https://automate.chef.lab/organization/lab 
  12.  
  13. # run_list: chef-client will run these recipes in the order specified. 
  14. run_list 'run-chef-client::default' 

其中的name条目指定了与Cookbook相符的Policyfile名称。而default_source可以是服务器的Chef、Chef Supermarket、或本地Chef repo。通过将:chef_repo与s.preferred_for一起使用,Chef将在Workstation的cookbooks文件夹中查找到内容,而不是Chef Supermarket之类的远程源,或Chef服务器本身。

而run_list条目则描述了Chef的Cookbook和路径。在此,run-chef-client::default指向的是~/chef-repo/cookbooks/run-chef-client/recipes/default.rb。您也可以添加多个run_list项,并通过创建配置文件,将多个不同的cookbook结合到一个不可变的Policyfile中。

完成之后,请继续在run-chef-client的Cookbook目录中运行cookstyle -a,并在下一步之前仔细检查其语法:

  1. $ cd ~/chef-repo/cookbooks/run-chef-client 
  2. $ cookstyle -a 

一次性上传Cookbook和配置文件

使用Policyfiles,您可以捆绑cookbook和合规性配置文件,并将它们上传到Chef服务器上。首先,请安装Policyfile.rb,以创建Policyfile.lock.json文件;然后请将该文件推送到Chef服务器处。

  1. $ cd ~/chef-repo/cookbooks/run-chef-client 
  2. $ chef install Policyfile.rb 
  3. $ Chef push prod Policyfile.lock.json 

该推送命令包含了Policyfile所属的策略组(Policy Group)。使用Chef,您可以为不同的目的创建不同的策略组,例如build、test和prod等。在本示例中,run-chef-client的cookbook和client-run配置文件会被添加到prod(生产环境)策略组。

有了./compliance/profiles/default/default.rb、inspec.yml和Policyfile.rb,你便可以使用Test Kitchen测试Cookbook和合规性控制,或直接跳到第 7 部分,在目标节点上应用run-chef-client的cookbook和配置。

用Knife上传Cookbook

您可以使用简单的Knife命令,将Cookbook上传到Chef服务器处,然后将一到多个Cookbook分配给每个节点。其对应的命令代码如下:

  1. $ knife upload cookbook run-chef-client 
  2. $ knife node run_list add ubuntu01 'recipe[run-chef-client'

其中,第一个命令是将Cookbook上传到Chef服务器;第二个指定run-chef-client的Cookbook在该节点上运行。

第 6 部分:Test Kitchen

Test Kitchen提供了诸如Docker、VirtualBox、Hyper-V、Amazon以及Azure云等多种方法,在本地测试Chef Cookbook和合规性代码。由于我们在本例中使用的是Docker,因此应当在Workstation上安装docker.io和docker -compose,并以非root的用户身份去运行。

我们在使用-k dokken标志去创建run-chef-clientcookbook时,会自动在cookbookkitchen.yml目录的根目录下创建一个文件。如下代码所示,该文件已经被配置为使用Dokken驱动程序(即为Docker)了。

  1. --- 
  2. driver: 
  3.   name: dokken 
  4.   privileged: true  # allows systemd services to start 
  5.  
  6. provisioner: 
  7.   name: dokken 
  8.  
  9. transport: 
  10.   name: dokken 
  11.  
  12. verifier: 
  13.   name: inspec 
  14.  
  15. platforms: 
  16.   - name: ubuntu-20.04 
  17.     driver: 
  18.       image: dokken/ubuntu-20.04 
  19.       pid_one_command: /bin/systemd 
  20.       intermediate_instructions: 
  21.         - RUN /usr/bin/apt-get update 
  22.  
  23.   - name: centos-8 
  24.     driver: 
  25.       image: dokken/centos-8 
  26.       pid_one_command: /usr/lib/systemd/systemd 
  27.  
  28. suites: 
  29.   - namedefault 
  30.     run_list: 
  31.       - recipe[chef-client::default
  32.     verifier: 
  33.       inspec_tests: 
  34.         - compliance/profiles/client-run/ 
  35.     attributes: 
  36.       audit: 
  37.         compliance_phase: false 
  38.         reporter: 'cli' 

类似虚拟机,上述kitchen.yml文件中的platform条目会拉取特殊的Docker镜像。而Chef团队已经为各种Linux操作系统准备了基本的容器,以便您为真实的环境开展测试,而无需额外的设置。

如果您想添加除了Ubuntu 20.04和CentOS 8之外的平台,则可以通过https://hub.docker.com/u/dokken,添加来自dokken镜像存储库里的条目。那里有着41个Dokken镜像可供测试。

您也可以编辑suites下的verifier部分,以指向InSpec配置文件的相对路径——compliance/profiles/client-run/。通过有效性验证,它将有助于避免运行时的各种错误:

  1. attributes: 
  2.    audit: 
  3.      compliance_phase: false 
  4.  reporter: 'cli' 

运行Test Kitchen

Test Kitchen的工作原理是:首先根据kitchen.yml平台条目中所描述的镜像,启动容器(如VM或云实例),接着部署Chef-client和Chef配置文件,然后部署Chef代码(被称为converging),并验证您的代码,最后关闭并销毁测试容器或实例。您可以通过导航到run-chef-clientCookbook目录的根目录,运行kitchen test,来一次性完成所有步骤:

  1. $ cd ~/chef-repo/cookbooks/run-chef-client 
  2. $ kitchen test 

上述简单的命令执行了创建、聚合、验证和销毁步骤,并能显示正在使用的Cookbook的终端内结果,以及合规阶段的扫描结果。您可以继续执行如下步骤:

  1. $ kitchen create 
  2. $ kitchen converge 
  3. $ kitchen verify 
  4. $ kitchen destroy 

通过单独运行上述步骤,您可以重新运行kitchen converge和kitchen verify,以快速迭代各种更改。

第 7 部分:引导节点

既然cookbook和配置文件已推送到了Chef服务器并进行了测试,下面,我们将引导(bootstrapping)第一个目标节点并执行如下任务:

  • 安装Chef-client
  • 创建配置文件--config.rb,并定义Chef Server和身份验证等详细信息
  • 按需安装可信任的自签名证书

Knife有一个内置的引导命令,可以一次性完成所有步骤。您可以在首个Chef Workstation的目标节点(应当能够默认支持ssh系统)上,引导如下命令:

  1. $ knife bootstrap ubuntu01.fakedomain.tld -U ubuntu -i ~/.ssh/id_rsa --sudo -N ubuntu01 --policy-group prod --policy-name run-chef-client 

该bootstrap命令允许您使用如下标志来定义各种细节:

  • ubuntu01.fakedomain.tld – 没有标志,只有被引导服务器的主机名或IP地址。
  • -U(或--connection-user)ubuntu – 连接到远程节点时用到的用户名。
  • -i ~/.ssh/id_rsa – ssh的身份验证密钥(而-P可用于密码验证)。
  • –-sudo – 以超级用户的权限执行命令。这通常是新软件安装和引导所必需的。
  • -N(或 --node-name)ubuntu01 – 向Chef服务器注册时使用的“节点名称”。
  • --policy-group prod --policy-name run-chef-client – 它会将run-chef-clientpolicy分配给节点。您可以使用-r 'recipe[run-chef-client]'在引导期间将Cookbook应用于节点上。在本例中,default.rb recipe被应用了上去。
  1. $ knife  bootstrap ssh://10.128.1.25 -U ubuntu -i ~/.ssh/id_rsa -N ubuntu01 -r 'recipe[run-chef-client]' 

Windows:

  1. $ Knife bootstrap winrm://10.128.1.26 -U Administrator -P mypassword -N windows10 -r 'recipe[run-chef-client]' 

同时,您也可以引导节点,而不是分配任何recipe或策略:

  1. $ Knife bootstrap ssh://10.128.1.25 -U ubuntu -i ~/.ssh/id_rsa -N ubuntu01 
  2. $ Knife bootstrap winrm://10.128.1.26 -U Administrator -P mypassword -N windows10 

如果您想在没有任何标志的情况下,引导一到多个节点,则可以稍后再设置策略,并分配run_lists或策略:

  1. $ Knife node policy set ubuntu01 prod run-chef-client 

或者:

  1. $ Knife node run_list add ubuntu01 'recipe[run-chef-client]' 

上面只是一些常用的选项。如果您想了解更多有关Knife命令的完整标志列表,只需使用-h标志,即可获得全量选项和用法示例的描述。

通过运行Chef-client来查看系统的状态和合规性

您可以通过knife,在Chef服务器列表中查询到ubuntu01节点:

  1. $ knife node list 
  2. ubuntu01 

如果使用策略或recipe的标志去引导节点,您将在CLI中看到进度显示和结果输出。当然,您也可以通过在该节点上运行的Chef-client,以查看到Chef代码的运行情况。虽然新的run-chef-client cookbook会每隔30分钟运行一次,但您可以通过以下几种方式,来手动执行:

使用knife运行Chef-client

knife工具允许您在任何远程节点上运行ssh和winrm选项。在Linux或macOS节点上,您可以通过如下方式,来运行命令sudo chef-client:

  1. $ knife ssh 'name:ubuntu01' 'sudo Chef-client' 

值得一提的是,如果目标主机是Windows系统,那么请使用winrm选项,并提供管理级别的用户名(-x)和密码(-P):

  1. $ knife winrm 'name:win10' 'chef-client' -x Administrator -P mypassword 

而对于支持ssh的节点,您可以进入shell,并从命令行运行sudo chef-client;在Windows上,则请使用RDP登录,以管理员身份打开PowerShell,然后运行chef-client。

不仅仅是策略即代码(Policy as Code)

由于本例中的ubuntu01节点已经被Chef Infra Client和Chef代码引导启动和运行,因此您可以通过如下命令,快速了解到其相关信息的摘要:

  1. knife node show ubuntu01 
  2. Node Name:   ubuntu01 
  3. Policy Name:  run-chef-client 
  4. Policy Group: prod 
  5. FQDN:        ubuntu01.fakedomain.tld 
  6. IP:       10.128.1.25 
  7. Run List:    recipe[run-chef-client::default
  8. Recipes:     run-chef-client::default 
  9. Platform:    ubuntu 20.04 
  10. Tags:  

您还可以使用Chef查询与该节点相关的各种系统信息。例如:

  1. $ knife search node 'name:ubuntu01' -a shells 
  2.  1 items found 
  3.  
  4. ubuntu01: 
  5.   shells: 
  6.     /bin/sh 
  7.     /bin/bash 
  8.     /bin/rbash 
  9.     /bin/dash 

上例只是搜索并返回了单个节点。当然,您也可以使用通配符,返回有关所有节点、或具有特定前缀或后缀的节点信息。例如:'name:*'(所有节点)、或'name:web*'(仅以“web”开头的节点)、或'name:*web'(仅以“web”结尾的节点)。除了名称以外,您还可以使用平台、或其他knife选项。例如:

  1. $ knife search node 'platform:ubuntu' -a shells 

这些信息从何而来?

即使您没有使用Chef对节点实施任何配置上的更改,Chef-client的每次运行也都会使用一个名为ohai的工具,来收集系统分析信息,并将它与运行结果一起发送回Chef服务器。这就意味着,您可以开箱即用地了解有关被管理系统的各种信息,并且能够随着更多服务器被引导,而轻松地查询到更多与Chef相关的信息,进而在recipe中使用此类信息,来操控各个节点。

以下便是从Chef中提取更多数据类型的示例:

  1. $ knife search node 'name:ubuntu01' -a memory.total -a filesystem.by_mountpoint./.percent_used -a ipaddress 
  2.  1 items found 
  3.  
  4. ubuntu01: 
  5.   filesystem.by_mountpoint./.percent_used: 13% 
  6.   ipaddress:                               10.128.1.133 
  7.   memory.total:                            524288kB  

在此搜索中,您可以查看有关磁盘的使用情况和内存的数据。Ohai允许您通过查询各种节点的信息,来自动检测诸如节点的公共IP地址等AWS的内部信息。对此,您可以将-a ec2.public_ipv4替换上例中的-a ipaddress。值得注意的是,即使您的节点是在没有应用run_list或策略的情况下被引导的,它也能够收集到数据。

关于属性的更多想法

我们在节点上对于Cookbook节点的任何修改,都可以被直接执行,而无需变动任何底层代码的属性。例如,您可以通过在节点上运行一个knife搜索,后跟-l标志,来查看某个节点的所有可用属性:

  1. $ knife search node 'name:ubuntu01' -l 
  2.  1 items found 
  3.  
  4.  Node Name:   ubuntu01 
  5. Policy Name:  run-chef-client 
  6. Policy Group: prod 
  7. FQDN:        ip-172-31-15-141.ec2.internal 
  8. IP:          3.85.154.118 
  9. Run List:    recipe[run-chef-client::default
  10. Recipes:     run-chef-client::default 
  11. Platform:    ubuntu 20.04 
  12. Tags:        
  13. Attributes: 
  14. tags: 
  15. … 
  16. chef_environment: prod 
  17. chef_guid:        4d10ca10-7658-4693-91b6-6ed25d881a1c 
  18. chef_packages: 
  19.   chef: 
  20.     chef_effortless: 
  21.     chef_root:       /opt/chef/embedded/lib/ruby/gems/3.0.0/gems/chef-17.5.22/li 
  22.     version:         17.5.22 
  23.   ohai: 
  24.     ohai_root: /opt/chef/embedded/lib/ruby/gems/3.0.0/gems/ohai-17.5.2/lib/ohai 
  25.     version:   17.5.2 
  26. cloud: 
  27.   local_hostname:    ip-172-31-15-141.ec2.internal 
  28.   local_ipv4:        172.31.15.141 
  29.   local_ipv4_addrs:  172.31.15.141 
  30.   provider:          ec2 
  31.   public_hostname:   ec2-3-85-154-118.compute-1.amazonaws.com 
  32.   public_ipv4:       3.85.154.118 
  33.   public_ipv4_addrs: 3.85.154.118 
  34. command: 
  35.   ps: ps -ef 
  36. cookbooks: 
  37.   run-chef-client: 
  38.     version: 0.1.0 
  39. counters: 
  40.   network: 
  41.     interfaces: 
  42.       eth0: 
  43.         rx: 
  44.           bytes:   396541197 
  45.           drop:    0 
  46.           errors:  0 
  47. … 

第 8 部分:扩展所学的内容

至此,您已经了解了Chef是如何协同Cookbook工作的。但是在实际应用中,您可能需要诸如:在webserver上打开443端口、或是在其他服务器上安装特定的应用等多种配置。因此,您可以使用多种方式,将多个Cookbook组合在一起,提供可应用于被定义节点组的基本Cookbook或配置文件。例如,Policyfiles就能够简便地将多个Cookbook、recipe和配置文件捆绑在一个对象中。而另一种方法则是将Cookbook依赖项添加到Cookbook的metadata.rb文件中,并在default.rbCookbook中使用include_recipe资源。

在metadata.rb中定义依赖项

每个cookbook都带有一个metadata.rb文件,可用于定义其名称、版本、以及各种依赖项。如下代码展示了,若想添加对另一个cookbook的依赖项,只需告知其您的run-chef-clientcookbook,以及向metadata.rb添加一个depends条目即可:

  1. name 'base_cookbook' 
  2. maintainer 'Jack Smith' 
  3. maintainer_email 'jsmith@example.com' 
  4. license 'Apache-2.0' 
  5. description 'Installs/Configures base_cookbooks' 
  6. long_description 'Installs/Configures base_cookbooks' 
  7. version '0.1.0' 
  8. chef_version '>= 16.0' 
  9.  
  10. depends 'run-chef-client' 

在recipes/default.rb中定义Cookbook依赖项

在第 3 部分中,我们了解到cookbook包含着一个default.rbrecipe,该recipe定义了在未指定其他特定recipe时,应执行哪些操作。而在该base_cookbook示例中,cookbook定义了与其相关的recipe。那么,如果您有第二个名为closed-ports的cookbook,它会在自己的cookbook和recipe目录中拥有自己的default.rb。而如果要在应用run-chef-clientcookbook时,调用closed-ports这一cookbook,您可以在修改后使用include_recipe资源,并读取cookbooks/run-chef-client/recipes/default.rb。

  1. # Cookbook:: base_cookbook 
  2. # Recipe:: default 
  3. # Copyright:: 2021, Jack Smith, All Rights Reserved. 
  4.  
  5. include_recipe 'closed-ports::default' 

通过这种方式,您可以创建基本的Cookbook,以包含多个recipe和Cookbook。而且,当您在使用Policyfiles时,它是固定不变的,并能够将一到多个cookbook中的所有内容捆绑到一起(包括已定义的任何InSpec配置文件)。可见,由于不需要旧的Chef技术来上传Cookbook依赖项,因此Policyfile方法应作为开发的首选。

更多资源

如果您在开始动手实践之前,想了解更多相关知识的话,请浏览如下链接:

原文标题:Chef 101: Getting Started With Automation,作者: John Tonello

【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】

责任编辑:华轩 来源: 51CTO
相关推荐

2010-11-08 09:15:46

Puppet入门教程自动化

2022-05-06 12:04:24

Ansible管理工具

2011-09-29 09:52:59

配置管理服务器Puppet

2013-08-30 14:30:59

系统自动化自动化配置SaltStack

2022-09-08 09:00:38

Ansible开源

2022-07-11 18:02:47

戴尔

2017-02-17 09:00:00

Linux管理员工具

2017-05-10 15:48:59

云平台云计算工具

2009-07-20 18:16:11

软件配置管理

2011-10-09 13:49:51

2020-07-01 08:45:00

开源开发工具

2016-09-01 21:33:21

服务器服务器虚拟化虚拟化

2010-05-13 17:46:51

IIS服务器

2014-07-14 15:45:08

服务器虚拟化

2012-10-29 16:45:07

CentOS 6.2Puppet

2012-12-06 11:31:40

虚拟化

2012-09-10 09:59:35

Windows 8远程服务器管理

2012-05-29 10:27:06

微软服务器

2018-02-23 09:04:33

虚拟化管理服务器

2020-04-29 09:42:51

Linux 服务器 工具
点赞
收藏

51CTO技术栈公众号