Chef - 跨平台食谱


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

为了做到这一点,我们需要一本食谱。在我们的例子中,它将是 test_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 - 将食谱上传到 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')

上传修改后的食谱并在 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 语句并使用简单的散列代替。

示例食谱

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 runningvdir”将起作用
  • 对于 Gentoo,“/etc/init.d/runit-start”将起作用