|
1.puppet的类1.1Tips:
- puppet 2.7之后,基类必须无参。
- 子类和父类有相同的属性,如果在子类中再次赋值,将覆盖掉原有的属性值。
- 如果想取消某个属性的值,可以使用undef覆盖原有的值。
- 可以通过require对资源增加属性。
例子: class :: foo inherits from nginx {service { 'nginx': require +> [File['nginx.conf'], File['foo.conf']],}}通过require+参数追加后,在子类nginx::foo中所定义的service资源需要依赖两个文件才能启动,其他参数默认继承父类。
1.2 参数化类puppet中不存在重载,如果一个类被声明多次,并且存在相互矛盾的参数值,puppet会编译失败。需要使用Hiera这个参数自动化查询工具参数化类,是指通过动态变量的查找将参数传递到类。可以在节点范围内设置一些变量,进行类的声明,并将变量分配给父范围,这个类就会查找所需的信息并进行应用。参数化类缺点如下:所有变量将应用到全局命名空间。(1)参数化类定义 class nginx ($package, $port) {.........}(2)参数化类的使用局部变量$package和$port在类中的定义可以作为参数名,也可以在作用域内使用。#作为参数名class nginx ($package, $port) { package {$package: ensure => present}
#在类作用域中引用file {'nginx.conf':port => $port,ensure => tile, }}(3)参数默认值class nginx ($package, $port = '80') {.......}
(4)声明参数化类class {'nginx':}或者class {'nginx': $package => 'nginx', $port => '80'}
2.模板2.1 Puppet模板主要是基于ERB。(1)标签除打上标签的内容外,ERB模板中的内容都会原封不动的传送回puppet<% document = "" %>(2)打印表达式注意与标签的区别<% = sectionheader %>或者environment = <% = gitversion [0,5]%>
(3)注释<%# this is comment. %>
(4)禁止换行<% document += thisline-%>
2.2ERB模板语法<%= ruby expression%>直接替换成表达式的值<% ruby code %> Ruby代码,包括条件,循环等<%# comment%>注释<%% or %%> 等同于<% or %>,分别进行<%- 等同于<%,闭合标签,控制代码前输出大量空格-%> 等同于%>, 闭合标签,控制代码后输出大量空格例子:<%= @ipaddress%> 也可以写成 <%= ipaddress%>
2.3 变量的引用当前范围内的变量都可以作为ruby的变量,用@符号引用puppet传递一个scop对象到模板中,其中包含当前设定的变量,以及其他数据。可以使用scope对象的lookupvar方法找到任何变量(1)超出本范围的变量<% = scope.lookipvar ('apache::user')%>(2)测试不明变量<% if @myvar%>myvar has <%= @myvar%> value<% end %>(3)获取当期作用域下的所有变量名如果使用的作用域在一个to_hash下,可以得到一个在当前作用域下的所有哈希变量表。这个哈希列表使用多个变量(osfamily),而不是合格的名称(::osfamily).如下代码将打印所有变量<%scope.to_hash.keys.each do |k| -%><%=k%><% end -%>
2.4模板结合多个模板,可以使用逗号结合template (’mumodule/template1.erb‘, ’mumodule/template2.erb‘)
2.5数组迭代$values = [var1, var2, other]<% values.each do |val| -%>some stuff with <%= val %><% end -%>
2.6语法检查erb -P -x -T '-' mytemplate.erb | ruby -c
以上参考《Puppet实践》 |
|