Chef - 使用 Chef DSL 的普通 Ruby
在 Chef 中,如果需要创建简单的菜谱,可以使用 Chef 中提供的资源,例如模板、remote_file 和服务。但是,随着菜谱变得复杂,需要使用高级技术,例如条件语句来根据条件执行菜谱的各个部分。这就是将普通 Ruby 与 Chef 领域特定语言 (DSL) 混合使用的强大之处。
如何使用它?
在客户端模式下在任何节点上启动 Chef Shell 即可访问 Chef 服务器。
user@server:~$ sudo chef-shell --client loading configuration: /etc/chef/client.rb Session type: client ...TRUNCATED OUTPUT... run `help' for help, `exit' or ^D to quit. Ohai2u user@server! Chef>
使用 Chef DSL 的基本条件
使用纯 Ruby 按名称对节点进行排序。
chef > nodes.sort! {|a,b| a.name <=> b.name } => [node[alice],node[server]]
循环遍历节点,打印其操作系统。
chef > nodes.each do |n| chef > puts n['os'] chef ?> end linux windows => [node[server], node[alice]]
使用数组、循环和字符串扩展构建 gem 名称,安装多个 Ruby gem。
chef > %w{ec2 essentials}.each do |gem| chef > gem_package "knife-#{gem}" chef ?> end => ["ec2", "essentials"]
工作方法
Chef Kitchen(配方)是 Ruby 文件,在 Chef 运行的上下文中进行评估。它们可以包含纯 Ruby 代码(例如 if 语句和循环)以及 Chef DSL 元素(例如资源)。
在Kitchen(配方)中,可以简单地声明 Ruby 变量并为其赋值。