Puppet代码的规范
puppet对agent的配置清单主要集中在manifests和modules两个目录中,manifests和modules目录中清单代码文件的符号间距、缩进与空白的使用规范.
*.pp文件
建议使用两个空格的软标签.
不推荐使用制表符.
尾部不要包含空格.
建议单行不要超过80个字符的宽度.
在资源的属性中,通过=>符号进行属性对齐。
注释
puppet的注释目前支持两种风格:
一种shell脚本风格."#"
1
2
3
4
<code> </code><code>#this is test </code>
<code> </code><code>package {</code><code>"httpd"</code><code>:</code>
<code> </code><code>ensure=> present,</code>
<code> </code><code>}</code>
另一种C语言风格以/*开始,*/结束的多行注释,不支持//注释.
5
6
<code> </code><code>/* </code>
<code> </code><code>this is </code><code>test</code>
<code> </code><code>*/</code>
变量规范:
变量只包含字母[a-z][A-Z]、数字[0-9]和下划线(_)。
正确:
<code> </code><code>$conten_test=lisi</code>
错误:
<code> </code><code>$conten-</code><code>test</code><code>=lisi</code>
'',"",{}等符号,在不包含变量的字符串中都应该使用‘’进行引用;如果字符串中包含变量则通过""进行引用;如果字符串中既有变量又有字符串,可以通过{}进行引用.
正确:
<code> </code><code>/etc/</code><code>${</code><code>file</code><code>}.conf </code>
<code> </code><code>"${::operatingssytem} is not supported by ${module_name}"</code>
不推荐:(这样写也正确,官方不推荐)
<code> </code><code>/etc/</code><code>${</code><code>file</code><code>}.conf</code>
<code> </code><code>"$::operatingssytem is not supported by $module_name"</code>
变量被引用时不加""。(我之前代码都加的有,官方不推荐)
<code> </code><code>mode => $mode</code>
不推荐:
<code> </code><code>mode => </code><code>"$mode"</code>
<code> </code><code>mode => </code><code>"${mode}"</code>
资源规范:
资源的标题需要用单引号''或双引号""引起来,同时标题中不能包含空格和连字符.
资源标题:
推荐:
<code> </code><code>package {</code><code>"httpd"</code><code>: </code>
<code> </code><code>package {</code><code>'httpd'</code><code>:</code>
<code> </code><code>package {httpd: </code>
资源符号对齐:
推荐:
<code> </code><code>owner=> root,</code>
资源属性顺序:
<code> </code><code>ensure=> present,</code><code>#ensure优先放在前面.</code>
资源关系:
资源应该由逻辑关系被划分为一组,而非通过资源类型划分.
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<code>class nginx {</code>
<code> </code><code>package {</code><code>"nginx"</code><code>:</code>
<code> </code><code>ensure => present,</code>
<code> </code><code>}</code>
<code> </code><code>service {</code><code>"nginx"</code><code>:</code>
<code> </code><code>ensure => </code><code>true</code><code>,</code>
<code> </code><code>enable</code> <code>=> </code><code>true</code><code>,</code>
<code> </code><code>require => Package[</code><code>'nginx'</code><code>], </code><code>#引用依赖首字母要大写</code>
<code> </code><code>}</code>
<code>class httpd { </code>
<code> </code><code>service {</code><code>"httpd"</code><code>:</code>
<code> </code><code>require => Package[</code><code>'httpd'</code><code>], </code><code>#引用依赖首字母要大写</code>
不推荐:
21
<code> </code><code>class package {</code>
<code> </code><code>package {</code><code>"httpd"</code><code>:</code>
<code> </code>
<code> </code><code>class service { </code>
软连接
通过file资源建立软连接的时候,需要设置ensure => link,并通过target属性来指定目标文件.
<code> </code><code>file</code> <code>{</code><code>"/tmp/3.pp"</code><code>:</code><code>#软连接文件.(目标文件) </code>
<code> </code><code>ensure=> link,</code>
<code> </code><code>target=> </code><code>'/root/3.pp'</code><code>,</code><code>#源文件.</code>
注释:/root/3.pp文件,我想软连接到/tmp下.
正确写法:
<code> </code><code>[root@sh-web1 ~]</code><code># cat link.pp </code>
<code> </code><code>file</code> <code>{</code><code>"/tmp/3.pp"</code><code>:</code>
<code> </code><code>target=> </code><code>'/root/3.pp'</code><code>,</code>
错误写法:
<code> </code><code>file</code> <code>{</code><code>"/tmp/3.pp"</code><code>: </code>
agent本地应用*.pp文件:
<code>[root@sh-web1 ~]</code><code># puppet apply link.pp </code>
<code>Notice: Compiled catalog </code><code>for</code> <code>sh-web1.localdomain </code><code>in</code> <code>environment production </code><code>in</code> <code>0.07 seconds</code>
<code>Notice: </code><code>/Stage</code><code>[main]</code><code>/Main/File</code><code>[</code><code>/tmp/3</code><code>.pp]</code><code>/ensure</code><code>: created</code>
<code>Notice: Finished catalog run </code><code>in</code> <code>0.02 seconds</code>
<code>[root@sh-web1 ~]</code><code># ls /tmp/</code>
<code>3.pp yum_save_tx-2017-09-22-17-52B5ZM81.yumtx yum_save_tx-2017-09-26-02-00w5fKzh.yumtx</code>
<code>text.txt yum_save_tx-2017-09-22-17-52b9CPEA.yumtx yum_save_tx-2017-09-26-18-03lhfm3k.yumtx</code>
查看软连接文件的内容:
<code>[root@sh-web1 ~]</code><code># cat /tmp/3.pp </code>
<code>$package = [</code><code>'php'</code><code>,</code><code>'php-devel'</code><code>]</code>
<code> </code><code>class nginx {</code>
<code> </code><code>$packages += [</code><code>'php-pecl-geoip'</code><code>]</code>
<code> </code><code>package {[packages]:</code>
<code> </code><code>class apache {</code>
<code> </code><code>$packages += [</code><code>'httpd'</code><code>]</code>
<code> </code><code>ensure => present,</code>
<code> </code><code>}</code>
<code>}</code>
<code>include nginx</code>
#查看源文件的内容:
<code>[root@sh-web1 ~]</code><code># cat 3.pp </code>
<code> </code><code>package {[packages]:</code>
<code> </code><code>ensure=> present,</code>
<code> </code><code>package {[packages]:</code>
<code> </code><code>ensure => present,</code>
文件模式:
通过file资源设置文件权限时要注意:
1、文件权限应该由4位数字组成,而非3位.(之前文章都是三位,官网推荐四位)
2、权限数字应该要使用''引起来.(之前文章这块有些没有引)
<code> </code><code>file</code> <code>{</code><code>"/tmp/test.txt"</code><code>: </code>
<code> </code><code>ensure =></code><code>file</code><code>,</code>
<code> </code><code>mode =></code><code>'0644'</code><code>,</code>
<code> </code><code>mode =>644,</code>
if条件语句的规范
通常不建议将selector语句与资源混用.
推荐写法:
<code>$file_mode= $::operatingssytem ? {</code>
<code> </code><code>debian=> </code><code>'0700'</code><code>,</code>
<code> </code><code>redhat=> </code><code>'0644'</code><code>,</code>
<code> </code><code>Centos=> </code><code>'0644'</code><code>,</code>
<code> </code><code>file</code> <code>{</code><code>'/tmp/test.txt'</code><code>:</code>
<code> </code><code>conten => </code><code>"hello world\n"</code><code>,</code>
<code> </code><code>mode => $file_mode,</code>
不推荐写法:
<code>file</code> <code>{</code><code>'/tmp/test.txt'</code><code>:</code>
<code> </code><code>mode => $::operatingssytem ? {</code>
<code> </code><code>conten => </code><code>"hello world\n"</code><code>,</code>
<code> </code><code>mode => $file_mode,</code>
class的规范:
符号关联关系:
通过->符号建立资源之间的关联关系的顺序为从"左到右".
Package["httpd"] -> Service["httpd"]
Service["httpd"] -> Package["httpd"]
模块的继承:
继承可以在模块中使用,但不推荐跨模块的命名空间使用.
class ssh{}
class ssh::client inherits {}
class ss::service inherits {}
跨模块继承(不推荐):
class ssh::client work {}
class ss::service apache {}
标示符命名规范:
1)变量命名规则
符合正则表达式规范(\A\$[a-zA-Z0-9_]+\Z),不包含特殊的字符.如%@^等.
变量名区分大小写,如$foo和$FOO为不同的变量。
class类的命名规范:
如果类名中使用了命名空间需要以"::"作为分隔,并符合正则表达式规范(\A([a-z][a-z0-9_]*)?(::[a-z][a-zA-Z0-9]*)*\Z)
modules命名规则:
符合正则表达式规范。
模块名的首字母不能为大写.
tag命名规则:符合正则表达式规范(/\A[a-z0-9._-]+\Z)。
nodes节点命名规则:符合正则表达式规范(/\A[a-z0-9._-]+\Z)。
puppet文件的导入和类的声明
在manifests目录内文件与文件之间的导入功能通常使用import函数来完成。
示例1:
site.pp
import nodes
示例2:
import 'nodes/*.pp'
注释:import函数可以导入manifests目录中的一个文件,也可以导入多个文件,多个文件可以使用通配符"*"来表示.
类的声明:
<code> </code><code>node base { </code>
<code> </code><code>include ntp</code>
<code> </code><code>include apache</code>
本文转自青衫解衣 51CTO博客,原文链接:http://blog.51cto.com/215687833/1970888