Chef - 跨平台 Cookbook



跨平台 Cookbook 是指那些采用其将要运行的底层环境的 Cookbook。Chef 提供了许多功能,有助于编写能够在任何将要部署的操作系统上运行的跨平台 Cookbook。这有助于开发人员编写一个完全可操作的 Cookbook。

为了做到这一点,我们需要一个 Cookbook。在我们的例子中,它将是 test_cookbook 和一个运行列表,其中包含 Cookbook 定义。

工作方法

检索节点平台详细信息并在 Cookbook 中执行条件逻辑取决于平台。在我们的例子中,我们将针对 Ubuntu 进行测试。

步骤 1 - 如果节点是 Ubuntu,则记录一条消息。

vipin@laptop:~/chef-repo $ subl cookbooks/test_cookbook/recipes/default.rb 
Log.info("Running on ubuntu") if node.platform['ubuntu'] 

步骤 2 - 将 Cookbook 上传到 Chef 服务器。

vipin@laptop:~/chef-repo $ subl cookbooks/test_cookbook/recipes/default.rb 
Uploading my_cookbook [0.1.0] 
Uploaded 1 cookbook. 

步骤 3 - 在节点上运行 Chef 客户端。

user@server:~$ sudo chef-client 
...TRUNCATED OUTPUT... 
[2013-03-03T20:07:39+00:00] INFO: Running on Ubuntu 
...TRUNCATED OUTPUT...

或者,如果有人对特定平台不感兴趣,而只需要知道正在使用哪个声明性平台,则可以使用以下语句。

Log.info("Running on a debian derivative") if 
platform_family?('debian')

上传修改后的 Cookbook 并运行 Ubuntu 节点上的 Chef 客户端将显示以下结果。

[2013-03-03T20:16:14+00:00] INFO: Running on a debian 
derivative 

脚本工作流程

在上述命令中,Ohai 将发现节点操作系统的当前状态并将其作为平台属性与节点对象一起存储。

node['platform'] 

或者,您可以使用方法样式语法 -

node.platform 

设置特定于平台的值

为了设置特定于平台的值,chef 提供了便利方法 value_for_platform 和 value_for_platform_family。它们可以用来避免复杂的 case 语句,而使用简单的哈希表。

示例 Cookbook

execute "start-runsvdir" do 
   command value_for_platform( 
      "debian" => { "default" => "runsvdir-start" }, 
      "ubuntu" => { "default" => "start runsvdir" }, 
      "gentoo" => { "default" => "/etc/init.d/runit-start start" } 
   ) 
   action :nothing 
end 

在上面的例子中,命令是根据定义特定于操作系统的。

  • 对于 Debian,"runsvdir-start" 将起作用
  • 对于 Ubuntu,"start runsvdir" 将起作用
  • 对于 Gentoo,"/etc/init.d/runit-start" 将起作用
广告