puppet的使用:ERB模板介绍
ERB介绍
全称是Embedded RuBy,意思是嵌入式的Ruby,是一种文本模板技术,用过JSP的话,会发现两者语法很像。
我们项目中一般用ERB来产生各模块的配置文件。ERB模板也可以用来产生Web页面(之前搞过一段时间ROR开发,模板用的haml),也可以用来产生其他文件。
<% %>与<%= %>
<%Ruby脚本%>,一般是Ruby的逻辑脚本,但是不会写入到目标文件中。
<%= Ruby脚本%> ,脚本的执行结果会写入到目标文件中。
举例如下(代码来源):
这段代码是从Hash中读取信息创建sql语句保存到文件中。
require "erb"
domains = {...}
sqlTemplate = ERB.new %q{
<%for organization in domains.keys%>
insert into org_domain(Domain, organization) values('<%=domains[organization]%>','<%=organization%>');
<%end%>
}
sqlFile = File.new("./sql.sql", "w")
sqlFile.puts sqlTemplate.result
使输出紧凑
<%= -%>
You can trim line breaks after expression-printing tags by adding a hyphen to the closing tag delimiter.
- -%> — If the tag ends a line, trim the following line break.
意思是如果<%= -%>表达式中,-%>是一行的结尾,会忽略后面的换行。
<%- -%>
You can trim whitespace surrounding a non-printing tag by adding hyphens (-) to the tag delimiters.
- <%- — If the tag is indented, trim the indentation.
- -%> — If the tag ends a line, trim the following line break.
意思是<%-前面是空白符时,会删除这些空白符;-%> 含义同上。
puppet中一般怎么使用erb
举例如下:
目录结构
~/tmp# tree -L 2 puppet
puppet
├── manifests
│ ├── nodes
│ └── site.pp
└── modules
├── xxx
└── nginx
这里是大的目录结构。
manifests的内容如下:
~/tmp/puppet# tree -L 2 manifests
manifests
├── nodes
│ ├── controller-192-41-1-185.pp
│ ├── controller-192-41-1-186.pp
│ ├── controller-192-41-1-187.pp
│ ├── controller-192-41-1-191.pp
│ └── controller-192-41-1-202.pp
└── site.pp
这里每个.pp文件是对应每个agent节点的定义,具体内容见下一节。
每个模块下的内容类似,现在只以nginx举例。
~/tmp/puppet/modules# tree -L 3 nginx/
nginx/
├── files
│ ├── xxxClientCert.jks
│ ├──xxxServerCert.jks
│ ├── README.md
│ ├── server.crt
│ └── server.key
├── manifests
│ ├── config.pp
│ ├── init.pp
│ ├── params.pp
│ └── service.pp
└── templates
└── conf.d
├── nginx.conf.erb
├── ssl_restart_oms.sh.erb
├── web-hedex.xml.erb
└── web.xml.erb
具体模块的manifests目录下是各个类的定义,templates定义了各个模板,模板会在manifests下的类中被引用。
类的定义
~/tmp/puppet/manifests# cat site.pp
import 'nodes/*.pp'
$puppetserver='controller-192-41-1-191'
下面是一个node的定义:
~/tmp/puppet/manifests/nodes# cat controller-192-41-1-191.pp
node 'controller-192-41-1-191' {
$xxx = "true"
#这里是各种变量的定义
Class['aaa']->Class['bbb']->Class['ccc']->Class['nginx']->Class['ddd']
include aaa,bbb,ccc,nginx,ddd
}
模板中使用的变量就是来自这里的定义。
总结如下:
nginx/manifests下的各个pp文件是各个类的定义,类的定义中使用了nginx/templates中定义的模板,这些类被controller-192-41-1-191.pp 文件引用,controller-192-41-1-191.pp 文件中定义了模板中使用的变量。
访问puppet 变量
模板可以访问puppet的变量,这是模板的主要数据来源。
一个ERB模板有自己的本地作用域,它的父作用域是引用该模板的类。这意味着,模板可以使用短名称访问父类中的变量,但是不能向父类中添加新的变量。
在ERB模板中,有两种方式访问变量。
- @variable
- scope['variable'] (旧的形式为:scope.lookupvar('variable'))
@variable
原文:
All variables in the current scope (including global variables) are passed to templates as Ruby instance variables, which begin with “at” signs (@). If you can access a variable by its short name in the surrounding manifest, you can access it in the template by replacing its $ sign with an @. So $os becomes @os, $trusted becomes @trusted, etc.
当前作用域的所有变量(包括全局变量)都会以Ruby实例变量的形式传给模板。如果你在模板中可以使用短名称访问一个变量,你就可以使用"@"代替"$"。所以,$os就变成了@os,$trusted就变成了@trusted。
这是访问变量最直接清晰的方式,但是这种方式不能访问其他作用域的变量,需要访问其他作用域的变量时,你需要使用下面的方式。
scope['variable'] or scope.lookupvar('variable')
Puppet可以使用对象scope来以散列表的方式访问变量。例如,访问$ntp::tinker你可以使用scope['ntp::tinker']这种形式。
还有另一种方式使用scope对象,就是通过它的lookupvar方法来访问变量,该方法需要传入要访问的变量名,例如,scope.lookupvar('ntp::tinker')。这和上面的方式效果是一样的,但是使用起来没有scope['ntp::tinker']更简洁直观。
puppet类型和Ruby类型的对应关系
这部分表格,就不翻译了,直接贴图。
未定义变量
如果一个puppet变量没有定义的话,它的值是undef,意思是,在模板中它的值是nil。
含义是Puppet变量值为undef,对应Ruby变量值为nil。
在模板中使用puppet函数
- 所有的函数都以scope对象的方法调用;
- 函数名的开头都必须加上前缀"function_";
- 函数的参数必须以数组的形式传递,即使只有一个参数。
例如,在一个模板中引用另一个模板:
<%= scope.function_template(["my_module/template2.erb"]) %>
参考
Language: Embedded Ruby (ERB) template syntax
puppet的使用:ERB模板介绍的更多相关文章
- puppet的使用:ERB模板
ERB介绍 全称是Embedded RuBy,意思是嵌入式的Ruby,是一种文本模板技术,用过JSP的话,会发现两者语法很像. 我们项目中一般用ERB来产生各模块的配置文件.ERB模板也可以用来产生W ...
- Django框架(十一):模板介绍、模板语言、模板继承、HTML转义
1. 模板介绍 1.1 模板的功能 产生html,控制页面上展示的内容.模板文件不仅仅是一个html文件. 模板文件包含两部分内容: 静态内容:css.js.html. 动态内容:用于动态去产生一些页 ...
- Centos7+puppet+foreman,模板介绍
一.简介 provision templates 是灵活部署合适的操作系统的核心,模板包括有好几类 1.模板种类 pxe相关的模板,比如pxelinux,pxegrub,pxegrub2 kickst ...
- Puppet自动化运维-资源介绍篇(4)
1.什么是资源? 资源是Puppet最基础的元素,每个资源的定义都具有标题,类型,以及一系列的属性. 资源定义有如下的特性: (1) Puppet使用title在编译时区分每个资源,使用命名变量在 ...
- [Vue 牛刀小试]:第十七章 - 优化 Vue CLI 3 构建的前端项目模板(1)- 基础项目模板介绍
一.前言 在上一章中,我们开始通过 Vue CLI 去搭建属于自己的前端 Vue 项目模板,就像我们 .NET 程序员在使用 asp.net core 时一样,我们更多的会在框架基础上按照自己的开发习 ...
- laravel blade模板介绍
第一步:首先写好模板 在sites下新建立一个app.blade.php文件 写入模板如: <!DOCTYPT html><html><head> <titl ...
- phpcmsv9更换模板介绍
先分享下大概的步骤: 1.上传模版文件到服务器:2.在站点管理 里边[模板风格配置]选择新模板:3.设置不同模型对应模板:4.修改现有的栏目,匹配新模板:5.更新栏目缓存.系统缓存,更新HTML静态页 ...
- Instruments模板介绍(更新中...)
第一章.Instruments(仪器)快速入门 Instruments可以用来收集关于一个或者多个系统进程的性能和行为的数据,并跟踪睡着时间产生的数据.它提供了好几个分析模板: Blank 任何类型都 ...
- Win10系列:VC++ Direct3D模板介绍2
(3)CreateDeviceResources函数 CreateDeviceResources函数默认添加在CubeRenderer.cpp源文件中,此函数用于创建着色器和立体图形顶点.接下来分别介 ...
随机推荐
- centos7,配置nginx服务器
安装准备 首先由于nginx的一些模块依赖一些lib库,所以在安装nginx之前,必须先安装这些lib库,这些依赖库主要有g++.gcc.openssl-devel.pcre-devel和zlib-d ...
- Linux服务器密钥安全登录
使用密钥登录的好处:1.省事,不用每次去敲用户名和密码:2.安全,密钥长度一般是1024位,比我们设的密码要长得多: 以下是为新用户jackson添加密钥登录的步骤. 1.添加用户,并添加到sudoe ...
- Keil uVision4 for ARM 下增加支持C51,C5x
原文链接:http://blog.csdn.net/skertone/article/details/7046447 第一步编辑 TOOLS.ini 找到Keil安装目录, 用记事本修改 TOOLS. ...
- hibernate增删改
public class HibernateUtils { private static SessionFactory sessionFactory=null; static{ //获取config ...
- 比较两个Excle表格的修改内容
//输入参数为文件输入流public static Map<String, List<String>> excelColumn2maplist(InputStream is){ ...
- js-实现搜狐列表
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
- 1、K-means
k-means(K均值) 1.无监督聚类算法 2.K---分成K类 3.分类准则:使得样本与各类中心之间的误差平方和最小 --------------------------------------- ...
- jsp中文乱码解决办法
一.JSP页面显示乱码 二.表单提交中文时出现乱码 三.数据库连接 大家在JSP的开发过程中,经常出现中文乱码的问题,可能一至困扰着您,我现在把我在JSP开发中遇到 的中文乱码的问题及解决办法写出来供 ...
- JS通过ClassName禁止DIV点击
//通过ClassName获取div,使用setAttribute设置div禁止点击 var itemRoom= document.getElementsByClassName("page- ...
- google breakpad for linux(2)
breakpad 是什么 breakpad 是一个包含了一系列库文件和工具的开源工具包,使用它可以帮助我们在程序崩溃后进行一系列的后续处理,如现场的保存(core dump),及事后分析(重建 cal ...