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 derived") 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"将起作用