厨师 - 快速指南


厨师 - 概述

Chef是Opscode开发的一项开源技术。Opscode 联合创始人 Adam Jacob 被称为 Chef 创始人。该技术使用 Ruby 编码来开发基本构建块,例如食谱和食谱。Chef 用于基础设施自动化,有助于减少基础设施管理的手动和重复任务。

Chef 对于不同的构建块有自己的约定,这是管理和自动化基础设施所必需的。

为什么是厨师?

Chef 是一种配置管理技术,用于自动化基础设施配置。它是在Ruby DSL语言的基础上开发的。它用于简化配置和管理公司服务器的任务。它能够与任何云技术集成。

在 DevOps 中,我们使用 Chef 来部署和管理内部和云上的服务器和应用程序。

厨师的特点

以下是 Chef 最突出的特点 -

  • Chef 使用流行的 Ruby 语言创建特定于领域的语言。

  • Chef 不会对节点的当前状态做出假设。它使用其机制来获取机器的当前状态。

  • Chef 非常适合部署和管理云服务器、存储和软件。

厨师的优势

Chef 具有以下优势 -

  • 较低的进入门槛- 由于 Chef 使用本机 Ruby 语言进行配置,这是一种标准配置语言,任何有一定开发经验的人都可以轻松掌握。

  • 与云的出色集成- 使用刀具实用程序,它可以轻松地与任何云技术集成。对于希望在多云环境上分布其基础设施的组织来说,它是最好的工具。

厨师的缺点

Chef 的一些主要缺点如下 -

  • Chef 的巨大缺点之一是食谱的控制方式。它需要不断的照顾,这样工作的人就不会弄乱其他人的食谱。

  • 仅提供厨师独奏。

  • 从目前的情况来看,它只适合AWS云。

  • 如果一个人不熟悉Ruby,那么学习起来并不容易。

  • 仍然缺乏文档。

Chef 的关键构建模块

食谱

它可以被定义为用于管理基础设施的属性的集合。配方中存在的这些属性用于更改现有状态或设置特定的基础设施节点。它们在 Chef 客户端运行期间加载,并与节点(机器)的现有属性进行比较。然后它到达配方的节点资源中定义的状态。它是这本食谱的主要支柱。

食谱

食谱是食谱的集合。它们是上传到 Chef 服务器的基本构建块。当 Chef 运行时,它确保其中存在的配方将给定的基础设施达到配方中列出的所需状态。

资源

它是用于管理具有不同状态的基础设施的配方的基本组件。一个配方中可以有多个资源,这将有助于配置和管理基础设施。例如 -

  • package - 管理节点上的包

  • service - 管理节点上的服务

  • user - 管理节点上的用户

  • - 管理组

  • template - 使用嵌入式 Ruby 模板管理文件

  • Cookbook_file - 将文件从说明书中的文件子目录传输到节点上的某个位置

  • file - 管理节点上文件的内容

  • 目录- 管理节点上的目录

  • 执行- 在节点上执行命令

  • cron - 编辑节点上现有的 cron 文件

属性

它们基本上是设置。它们可以被认为是菜谱中想要使用的任何内容的键值对。可以应用多种不同类型的属性,其优先级高于节点操作的最终设置。

文件

它是说明书中的一个子目录,其中包含将放置在使用说明书的节点上的任何静态文件。然后可以将配方声明为将文件从该目录移动到最终节点的资源。

模板

它们与文件类似,但它们不是静态的。模板文件以 .ebr 扩展名结尾,这意味着它们包含嵌入式 Ruby。它们主要用于将属性值替换到文件中以创建将放置在节点上的最终文件版本。

元数据.rb

它用于管理有关包的元数据。这包括包的名称和详细信息等详细信息。它还包括诸如依赖性信息之类的内容,这些信息告诉该食谱需要操作哪些食谱。这使得 Chef 服务器能够正确构建节点的运行列表,并确保所有片段都正确传输。

默认食谱结构

C:\chef\cookbooks\nginx>tree 
Folder PATH listing for volume Local Disk 
Volume serial number is BE8B-6427 
C: ├───attributes 
├───definitions 
├───files 
│   └───default 
├───libraries 
├───providers 
├───recipes 
├───resources 
└───templates 
    └───default 

厨师 - 相关技术

以下是 Chef 相关技术的列表。

木偶

Puppet 提供了一种交付和操作软件的标准方式,无论它在哪里运行。它是 Linux、Unix 和 Windows 系统的自动化管理引擎,根据集中规范执行管理任务。

Puppet 的主要特点如下:

  • 实施具有统一配置的新系统。
  • 更新系统并升级安全和软件包。
  • 融入新功能并添加灵巧的功能。
  • 自定义配置以确保数据源的可用性。
  • 优化可用资源并最小化成本。
  • 简化角色,使团队能够专注于核心和富有成效的问题。
  • 鸟瞰可用的基础设施。

安西布尔

Ansible 是一个极其简单的 IT 自动化平台,可让您的应用程序和系统更易于部署。避免编写脚本或自定义代码来部署和更新应用程序 - 使用 SSH 以接近简单英语的语言实现自动化,无需在远程系统上安装代理。

Ansible 的主要特点如下:

  • 简单易学
  • 用Python编写
  • 无代理
  • 基于 YAML 的 Playbook
  • 安塞布尔星系

盐栈

SaltStack用于数据驱动的配置。它是一种建立在动态通信总线上的基础设施管理的新方法。它用于数据驱动的编排、任何基础设施的远程执行以及任何应用程序堆栈的配置管理。

织物

Fabric是一种基于Python的编程语言,它被开发为Python的API,需要在Python代码中导入才能配置和管理基础设施。

厨师 - 建筑

Chef 采用三层客户端服务器模型,其中食谱等工作单元是在 Chef 工作站上开发的。从命令行实用程序(例如 Knife),它们被上传到 Chef 服务器,并且架构中存在的所有节点都向 Chef 服务器注册。

厨师服务员

为了让 Chef 基础设施正常运行,我们需要按顺序设置多项内容。

在上面的设置中,我们有以下组件。

厨师工作站

这是开发所有配置的位置。Chef 工作站安装在本地计算机上。详细的配置结构将在本教程的后续章节中讨论。

厨师服务员

它作为 Chef 设置的集中工作单元,所有配置文件都在开发后上传。Chef 服务器有不同类型,有些是托管的 Chef 服务器,有些是内置的。

厨师节点

它们是将由 Chef 服务器管理的实际机器。所有节点都可以根据需要进行不同类型的设置。Chef客户端是所有节点的关键组件,它帮助建立Chef服务器和Chef节点之间的通信。Chef 节点的其他组件是 Ohai,它有助于获取给定时间点任何节点的当前状态。

Chef - 版本控制系统设置

使用版本控制系统是基础设施自动化的基本组成部分。版本控制系统有SVN、CVS、GIT等多种。由于 GIT 在 Chef 社区中很受欢迎,我们将使用 GIT 设置。

注意- 不要将基础设施构建为没有版本控制系统的代码。

在 Windows 上

步骤 1 - 从www.git-scm.org下载 Windows 安装程序并按照安装步骤操作。

步骤 2 - 注册 GitHub 上的中央存储库。

步骤 3 - 将 ssh 密钥上传到 GitHub 帐户,以便可以轻松地与其交互。有关 ssh 密钥的详细信息,请访问以下链接https://help.github.com/articles/generatingssh-keys

步骤 4 - 最后通过访问https://github.com/new并使用 Chef-repo 的名称在 github 帐户上创建一个存储库。

在实际开始编写一本说明书之前,可以在开发盒上设置一个初始 GIT 存储库,并克隆 Opscode 提供的空存储库。

步骤 1 - 下载 Opscode Chef 存储库空结​​构。

$ wget https://github.com/opscode/chef-repo/tarball/master

步骤 2 - 提取焦油球。

$ tar –xvf master

步骤 3 - 重命名目录。

$ mv opscode-chef-repo-2c42c6a/ chef-repo

步骤 4 - 将当前工作目录更改为 Chef repo。

$ cd chef-repo 

步骤 5 - 初始化一个新的 get 存储库。

$ git init. 

步骤 6 - 连接到 git hub 上的存储库。

$ git remote add origin git@github.com:vipin022/chef- 

步骤 7 - 将本地存储库推送到 github。

$ git add. 
$ git commit –m “empty repo structure added” 
$ git push –u origin maste

通过使用上述过程,您将获得一个空的 Chef 存储库。然后您可以开始开发食谱和食谱。完成后,您可以将更改推送到 GitHub。

厨师 - 工作站设置

Chef 遵循客户端-服务器架构的概念,因此为了开始使用 Chef,需要在工作站上设置 Chef 并在本地开发配置。稍后可以将其上传到Chef服务器,使它们在Chef节点上工作,这需要进行配置。

Opscode 提供了完全打包的版本,没有任何外部先决条件。这个完全打包的 Chef 称为综合安装程序

在 Windows 机器上

步骤 1 - 在计算机上下载 ChefDK 的安装 .msi 文件。

步骤 2 - 按照安装步骤并将其安装在目标位置。

设置将如以下屏幕截图所示。

窗口设置

ChefDK 路径变量

$ echo $PATH 
/c/opscode/chef/bin:/c/opscode/chefdk/bin: 

在 Linux 机器上

为了在Linux机器上进行设置,我们需要首先在机器上安装curl。

步骤 1 - 在计算机上安装了curl后,我们需要使用Opscode的综合Chef安装程序在工作站上安装Chef。

$ curl –L https://www.opscode.com/chef/install.sh | sudo bash 

步骤 2 - 在计算机上安装 Ruby。

步骤 3 - 将 Ruby 添加到路径变量。

$ echo ‘export PATH = ”/opt/chef/embedded/bin:$PATH”’ ≫ ~/.bash_profile && 
source ~/.bash_profile 

Omnibus Chef 将通过将/opt/ chef/embedded/bin目录添加到 .bash_profile 文件来将 Ruby 和所有必需的 Ruby gem 安装到/opt/chef/embedded中。

如果已安装 Ruby,则通过运行以下命令在计算机上安装 Chef Ruby gem。

$ gem install chef 

Chef - 客户端设置

为了使Chef节点与Chef服务器进行通信,需要在节点上安装Chef客户端。

厨师客户

这是 Chef 节点的关键组件之一,它从 Chef 服务器检索说明书并在节点上执行它们。它也称为 Chef 供应商。

这里,我们将使用 Vagrant 来管理 VM。Vagrant 还可以使用 Shell 脚本、Chef 和 Puppet 等配置器进行配置,以使 VM 进入所需状态。在我们的例子中,我们将使用 Vagrant 来管理虚拟机,并使用 VirtualBox 和 Chef 客户端作为配置程序。

步骤 1 - 从https://www.virtualbox.org/wiki/downlod下载并安装 VirtualBox

步骤 2 - 在http://downloads.vagrantup.com下载并安装 Vagrant

步骤 3 - 安装 Vagrant Omnibus 插件,使 Vagrant 能够在虚拟机上安装 Chef 客户端。

$ vagrant plugin install vagrant-omnibus 

创建和启动虚拟

步骤 1 - 我们可以从 Opscode vagrant 存储库下载所需的 Vagrant 框。从以下 URL 下载 opscode-ubuntu-12.04 框https://opscode-vmbento.s3.amazonaws.com/vagrant/opscode_ubuntu-12.04_provisionerless.box

步骤 2 - 获得 Vagrant 文件后,下载编辑 Vagrant 文件所需的路径。

vipin@laptop:~/chef-repo $ subl Vagrantfile 
Vagrant.configure("2") do |config| 
   config.vm.box = "opscode-ubuntu-12.04" 
   config.vm.box_url = https://opscode-vm-bento.s3.amazonaws.com/ 
   vagrant/opscode_ubuntu-12.04_provisionerless.box 
   config.omnibus.chef_version = :latest  
   config.vm.provision :chef_client do |chef| 
      chef.provisioning_path = "/etc/chef" 
      chef.chef_server_url = "https://api.opscode.com/ 
      organizations/<YOUR_ORG>" 
      chef.validation_key_path = "/.chef/<YOUR_ORG>-validator.pem"
      chef.validation_client_name = "<YOUR_ORG>-validator" 
      chef.node_name = "server" 
   end 
end 

在上面的程序中,您需要使用正确或所需的组织名称更新 <YOUR_ORG> 名称。

步骤 3 - 配置后的下一步是启动 vagrant box。为此,您需要移动到 Vagrant box 所在的位置并运行以下命令。

$ vagrant up

步骤 4 - 机器启动后,您可以使用以下命令登录机器。

$ vagrant ssh

在上面的命令中,vagrantfile是用Ruby域特定语言(DSL)编写的,用于配置vagrant虚拟机。

在 vagrant 文件中,我们有配置对象。Vagrant 将使用此配置对象来配置虚拟机。

Vagrant.configure("2") do |config| 
……. 
End

在配置块内,您将告诉 vagrant 使用哪个 VM 映像来启动节点。

config.vm.box = "opscode-ubuntu-12.04" 
config.vm.box_url = https://opscode-vm-bento.s3.amazonaws.com/ 
   vagrant/opscode_ubuntu-12.04_provisionerless.box

在下一步中,您将告诉 Vagrant 下载综合插件。

config.omnibus.chef_version = :latest

选择要启动的 VM 框后,配置如何使用 Chef 配置该框。

config.vm.provision :chef_client do |chef| 
….. 
End 

在其中,您需要设置有关如何将虚拟节点连接到 Chef 服务器的说明。您需要告诉 Vagrant 您需要将所有 Chef 内容存储在节点上的位置。

chef.provisioning_path = "/etc/chef" 

厨师 - 测试厨房设置

Test Kitchen 是 Chef 的集成测试框架。它允许编写测试配方,一旦使用说明书实例化并聚合虚拟机,测试配方将在虚拟机上运行。测试配方在该虚拟机上运行,​​可以验证一切是否按预期运行。

ChefSpec仅模拟 Chef 运行。测试厨房启动真实节点并在其上运行 Chef。

步骤 1 - 安装 test kitchen Ruby gem 和 test kitchen vagrant gem 以使 test kitchen 能够使用 vagrant 进行启动测试。

$ gem install kitchen 
$ gem install kitchen-vagrant 

步骤 2 - 设置测试厨房。这可以通过在 Cookbook 目录中创建.kitchen.yml来完成。

driver_plugin: vagrant 
driver_config: 
   require_chef_omnibus: true 
platforms: 
   - name: ubuntu-12.04 
   driver_config: 
      box: opscode-ubuntu-12.04 
      box_url: https://opscode-vm.s3.amazonaws.com/vagrant/opscode_ 
      ubuntu-12.04_provisionerless.box 
suites: 
   - name: default 
run_list: 
   - recipe[minitest-handler] 
   - recipe[my_cookbook_test] 
attributes: { my_cookbook: { greeting: 'Ohai, Minitest!'} } 

在上面的代码中,一部分定义了 vagrant 需要启动虚拟机,并且定义了您希望 Omnibus 在目标节点上安装 Chef。

第二部分定义您要测试食谱的平台。Vagrant 总是会创建和销毁新实例。您不必担心使用 Vagrant 文件启动的 vagrant VM 的副作用。

测试厨房可以被视为一个临时环境,有助于在类似于生产的临时环境中运行和测试食谱。启用测试厨房后,我们可以确保给定的代码片段在实际部署到测试、预生产和生产环境之前正常运行。许多组织在将烹饪书放入实际工作环境之前都会遵循测试厨房的这一特征。

测试厨房工作流程

以下是测试厨房工作流程涉及的步骤。

厨房工作流程

使用 Chef 创建食谱

使用以下代码创建食谱。

$ chef generate cookbook motd_rhel 
Installing Cookbook Gems: 

Compiling Cookbooks... 
Recipe: code_generator::cookbook
   * directory[C:/chef/cookbooks/motd_rhel] action create
      - create new directory C:/chef/cookbooks/motd_rhel
   
   * template[C:/chef/cookbooks/motd_rhel/metadata.rb] action create_if_missing
      - create new file C:/chef/cookbooks/motd_rhel/metadata.rb
      - update content in file C:/chef/cookbooks/motd_rhel/metadata.rb from none to 
      d6fcc2 (diff output suppressed by config)
   
   * template[C:/chef/cookbooks/motd_rhel/README.md] action create_if_missing
      - create new file C:/chef/cookbooks/motd_rhel/README.md
      - update content in file C:/chef/cookbooks/motd_rhel/README.md from none to 50deab
         (diff output suppressed by config)
   
   * cookbook_file[C:/chef/cookbooks/motd_rhel/chefignore] action create
      - create new file C:/chef/cookbooks/motd_rhel/chefignore
      - update content in file C:/chef/cookbooks/motd_rhel/chefignore from none to 15fac5
         (diff output suppressed by config)
   
   * cookbook_file[C:/chef/cookbooks/motd_rhel/Berksfile] action create_if_missing
      - create new file C:/chef/cookbooks/motd_rhel/Berksfile
      - update content in file C:/chef/cookbooks/motd_rhel/Berksfile from none to 9f08dc
         (diff output suppressed by config)
   
   * template[C:/chef/cookbooks/motd_rhel/.kitchen.yml] action create_if_missing
      - create new file C:/chef/cookbooks/motd_rhel/.kitchen.yml
      - update content in file C:/chef/cookbooks/motd_rhel/.kitchen.yml
         from none to 49b92b (diff output suppressed by config)
   
   * directory[C:/chef/cookbooks/motd_rhel/test/integration/default/serverspec]
      action create 
      - create new directory 
         C:/chef/cookbooks/motd_rhel/test/integration/default/serverspec
   
   * directory[C:/chef/cookbooks/motd_rhel/test/integration/helpers/serverspec]
      action create 
      - create new directory 
         C:/chef/cookbooks/motd_rhel/test/integration/helpers/serverspec
   
   * cookbook_file
      [C:/chef/cookbooks/motd_rhel/test/integration/helpers/serverspec/spec_helper.rb]
      action create_if_missing
      - create new file 
         C:/chef/cookbooks/motd_rhel/test/integration/helpers/serverspec/spec_helper.rb
      - update content in file
         C:/chef/cookbooks/motd_rhel/test/integration/helpers/serverspec/spec_helper.rb
            from none to d85df4 (diff output suppressed by config)
   
   * template
      [C:/chef/cookbooks/motd_rhel/test/integration/default/serverspec/defaul t_spec.rb]
      action create_if_missing
      - create new file
         C:/chef/cookbooks/motd_rhel/test/integration/default/serverspec/default_spec.rb
      - update content in file
         C:/chef/cookbooks/motd_rhel/test/integration/default/serverspec/default_spec.rb
            from none to 3fbdbd (diff output suppressed by config)
   
   * directory[C:/chef/cookbooks/motd_rhel/spec/unit/recipes] action create
      - create new directory C:/chef/cookbooks/motd_rhel/spec/unit/recipes
   
   * cookbook_file
      [C:/chef/cookbooks/motd_rhel/spec/spec_helper.rb] action create_if_missing
      - create new file C:/chef/cookbooks/motd_rhel/spec/spec_helper.rb
      - update content in file
         C:/chef/cookbooks/motd_rhel/spec/spec_helper.rb from none to 587075
            (diff output suppressed by config)
   
   * template
      [C:/chef/cookbooks/motd_rhel/spec/unit/recipes/default_spec.rb]
      action create_if_missing
      - create new file C:/chef/cookbooks/motd_rhel/spec/unit/recipes/default_spec.rb
      - update content in file
         C:/chef/cookbooks/motd_rhel/spec/unit/recipes/default_spec.rb
            from none to ff3b17 (diff output suppressed by config)
   
   * directory[C:/chef/cookbooks/motd_rhel/recipes] action create
      - create new directory C:/chef/cookbooks/motd_rhel/recipes
   
   * template[C:/chef/cookbooks/motd_rhel/recipes/default.rb] action create_if_missing
      - create new file C:/chef/cookbooks/motd_rhel/recipes/default.rb
      - update content in file
         C:/chef/cookbooks/motd_rhel/recipes/default.rb from none to c4b029
            (diff output suppressed by config) 
   
   * execute[initialize-git] action run 
      - execute git init . 
   
   * cookbook_file[C:/chef/cookbooks/motd_rhel/.gitignore] action create
      - create new file C:/chef/cookbooks/motd_rhel/.gitignore
      - update content in file C:/chef/cookbooks/motd_rhel/.gitignore from none to 33d469
         (diff output suppressed by config)
   
   * execute[git-add-new-files] action run
      - execute git add .
   
   * execute[git-commit-new-files] action run 
      - execute git commit -m "Add generated cookbook content" 

以下是作为上述代码的输出的创建的食谱结构。

结构

测试厨房配置文件

.kitchen.yaml 文件

driver: 
   name: vagrant 
provisioner: 
   name: chef_zero 
# verifier: 
# name: inspec 
# format: doc 
platforms: 
   - name: ubuntu-14.04 
suites: 
   - name: default 
   run_list: 
      - recipe[motd_rhel::default] 
   attributes: 

驱动程序- 它指定管理机器的软件。

Provisioner - 它提供了 Chef 如何运行的规范。我们使用 Chef_zero 是因为它能够模拟本地计算机上的 Chef 服务器环境。这允许使用节点属性和 Chef 服务器规范。

平台- 这指定了目标操作系统。

套件- 它定义了人们想要在虚拟环境上应用的内容。在这里,您定义了多个定义。它是您定义运行列表的位置,它指定要运行的配方以及我们需要运行的顺序。

按顺序运行命令

厨房清单

$ kitchen list 
Instance  Driver  Provisioner Verifier   Transport Last Action 
ubuntu-1404 Vagrant ChefZero   Busser       Ssh   <Not Created> 

厨房创造

$ kitchen create
-----> Starting Kitchen (v1.4.2)
-----> Creating <default-centos-72>...
      Bringing machine 'default' up with 'virtualbox' provider...
      ==> default: Box 'opscode-centos-7.2' could not be found.
         Attempting to find and install...
      default: Box Provider: virtualbox
      default: Box Version: >= 0
      ==> default: Box file was not detected as metadata. Adding it directly...
         ==> default: Adding box 'opscode-centos-7.2' (v0) for provider: virtualbox
         default: Downloading:
            https://opscode-vmbento.s3.amazonaws.com/vagrant/virtualbox/
            opscode_centos-7.1_chefprovisionerless.box[...]
         Vagrant instance <default-centos-72> created.
         Finished creating <default-centos-72> (3m12.01s).
         -----> Kitchen is finished. (3m12.60s)

厨房融合

$ kitchen converge 
-----> Converging <default-centos-72>...        
      Preparing files for transfer        
      Preparing dna.json        
      Resolving cookbook dependencies with Berkshelf 4.0.1...
      Removing non-cookbook files before transfer       
      Preparing validation.pem        
      Preparing client.rb 
-----> Chef Omnibus   installation detected (install only if missing)        
      Transferring files to <default-centos-72>       
      Starting Chef Client, version 12.6.0        
      resolving cookbooks for run list: ["motd_rhel::default"]
      Synchronizing Cookbooks: - motd_rhel (0.1.0)       
      Compiling Cookbooks...       Converging 1 resources        
      Recipe: motd_rhel::default        (up to date)         
      Running handlers:       Running handlers complete       
      Chef Client finished, 0/1 resources updated in 01 seconds        
      Finished converging <default-centos-72> (0m3.57s). 
      -----> Kitchen is finished. (0m4.55s) 

测试设置

Kitchen 登录用于测试测试虚拟机是否已正确配置。

$ kitchen login 
Last login: Thu Jan 30 19:02:14 2017 from 10.0.2.2 
hostname:  default-centos-72 
fqdn:      default-centos-72 
memory:    244180kBcpu count: 1 

最后退出

$ exit 
Logout 
Connection to 127.0.0.1 closed. 

破坏设置

$ Kitchen destroy 
-----> Starting Kitchen (v1.4.2) 
-----> Destroying <default-centos-72>...       
   ==> default: Forcing shutdown of VM...        
   ==> default: Destroying VM and associated drives...        
   Vagrant instance <default-centos-72> destroyed.        
   Finished destroying <default-centos-72> (0m4.94s). 
-----> Kitchen is finished. (0m5.93s) 

厨师 - 刀具设置

Knife 是 Chef 的命令行工具,用于与 Chef 服务器交互。人们用它来上传食谱和管理 Chef 的其他方面。它提供了本地计算机上的chefDK(Repo)和Chef服务器之间的接口。它有助于管理 -

  • Chef节点
  • 食谱
  • 食谱
  • 环境
  • 云资源
  • 云配置
  • 在 Chef 节点上的 Chef 客户端上安装

Knife 提供了一组命令来管理 Chef 基础设施。

引导命令

  • Knife Bootstrap [SSH_USER@]FQDN(选项)

客户端命令

  • Knife客户端批量删除正则表达式(选项)
  • Knife客户端创建CLIENTNAME(选项)
  • Knife客户端删除CLIENT(选项)
  • Knife客户端编辑CLIENT(选项)
  • 用法:C:/opscode/chef/bin/knife(选项)
  • Knife 客户端密钥删除 CLIENT KEYNAME(选项)
  • Knife 客户端密钥编辑 CLIENT KEYNAME(选项)
  • Knife 客户端密钥列表 CLIENT(选项)
  • Knife 客户端密钥显示 CLIENT KEYNAME(选项)
  • 刀客户列表(选项)
  • Knife客户端重新注册CLIENT(选项)
  • 刀客户端显示 CLIENT(选项)

配置命令

  • 刀配置(选项)
  • Knife 配置客户端目录

食谱命令

  • Knife Cookbook批量删除正则表达式(选项)
  • 刀食谱创建COOKBOOK(选项)
  • 刀食谱删除 COOKBOOK 版本(选项)
  • 刀食谱下载 COOKBOOK [版本](选项)
  • 刀食谱清单(选项)
  • 刀食谱元数据COOKBOOK(选项)
  • 来自文件的刀食谱元数据(选项)
  • 刀食谱显示 COOKBOOK [版本] [部分] [文件名](选项)
  • 刀食谱测试 [COOKBOOKS...](选项)
  • 小刀食谱上传[COOKBOOKS...](选项)

食谱网站命令

  • 刀食谱网站下载COOKBOOK [版本](选项)
  • Knife Cookbook 网站安装 COOKBOOK [版本](选项)
  • 刀食谱网站列表(选项)
  • 刀食谱网站搜索查询(选项)
  • 小刀食谱网站分享COOKBOOK [类别](选项)
  • 刀食谱网站显示COOKBOOK [版本](选项)
  • Knife食谱网站取消分享COOKBOOK

数据包命令

  • 刀数据包创建BAG [ITEM](选项)
  • 刀数据包删除BAG[ITEM](选项)
  • 刀具数据包编辑BAG ITEM(选项)
  • 来自文件 BAG FILE|FOLDER [FILE|FOLDER..] 的刀数据包(选项)
  • 刀具数据包清单(选项)
  • 刀数据包展示BAG[ITEM](选项)

环境命令

  • 刀具环境比较 [ENVIRONMENT..](选项)
  • 刀具环境创造环境(选项)
  • Knife 环境 删除 ENVIRONMENT(选项)
  • 刀具环境编辑ENVIRONMENT(选项)
  • FILE [FILE..] 文件中的 Knife 环境(选项)
  • 刀环境列表(选项)
  • 刀环境显示ENVIRONMENT(选项)

执行命令

  • Knife exec [脚本](选项)

帮助命令

  • 刀帮助 [列表|主题]

索引命令

  • 刀索引重建(选项)

节点命令

  • Knife节点批量删除REGEX(选项)
  • Knife节点创建NODE(选项)
  • Knife节点删除NODE(选项)
  • Knife节点编辑NODE(选项)
  • Knife节点环境设置NODE ENVIRONMENT
  • 文件 FILE 中的 Knife 节点(选项)
  • 刀节点列表(选项)
  • Knife节点run_list添加[NODE] [ENTRY[,ENTRY]](选项)
  • Knife 节点 run_list 删除 [NODE] [ENTRY[,ENTRY]] (选项)
  • Knife 节点 run_list 设置 NODE ENTRIES(选项)
  • 刀节点显示NODE(选项)

OSC命令

  • Knife osc_user 创建用户(选项)
  • Knife osc_user 删除用户(选项)
  • Knife osc_user 编辑用户(选项)
  • Knife osc_user 列表(选项)
  • Knife osc_user 重新注册用户(选项)
  • Knife osc_user 显示用户(选项)

基于路径的命令

  • 刀删除 [PATTERN1 ... PATTERNn]
  • 刀依赖 PATTERN1 [PATTERNn]
  • 刀差异模式
  • 刀下载图案
  • 刀编辑 [PATTERN1 ... PATTERNn]
  • 刀具列表 [-dfR1p] [PATTERN1 ... PATTERNn]
  • 刀秀 [PATTERN1 ... PATTERNn]
  • 刀上传图案
  • 刀 xargs [命令]

原始命令

  • 刀原料REQUEST_PATH

配方命令

  • 刀具配方列表[图案]

角色命令

  • 刀角色批量删除REGEX(选项)
  • 刀角色创建ROLE(选项)
  • 刀角色删除ROLE(选项)
  • 刀角色编辑ROLE(选项)
  • 刀角色 env_run_list 添加 [ROLE] [ENVIRONMENT] [ENTRY[,ENTRY]] (选项)
  • 刀角色 env_run_list 清除 [角色] [环境]
  • 刀角色 env_run_list 删除 [角色] [环境] [条目]
  • 刀角色 env_run_list 替换 [ROLE] [ENVIRONMENT] [OLD_ENTRY] [NEW_ENTRY]
  • 刀角色 env_run_list 设置 [角色] [环境] [条目]
  • 刀的角色来自文件 FILE [FILE..](选项)
  • 刀角色列表(选项)
  • 刀角色 run_list 添加 [ROLE] [ENTRY[,ENTRY]] (选项)
  • 刀角色 run_list 清除 [ROLE]
  • 刀角色 run_list 删除 [ROLE] [ENTRY]
  • 刀角色 run_list 替换 [ROLE] [OLD_ENTRY] [NEW_ENTRY]
  • 刀角色 run_list set [ROLE] [ENTRIES]
  • 刀角色展示ROLE(选项)

服务命令

  • 刀发球(选项)

SSH 命令

  • Knife ssh 查询命令(选项)

SSL 命令

  • Knife ssl 检查 [URL](选项)
  • Knife ssl 获取 [URL](选项)

状态命令

  • 刀具状态查询(选项)

标签命令

  • 刀标签创建节点标签...
  • 刀标签删除节点标签...
  • 刀标签列表节点

用户命令

  • Knife 用户创建 USERNAME DISPLAY_NAME FIRST_NAME LAST_NAME 电子邮件密码(选项)
  • Knife用户删除USER(选项)
  • 刀用户编辑USER(选项)
  • Knife 用户密钥创建用户(选项)
  • Knife 用户密钥删除 USER KEYNAME(选项)
  • Knife 用户密钥编辑 USER KEYNAME(选项)
  • 刀具用户键列表 USER(选项)
  • Knife 用户密钥显示 USER KEYNAME(选项)
  • 刀具用户列表(选项)
  • Knife用户重新注册USER(选项)
  • 刀用户显示USER(选项)

刀具设置

为了设置 Knife,需要移动到.chef目录并在 Chef 存储库中创建一个Knife.rb ,它告诉 Knife 有关配置详细信息。这将有一些细节。

current_dir = File.dirname(__FILE__) 
log_level                :info 
log_location             STDOUT 
node_name                'node_name' 
client_key               "#{current_dir}/USER.pem" 
validation_client_name   'ORG_NAME-validator' 
validation_key           "#{current_dir}/ORGANIZATION-validator.pem" 
chef_server_url          'https://api.chef.io/organizations/ORG_NAME' 
cache_type               'BasicFile' 
cache_options( :path =>  "#{ENV['HOME']}/.chef/checksums" ) 
cookbook_path            ["#{current_dir}/../cookbooks"] 

在上面的代码中,我们使用托管的 Chef 服务器,它使用以下两个密钥。

validation_client_name   'ORG_NAME-validator' 
validation_key           "#{current_dir}/ORGANIZATION-validator.pem" 

在这里,knife.rb告诉knife要使用哪个组织以及在哪里可以找到私钥。它告诉 Knife 在哪里可以找到用户的私钥。

client_key               "#{current_dir}/USER.pem" 

下面的代码行告诉 Knife 我们正在使用托管服务器。

chef_server_url        'https://api.chef.io/organizations/ORG_NAME' 

使用 Knife.rb 文件,验证器 Knife 现在可以连接到您组织的托管 Opscode。

厨师 - 独奏设置

Chef-Solo 是一个在本地运行的开源工具,允许使用 Chef 说明书配置来宾计算机,而无需进行任何 Chef 客户端和服务器配置的复杂化。它有助于在自行创建的服务器上执行食谱。

在本地计算机上运行 Chef-Solo 之前,需要在本地计算机上安装以下两个文件。

  • Solo.rb - 该文件告诉 Chef 在哪里可以找到食谱、角色和数据包。

  • Node.json - 如果需要,此文件设置运行列表和任何特定于节点的属性。

solo.rb 配置

以下是配置solo.rb的步骤。

步骤 1 - 在 Chef 存储库中创建一个 alone.rb 文件。

current_dir       = File.expand_path(File.dirname(__FILE__)) 
file_cache_path   "#{current_dir}" 
cookbook_path     "#{current_dir}/cookbooks" 
role_path         "#{current_dir}/roles" 
data_bag_path     "#{current_dir}/data_bags" 

步骤 2 - 将文件添加到 git 存储库。

$ git add solo.rb 

步骤 3 - 在 Chef 存储库中创建一个包含以下内容的 node.json 文件。

{ 
   "run_list": [ "recipe[ntp]" ] 
} 

步骤 4 - 使用 Knife 在 Chef 存储库中获取 NTP 食谱。

vipin@laptop:~/chef-repo $ knife cookbook site install ntp 
Installing ntp to /Users/mma/work/chef-repo/cookbooks 
…TRUNCATED OUTPUT… 
Cookbook ntp version 1.3.0 successfully installed 

步骤 5 - 将 node.json 文件添加到 Git。

$ git add node.json 

步骤 6 - 提交并将文件推送到 git 存储库。

vipin@laptop:~/chef-repo $ git commit -m "initial setup for Chef Solo" 
vipin@laptop:~/chef-repo $ git push 
Counting objects: 4, done. 
Delta compression using up to 4 threads. 
...TRUNCATED OUTPUT... 
To git@github.com:mmarschall/chef-repo.git 
b930647..5bcfab6 master -> master 

在节点上运行 Cookbook

步骤 1 - 登录到想要配置 Chef-Solo 的节点。

步骤 2 - 在机器上克隆 Chef 存储库。

$ git clone $URL_PATH 

步骤 3 - cd 到 Chef 存储库。

$ cd chef-repo 

最后,运行 Chef-Solo 来聚合节点 -

$ sudo chef-solo -c solo.rb -j node.json 
[2017-20-08T22:54:13+01:00] INFO: *** Chef 11.0.0 *** 
[2017-20-08T22:54:13+01:00] INFO: Setting the run_list to 
["recipe[ntp]"] from JSON 
...TRUNCATED OUTPUT... 
[2012-12-08T22:54:16+01:00] INFO: Chef Run complete in 2.388374 
seconds 
[2012-12-08T22:54:16+01:00] INFO: Running report handlers 

olo.rb配置 Chef-Solo 在当前目录(Chef 存储库)中查找其食谱、角色和数据包。

Chef-Solo从 JSON 文件获取其节点配置。在我们的示例中,我们将其称为node.json。如果您要管理多个服务器,则每个节点都需要一个单独的文件。然后,Chef-Solo 仅根据在solo.rb 和node.json 中找到的配置数据执行Chef 运行。

厨师 - 食谱

Cookbook 是 Chef 的基本工作单元,由与工作单元相关的所有详细信息组成,能够修改配置为 Chef 基础设施上的节点的任何系统的配置和状态。食谱可以执行多项任务。食谱包含有关节点所需状态的值。这是通过使用所需的外部库在 Chef 中实现的。

食谱的关键组成部分

  • 食谱
  • 元数据
  • 属性
  • 资源
  • 模板
  • 图书馆
  • 任何其他有助于创建系统的事情

创建一本食谱

有两种方法可以动态创建食谱。

  • 使用厨师命令
  • 使用刀具实用程序

使用 Chef 命令

要使用 Chef 命令创建空食谱,请运行以下命令。

C:\Users\vipinkumarm>chef generate cookbook <Cookbook Name> 
C:\Users\vipinkumarm>chef generate cookbook VTest
Installing Cookbook Gems:

Compiling Cookbooks...
Recipe: code_generator::cookbook
   * directory[C:/Users/vipinkumarm/VTest] action create
      - create new directory C:/Users/vipinkumarm/VTest
   
   * template[C:/Users/vipinkumarm/VTest/metadata.rb] action create_if_missing
      - create new file C:/Users/vipinkumarm/VTest/metadata.rb
      - update content in file C:/Users/vipinkumarm/VTest/metadata.rb 
         from none to 4b9435 (diff output suppressed by config)

   * template[C:/Users/vipinkumarm/VTest/README.md] action create_if_missing
      - create new file C:/Users/vipinkumarm/VTest/README.md
      - update content in file C:/Users/vipinkumarm/VTest/README.md 
         from none to 482077 (diff output suppressed by config)

   * cookbook_file[C:/Users/vipinkumarm/VTest/chefignore] action create
      - create new file C:/Users/vipinkumarm/VTest/chefignore
      - update content in file C:/Users/vipinkumarm/VTest/chefignore 
         from none to 15fac5 (diff output suppressed by config)
   
   * cookbook_file[C:/Users/vipinkumarm/VTest/Berksfile] action create_if_missing
      - create new file C:/Users/vipinkumarm/VTest/Berksfile
      - update content in file C:/Users/vipinkumarm/VTest/Berksfile 
         from none to 9f08dc (diff output suppressed by config)

   * template[C:/Users/vipinkumarm/VTest/.kitchen.yml] action create_if_missing
      - create new file C:/Users/vipinkumarm/VTest/.kitchen.yml
      - update content in file C:/Users/vipinkumarm/VTest/.kitchen.yml 
         from none to 93c5bd (diff output suppressed by config)

   * directory[C:/Users/vipinkumarm/VTest/test/integration/default/serverspec]
      action create
      - create new directory
         C:/Users/vipinkumarm/VTest/test/integration/default/serverspec
   
   * directory[C:/Users/vipinkumarm/VTest/test/integration/helpers/serverspec]
      action create
      - create new directory
         C:/Users/vipinkumarm/VTest/test/integration/helpers/serverspec
   
   * cookbook_file
      [C:/Users/vipinkumarm/VTest/test/integration/helpers/serverspec/sp ec_helper.rb]
      action create_if_missing
      - create new file
         C:/Users/vipinkumarm/VTest/test/integration/helpers/serverspec/spec_helper.rb
      - update content in file
         C:/Users/vipinkumarm/VTest/test/integration/helpers/serverspec/spec_helper.rb
         from none to d85df4 (diff output suppressed by config)
   
   * template
      [C:/Users/vipinkumarm/VTest/test/integration/default/serverspec/default _spec.rb]
      action create_if_missing
      - create new file
         C:/Users/vipinkumarm/VTest/test/integration/default/serverspec/default_spec.rb
      - update content in file
         C:/Users/vipinkumarm/VTest/test/integration/default/serverspec/default_spec.rb
         from none to 758b94 (diff output suppressed by config)
   
   * directory[C:/Users/vipinkumarm/VTest/spec/unit/recipes] action create
      - create new directory C:/Users/vipinkumarm/VTest/spec/unit/recipes
   
   * cookbook_file[C:/Users/vipinkumarm/VTest/spec/spec_helper.rb]
      action create_if_missing
      - create new file C:/Users/vipinkumarm/VTest/spec/spec_helper.rb
      - update content in file C:/Users/vipinkumarm/VTest/spec/spec_helper.rb
         from none to 587075 (diff output suppressed by config)

   * template[C:/Users/vipinkumarm/VTest/spec/unit/recipes/default_spec.rb]
      action create_if_missing
      - create new file C:/Users/vipinkumarm/VTest/spec/unit/recipes/default_spec.rb
      - update content in file 
         C:/Users/vipinkumarm/VTest/spec/unit/recipes/default_spec.rb
         from none to 779503 (diff output suppressed by config)
      - create new file C:/Users/vipinkumarm/VTest/recipes/default.rb
      - update content in file C:/Users/vipinkumarm/VTest/recipes/default.rb
         from none to 8cc381 (diff output suppressed by config)

   * cookbook_file[C:/Users/vipinkumarm/VTest/.gitignore] action create
      - create new file C:/Users/vipinkumarm/VTest/.gitignore
      - update content in file C:/Users/vipinkumarm/VTest/.gitignore from none to 33d469
         (diff output suppressed by config)

将在目录中创建名为 VTest 的说明书结构,以下是其结构。

测试

使用刀具实用程序

使用以下命令使用 Knife 实用程序创建食谱。

C:\Users\vipinkumarm\VTest>knife cookbook create VTest2 
WARNING: No knife configuration file found 
** Creating cookbook VTest2 in C:/chef/cookbooks 
** Creating README for cookbook: VTest2 
** Creating CHANGELOG for cookbook: VTest2 
** Creating metadata for cookbook: VTest2 

以下是食谱的结构。

食谱

Chef - 食谱依赖项

定义说明书依赖关系的功能有助于管理说明书。当我们想要在其他食谱中使用一本食谱的功能时,可以使用此功能。

例如,如果想要编译 C 代码,则需要确保安装了编译所需的所有依赖项。为此,可能有单独的食谱可以执行此类功能。

当我们使用厨师服务器时,我们需要知道说明书中的此类依赖关系,这些依赖关系应该在说明书元数据文件中减速。该文件位于说明书目录结构的顶部。它向 Chef 服务器提供提示,有助于在正确的节点上部署说明书。

metadata.rb 文件的特点

  • 位于食谱目录结构的顶部。

  • 使用knife命令将菜谱上传到Chef服务器时进行编译。

  • 使用 Knife Cookbook 元数据子命令编译。

  • 运行刀食谱创建命令时自动创建。

配置metadata.rb

以下是元数据文件的默认内容。

元数据

默认内容

厨师 - 角色

Chef 中的角色是对节点进行分组的逻辑方式。典型的情况是具有 Web 服务器、数据库服务器等角色。人们可以为所有节点设置自定义运行列表并覆盖角色内的属性值。

创建角色

vipin@laptop:~/chef-repo $ subl roles/web_servers.rb 
name "web_servers" 
description "This role contains nodes, which act as web servers" 
run_list "recipe[ntp]" 
default_attributes 'ntp' => { 
   'ntpdate' => { 
      'disable' => true 
   } 
}

创建角色后,我们需要上传到 Chef 服务器。

将角色上传到 Chef 服务器

vipin@laptop:~/chef-repo $ knife role from file web_servers.rb 

现在,我们需要为名为服务器的节点分配角色。

为节点分配角色

vipin@laptop:~/chef-repo $ knife node edit server 
"run_list": [ 
   "role[web_servers]" 
] 
Saving updated run_list on node server 

运行 Chef 客户端

user@server:~$ sudo chef-client 
...TRUNCATED OUTPUT... 
[2013-07-25T13:28:24+00:00] INFO: Run List is [role[web_servers]] 
[2013-07-25T13:28:24+00:00] INFO: Run List expands to [ntp] 
...TRUNCATED OUTPUT... 

怎么运行的

  • 在 Chef 存储库的 Roles 文件夹内的 Ruby 文件中定义角色。

  • 角色由名称和描述属性组成。

  • 角色由特定于角色的运行列表和特定于角色的属性设置组成。

  • 每个在其运行列表中具有角色的节点都会将该角色的运行列表精确到其自己的运行列表中。

  • 角色运行列表中的所有配方都将在该节点上执行。

  • 将使用 Knife Role from file 命令将该角色上传到 Chef 服务器。

  • 该角色将被添加到节点运行列表中。

  • 在运行列表中具有该角色的节点上运行 Chef 客户端将执行该角色中列出的所有配方。

厨师 - 环境

Chef 帮助执行特定于环境的配置。拥有一个单独的开发、测试和生产环境始终是一个好主意。

Chef 能够将节点分组到单独的环境中,以支持有序的开发流程。

创造环境

可以使用刀具实用程序来动态创建环境。以下命令将打开 Shell 的默认编辑器,以便可以修改环境定义。

vipin@laptop:~/chef-repo $ knife environment create book { 
   "name": "book", 
   "description": "", 
   "cookbook_versions": { 
   }, 
   "json_class": "Chef::Environment", 
   "chef_type": "environment", 
   "default_attributes": { 
   }, 
   "override_attributes": { 
   } 
} 
Created book 

测试创建的环境

vipin@laptop:~/chef-repo $ knife environment list 
_default 
book 

所有环境的列表节点

vipin@laptop:~/chef-repo $ knife node list 
my_server 

_默认环境

每个组织将始终从至少一个称为默认环境的环境开始,该环境始终可供 Chef 服务器使用。无论如何都无法修改默认环境。任何类型的更改都只能适应我们创建的自定义环境。

环境属性

可以在环境中定义属性,然后用于覆盖节点中的默认设置。当 Chef 客户端运行时,会将这些属性与节点中已存在的默认属性进行比较。当环境属性优先于默认属性时,Chef 客户端将在每个节点上运行 Chef 客户端时应用这些设置和值。

环境属性只能是default_attribute 或override_attribute。它不可能是一个普通的属性。可以使用 default_attribute 或 override_attribute 方法。

属性类型

默认- 默认属性始终在每个 Chef 客户端运行开始时重置,并且具有最低的属性优先级。

覆盖- 覆盖属性始终在每个 Chef 客户端运行开始时重置,并且具有比默认、force_default 和正常更高的属性优先级。覆盖属性通常在配方中定义,但也可以在角色或环境的属性文件中指定。

应用属性的顺序

订单属性

Chef - Chef-Client 作为守护进程

将 Chef-Client 作为守护进程运行有助于了解任何时间点所有节点的状态。这有助于随时运行 Chef-Client。

先决条件

该节点应向 Chef 服务器注册,并且应运行 Chef-Client,且不会出现任何错误。

守护进程模式下的 Chef-Client

以守护进程模式启动 Chef-Client,每 30 分钟运行一次。

user@server:~$ sudo chef-client -i 1800 

在上面的代码中,-i允许在所需节点上以守护进程模式运行 Chef-Client,1800 秒定义 Chef-Client 守护进程应每 30 分钟运行一次。

验证守护进程运行

验证 Chef-Client 是否作为守护进程运行。

user@server:~$ ps auxw | grep chef-client 

上面的命令将 grep Chef-Client 正在运行的守护进程。

其他方法

我们可以将 Chef-Client 作为cron 作业运行,而不是作为守护进程运行。

user@server:~$ subl /etc/cron.d/chef_client 
PATH=/usr/local/bin:/usr/bin:/bin 
# m h dom mon dow user command 
*/15 * * * * root chef-client -l warn | grep -v 'retrying [1234]/5 in' 

上述 cron 作业将每 15 分钟运行一次。

厨师 - Chef-Shell

写厨师食谱总是很困难。这使得事情变得更加困难,因为将它们上传到 Chef 服务器、配置流浪虚拟机、检查它们如何失败、冲洗和重复的反馈周期很长。如果我们在一次完成所有这些繁重的工作之前可以尝试测试一些片段或食谱,那就会更容易。

Chef 附带了 Chef-Shell,它本质上是与 Chef 的交互式 Ruby 会话。在 Chef-Shell 中,我们可以创建 -

  • 属性
  • 写食谱
  • 初始化 Chef 运行

它用于动态评估菜谱的各个部分,然后将其上传到 Chef 服务器并在节点上执行完整的菜谱。

运行外壳

步骤 1 - 以独立模式运行 Chef-Shell。

mma@laptop:~/chef-repo $ chef-shell 
loading configuration: none (standalone chef-shell session) 
Session type: standalone 
Loading...[2017-01-12T20:48:01+01:00] INFO: Run List is [] 
[2017-01-12T20:48:01+01:00] INFO: Run List expands to [] 
done. 
This is chef-shell, the Chef Shell. 
Chef Version: 11.0.0 
http://www.opscode.com/chef 
http://wiki.opscode.com/display/chef/Home 
run `help' for help, `exit' or ^D to quit. 
Ohai2u mma@laptop!  
chef > 

步骤 2 - 在 Chef-Shell 中切换到属性模式

  • 厨师 > 属性模式

步骤 3 - 设置属性值。

  • Chef:attributes > set[:title] = "厨师食谱"

    • 《厨师食谱》

  • 厨师:属性>退出

    • :属性

  • 厨师 >

步骤 4 - 切换到食谱模式。

  • 厨师 > 食谱模式

步骤 5 - 创建文件资源。

chef:recipe > file "/tmp/book.txt" do 
chef:recipe > content node.title 
chef:recipe ?> end  

=> <file[/tmp/book.txt] @name: "/tmp/book.txt" @noop: nil @ 
before: nil @params: {} @provider: Chef::Provider::File @allowed_ 
actions: [:nothing, :create, :delete, :touch, :create_if_missing] 
@action: "create" @updated: false @updated_by_last_action: false 
@supports: {} @ignore_failure: false @retries: 0 @retry_delay: 
2 @source_line: "(irb#1):1:in `irb_binding'" @elapsed_time: 0 @ 
resource_name: :file @path: "/tmp/book.txt" @backup: 5 @diff: nil 
@cookbook_name: nil @recipe_name: nil @content: "Chef Cookbook">   

chef:recipe > 

步骤 6 - 开始运行 Chef 以创建具有给定内容的文件。

  • 厨师:食谱 > run_chef

[2017-01-12T21:07:49+01:00] INFO: Processing file[/tmp/book.txt] 
action create ((irb#1) line 1) 
--- /var/folders/1r/_35fx24d0y5g08qs131c33nw0000gn/T/cheftempfile20121212- 
11348-dwp1zs 2012-12-12 21:07:49.000000000 
+0100 
+++ /var/folders/1r/_35fx24d0y5g08qs131c33nw0000gn/T/chefdiff20121212- 
11348-hdzcp1 2012-12-12 21:07:49.000000000 +0100 
@@ -0,0 +1 @@ 
+Chef Cookbook 
\ No newline at end of file 
[2017-01-12T21:07:49+01:00] INFO: entered create 
[2017-01-12T21:07:49+01:00] INFO: file[/tmp/book.txt] created file 
/tmp/book.txt 

怎么运行的

  • Chef-Shell 从交互式 Ruby (IRB) 会话开始,该会话增强了一些特定功能。

  • 它提供了诸如attributes_mode和interactive_mode之类的模式。

  • 它有助于编写命令,这些命令写在菜谱或食谱中。

  • 它以交互模式运行一切。

我们可以以三种不同的模式运行 Chef-Shell:独立模式、客户端模式独奏模式

  • 独立模式- 这是默认模式。未加载任何食谱,并且运行列表为空。

  • 客户端模式- 在这里,厨师外壳充当厨师客户端。

  • 独奏模式- 在这里,厨师外壳充当厨师独奏客户端。

厨师 - 测试食谱

如果食谱直接部署并在生产服务器上运行,则食谱在生产中很有可能崩溃。防止这种情况发生的最佳方法是在设置环境中测试说明书。

以下是测试步骤。

步骤 1 - 使用以下命令安装说明书。

vipin@laptop:~/chef-repo $ knife cookbook site install <cookbook name> 

步骤 2 - 在工作菜谱上运行刀菜谱测试命令。

vipin@laptop:~/chef-repo $ knife cookbook test VTest  
checking ntp 
Running syntax check on ntp 
Validating ruby files 
Validating templates

步骤 3 - 破坏食谱中的某些内容并再次测试。

vipin@laptop:~/chef-repo $ subl cookbooks/VTest/recipes/default.rb 
... 
[ node['ntp']['varlibdir'] 
node['ntp']['statsdir'] ].each do |ntpdir| 
   directory ntpdir do 
      owner node['ntp']['var_owner'] 
      group node['ntp']['var_group'] 
      mode 0755 
   end 
end

步骤 4 - 再次运行刀测试命令。

vipin@laptop:~/chef-repo $ knife cookbook test ntp 
checking ntp 
Running syntax check on ntp 
Validating ruby files 
FATAL: Cookbook file recipes/default.rb has a ruby syntax error: 
FATAL: cookbooks/ntp/recipes/default.rb:25: syntax error, 
unexpected tIDENTIFIER, expecting ']' 
FATAL: node['ntp']['statsdir'] ].each do |ntpdir| 
FATAL: ^ 
FATAL: cookbooks/ntp/recipes/default.rb:25: syntax error, 
unexpected ']', expecting $end 
FATAL: node['ntp']['statsdir'] ].each do |ntpdir| 
FATAL: 

工作方式

Knife 说明书测试对说明书中的所有 Ruby 文件以及所有 ERB 模板执行 Ruby 语法检查。它循环遍历 Ruby 文件并对每个文件运行 Ruby –c 。Ruby –c检查脚本的语法并退出而不运行它。

在检查完所有 Ruby 文件后,knife Cookbook 测试将检查所有 ERB 模板和管道,即由–x到 Ruby –c创建的冗余版本。

局限性

Knife Cookbook 测试仅对 Ruby 文件和 ERB 模板进行简单的语法检查。我们可以使用 ChefSpec 和测试厨房进行全面测试。

厨师 - 美食评论家

毫无问题地写出好的烹饪书是一项相当困难的任务。但有一些方法可以帮助识别陷阱。可以在《Chef Cookbook》中进行标记。Foodcritic 是最好的归档方式之一,它试图找出烹饪书的逻辑和风格可能存在的问题。

美食评论家设置

步骤 1 - 添加 Foodcritic gem。

vipin@laptop:~/chef-repo $ subl Gemfile 
source 'https://rubygems.org' 
gem 'foodcritic', '~>2.2.0'

步骤 2 - 安装 gem。

vipin@laptop:~/chef-repo $ bundle install 
Fetching gem metadata from https://rubygems.org/ 
...TRUNCATED OUTPUT... 
Installing foodcritic (2.2.0) 

美食评论家宝石

步骤 1 - 在食谱上运行 Foodcritic。

vipin@laptop:~/chef-repo $ foodcritic ./cookbooks/<Cookbook Name> 
FC002: Avoid string interpolation where not required: ./cookbooks/ 
mysql/attributes/server.rb:220 
...TRUNCATED OUTPUT... 
FC024: Consider adding platform equivalents: ./cookbooks/<Cookbook Name>/ 
recipes/server.rb:132 

步骤 2 - 生成详细报告。

vipin@laptop:~/chef-repo $ foodcritic -C ./cookbooks/mysql 
cookbooks/<cookbook Name>/attributes/server.rb 
FC002: Avoid string interpolation where not required 
[...] 
85| default['<Cookbook Name>']['conf_dir'] = "#{mysql['basedir']}" 
[...] 
cookbooks/<Cookbook Name>/recipes/client.rb 
FC007: Ensure recipe dependencies are reflected in cookbook 
metadata 
40| end 
41|when "mac_os_x" 
42| include_recipe 'homebrew' 
43|end 
44|

工作方式

Foodcritic 定义了一组规则并检查每一个配方代理。它带有涉及各个领域的多个规则:样式、连通性、属性、字符串、概率、搜索、服务、文件、元数据等等。

厨师 - ChefSpec

测试驱动开发(TDD)是一种在编写任何实际配方代码之前编写单元测试的方法。测试应该是真实的并且应该验证食谱的作用。它实际上应该失败,因为没有开发出配方。一旦配方开发出来,测试就应该通过。

ChefSpec 是建立在