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

转载于:https://www.cnblogs.com/cuimiemie/p/6442695.html

puppet的使用:ERB模板介绍相关推荐

  1. 在Puppet中用ERB模板来自动配置Nginx虚拟主机

    模板文件是在puppet模块下面templates目录中以".erb"结尾的文件,puppet模板主要用于文件,例如各种服务的配置文件,相同的服务,不同的配置就可以考虑使用模板文件 ...

  2. [SCTF2019]Flag Shop erb模板注入

    进入题目可以看到一个是要用自己的JinKela去购买flag  这种类型的题目我想到之前都是有一个jwt认证,通过伪造验证信息修改金额以达到购买的效果 点击work抓包可以发现确实有jwt(通过一段字 ...

  3. html语言可以写模版继承吗,Django框架(十一):模板介绍、模板语言、模板继承、HTML转义...

    1. 模板介绍 1.1 模板的功能 产生html,控制页面上展示的内容.模板文件不仅仅是一个html文件. 模板文件包含两部分内容: 静态内容:css.js.html. 动态内容:用于动态去产生一些页 ...

  4. 在text html模版中写js,Rails3使用text/html内容类型而不是text/javascript呈现js.erb模板...

    我正在使用3.0.0.beta3构建一个新的应用程序.我只是尝试将js.erb模板呈现给Ajax请求以执行以下操作(在publications_controller.rb中): def get_pub ...

  5. 织梦模板改html教程,dedecms织梦模板介绍及制作修改

    dedecms 站长新朋友们可能对织梦模板不太了解,更不知道如何修改.下面山西SEO优化傲远为大家介绍一下织梦模板及简单的修改操作. 关于dedecms模板,我们首选要了解一下它的几个基本定义.Ded ...

  6. thymeleaf模板介绍

    作者:LoveEmperor-王子様 thymeleaf模板介绍 附所关联的Java代码 简介 基本使用 知识重点 代码示例 总结 简介 本文主要是对thymeleaf模板介绍,归纳一些常用知识点 基 ...

  7. 织梦.html和htm,织梦dedecms之article_article.htm(文章内容页模板)介绍

    在dedecms后台的默认模板管理打开article_article.htm文章内容页模板,头部tkd标签调用如下: {dede:field.title/}_{dede:global.cfg_webn ...

  8. 【从零开始vnpy量化投资】十五. 投资组合策略模板介绍

    [从零开始vnpy量化投资]十五. 投资组合策略模板介绍 概述 在之前的课程中,我们主要是使用了vnpy的cta策略模板,这个模板的特点就是只支持单一合约.如果我们需要同时对多个合约进行交易,就需要用 ...

  9. 服务器虚拟化 目标,服务器虚拟化之虚拟机和模板介绍(49页)-原创力文档

    服务器虚拟化之虚拟机和模板介绍 技术创新,变革未来 目标 ⚫ 学完本课程后,您将能够:  掌握虚拟机和模板的概念  掌握Tools 的本质和用途  掌握与虚拟机相关的操作 第1页 目录 1. 虚 ...

  10. Centos7+puppet+foreman,模板介绍

    一.简介 provision templates 是灵活部署合适的操作系统的核心,模板包括有好几类 1.模板种类 pxe相关的模板,比如pxelinux,pxegrub,pxegrub2 kickst ...

最新文章

  1. Freetype学习笔记(轉)
  2. Swift的控制转移语句-- fallthrough语句
  3. Android震动vibrator系统开发全过程
  4. C#LeetCode刷题之#575-分糖果​​​​​​​(Distribute Candies)
  5. jquery $(function(){}) $(document).ready(function(){}); (function(){}); 的区别以及作用
  6. JavaScript escape() 函数
  7. zabbix安装及简单配置
  8. 解析json对象出现$ref: $.list[0]的解决办法
  9. 任务栏流量监测工具 NetSpeedMonitor 在Windows 8下的安装使用
  10. 从图嵌入算法到图神经网络
  11. Slf4j+logback实现日志打印-获取调用者类及方法行数信息
  12. 如何用Excel快速制作甘特图?(超详细!)
  13. 程序员不要以为技术牛逼就行了,这些你必须知道的职场潜规则,助你一路高升!
  14. 衣服尺码自定义排序sql
  15. MySQL 高可用MMM安装部署以及故障转移详细资料汇总
  16. oracle调用web severs,Oracle调用C#开发web services
  17. Mac OS制作Windows10启动盘
  18. babel5升级到babel6总结
  19. 运维工程师的宿命(困兽之斗)
  20. STW43NM60ND意法车规MOS管\原装现货ASEMI代理

热门文章

  1. Rap2 模拟接口 常见规则示例
  2. R语言泊松(Poisson)分布
  3. V831 MP4播放+船新版本
  4. FPGA开发第四弹:触摸按键控制LED灯实验
  5. 洛谷P3456 [POI2007]GRZ-Ridges and Valleys
  6. AlarmClock slow alarm Alarm
  7. 网页学习教程视频百度云下载,程序学习教程视频百度云下载(讲解非常的细,适合刚学习程序人员,从前端到后端都有,全看完你就是一名程序猿)
  8. w ndows无法完成格式化,Windows无法完成格式化怎么办呢?教你解决U盘问题!
  9. 关于《0bug》一书随机数的一处修订
  10. 鸡兔同笼php语言,鸡兔同笼(C语言代码)