- Chef 教程
- Chef - 首页
- Chef - 概述
- Chef - 架构
- Chef - 版本控制系统设置
- Chef - 工作站设置
- Chef - 客户端设置
- Chef - Test Kitchen设置
- Chef - Knife设置
- Chef - Solo设置
- Chef - Cookbook
- Chef - Cookbook依赖关系
- Chef - 角色 (Roles)
- Chef - 环境 (Environment)
- Chef - Chef-Client作为守护进程
- Chef - Chef-Shell
- Chef - 测试Cookbook
- Chef - Foodcritic
- Chef - ChefSpec
- 使用Test Kitchen测试Cookbook
- Chef - 节点 (Nodes)
- Chef - Chef-Client运行
- 高级Chef
- 动态配置菜谱 (Recipes)
- Chef - 模板
- Chef - 纯Ruby与Chef DSL
- Chef - 在菜谱中使用Ruby Gems
- Chef - 库 (Libraries)
- Chef - 定义 (Definitions)
- Chef - 环境变量
- Chef - 数据包 (Data Bags)
- Chef - 数据包脚本
- Chef - 跨平台Cookbook
- Chef - 资源 (Resources)
- 轻量级资源提供程序
- Chef - 蓝图 (Blueprints)
- Chef - 文件和包
- Chef - 社区Cookbook
- Chef有用资源
- Chef - 快速指南
- Chef - 有用资源
- Chef - 讨论
Chef - 纯Ruby与Chef DSL
在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菜谱是Ruby文件,在Chef运行的上下文中进行评估。它们可以包含纯Ruby代码,例如if语句和循环,以及Chef DSL元素,例如资源。
在菜谱内部,可以简单地声明Ruby变量并为其赋值。
广告