reko_3 发表于 2018-8-1 13:17:31

Puppet代码书写规范(十九)

  Puppet代码的规范
  puppet对agent的配置清单主要集中在manifests和modules两个目录中,manifests和modules目录中清单代码文件的符号间距、缩进与空白的使用规范.
  *.pp文件
  建议使用两个空格的软标签.
  不推荐使用制表符.
  尾部不要包含空格.
  建议单行不要超过80个字符的宽度.
  在资源的属性中,通过=>符号进行属性对齐。
  注释
  puppet的注释目前支持两种风格:
  一种shell脚本风格."#"
    #this is test  
    package {"httpd":
  
      ensure=> present,
  
    }
  另一种C语言风格以/*开始,*/结束的多行注释,不支持//注释.
    /*  
    this is test
  
    */
  
    package {"httpd":
  
      ensure=> present,
  
    }
  变量规范:
  变量只包含字母、数字和下划线(_)。
  正确:
    $conten_test=lisi  错误:
    $conten-test=lisi  '',"",{}等符号,在不包含变量的字符串中都应该使用‘’进行引用;如果字符串中包含变量则通过""进行引用;如果字符串中既有变量又有字符串,可以通过{}进行引用.
  正确:
    /etc/${file}.conf  
    "${::operatingssytem} is not supported by ${module_name}"
  不推荐:(这样写也正确,官方不推荐)
    /etc/${file}.conf  
    "$::operatingssytem is not supported by $module_name"
  变量被引用时不加""。(我之前代码都加的有,官方不推荐)
  正确:
    mode=> $mode  不推荐:
    mode=> "$mode"  
    mode=> "${mode}"
  资源规范:
  资源的标题需要用单引号''或双引号""引起来,同时标题中不能包含空格和连字符.
  资源标题:
  推荐:
    package {"httpd":  
      ensure=> present,
  
    }
  
    package {'httpd':
  
      ensure=> present,
  
    }
  不推荐:
    package {httpd:  
      ensure=> present,
  
    }
  资源符号对齐:
  推荐:
    package {"httpd":  
      ensure=> present,
  
      owner=> root,
  
    }
  不推荐:
    package {"httpd":  
      ensure=> present,
  
      owner=> root,
  
    }
  资源属性顺序:
  推荐:
    package {"httpd":  
      ensure=> present,#ensure优先放在前面.
  
      owner=> root,
  
    }
  不推荐:
    package {"httpd":  
      owner=> root,
  
      ensure=> present,
  
    }
  资源关系:
  资源应该由逻辑关系被划分为一组,而非通过资源类型划分.
  推荐:
class nginx {  
    package {"nginx":
  
            ensure    => present,
  
      }
  
      service {"nginx":
  
            ensure    => true,
  
            enable    => true,
  
            require    => Package['nginx'],    #引用依赖首字母要大写
  
      }
  
   }
  
class httpd {
  
    package {"httpd":
  
            ensure    => present,
  
      }
  
      service {"httpd":
  
            ensure    => true,
  
            enable    => true,
  
            require    => Package['httpd'],    #引用依赖首字母要大写
  
      }
  
   }
  不推荐:
class package {  
    package {"nginx":
  
            ensure    => present,
  
      }
  
      package {"httpd":
  
            ensure    => present,
  
      }
  
   }
  

  
   class service {
  
      service {"nginx":
  
            ensure    => true,
  
            enable    => true,
  
            require    => Package['nginx'],    #引用依赖首字母要大写
  
      }
  
      service {"httpd":
  
            ensure    => true,
  
            enable    => true,
  
            require    => Package['httpd'],    #引用依赖首字母要大写
  
      }
  
    }
  软连接
  通过file资源建立软连接的时候,需要设置ensure => link,并通过target属性来指定目标文件.
    file {"/tmp/3.pp":#软连接文件.(目标文件)  
      ensure=> link,
  
      target=> '/root/3.pp',#源文件.
  
    }
  注释:/root/3.pp文件,我想软连接到/tmp下.
  正确写法:
    # cat link.pp  
      file {"/tmp/3.pp":
  
      ensure=> link,
  
      target=> '/root/3.pp',
  
    }
  错误写法:
    file {"/tmp/3.pp":  
      target=> '/root/3.pp',
  
    }
  agent本地应用*.pp文件:
# puppet apply link.pp  
Notice: Compiled catalog for sh-web1.localdomain in environment production in 0.07 seconds
  
Notice: /Stage/Main/File/ensure: created
  
Notice: Finished catalog run in 0.02 seconds
  
# ls /tmp/
  
3.pp      yum_save_tx-2017-09-22-17-52B5ZM81.yumtxyum_save_tx-2017-09-26-02-00w5fKzh.yumtx
  
text.txtyum_save_tx-2017-09-22-17-52b9CPEA.yumtxyum_save_tx-2017-09-26-18-03lhfm3k.yumtx
  查看软连接文件的内容:
# cat /tmp/3.pp  
$package = ['php','php-devel']
  
    class nginx {
  
      $packages += ['php-pecl-geoip']
  
    package {:
  
      ensure=> present,
  
      }
  
    }
  
    class apache {
  
      $packages += ['httpd']
  
    package {:
  
      ensure=> present,
  
            }
  
}
  
include nginx
  #查看源文件的内容:
# cat 3.pp  
$package = ['php','php-devel']
  
    class nginx {
  
      $packages += ['php-pecl-geoip']
  
            package {:
  
            ensure=> present,
  
      }
  
    }
  
    class apache {
  
      $packages += ['httpd']
  
      package {:
  
         ensure=> present,
  
            }
  
}
  
include nginx
  文件模式:
  通过file资源设置文件权限时要注意:
  1、文件权限应该由4位数字组成,而非3位.(之前文章都是三位,官网推荐四位)
  2、权限数字应该要使用''引起来.(之前文章这块有些没有引)
  推荐:
    file {"/tmp/test.txt":  
      ensure =>file,
  
      mode   =>'0644',
  
    }
  不推荐:
    file {"/tmp/test.txt":  
      ensure =>file,
  
      mode   =>644,
  
    }
  if条件语句的规范
  通常不建议将selector语句与资源混用.
  推荐写法:
$file_mode= $::operatingssytem ? {  
    debian=> '0700',
  
    redhat=> '0644',
  
    Centos=> '0644',
  
    }
  
    file {'/tmp/test.txt':
  
      conten => "hello world\n",
  
      mode => $file_mode,
  
}
  不推荐写法:
file {'/tmp/test.txt':  
    mode => $::operatingssytem ? {
  
    debian=> '0700',
  
    redhat=> '0644',
  
    Centos=> '0644',
  
    conten => "hello world\n",
  
    mode => $file_mode,
  
    }
  
}
  class的规范:
  符号关联关系:
  通过->符号建立资源之间的关联关系的顺序为从"左到右".
  正确写法:
  Package["httpd"] -> Service["httpd"]
  错误写法:
  Service["httpd"] -> Package["httpd"]
  模块的继承:
  继承可以在模块中使用,但不推荐跨模块的命名空间使用.
  class ssh{}
  class ssh::client inherits {}
  class ss::service inherits {}
  跨模块继承(不推荐):
  class ssh{}
  class ssh::client work {}
  class ss::service apache {}
  标示符命名规范:
  1)变量命名规则
  符合正则表达式规范(\A\$+\Z),不包含特殊的字符.如%@^等.
  变量名区分大小写,如$foo和$FOO为不同的变量。
  class类的命名规范:
  符合正则表达式规范(\A\$+\Z),不包含特殊的字符.如%@^等.
  如果类名中使用了命名空间需要以"::"作为分隔,并符合正则表达式规范(\A(*)?(::*)*\Z)
  modules命名规则:
  符合正则表达式规范。
  模块名的首字母不能为大写.
  tag命名规则:符合正则表达式规范(/\A+\Z)。
  nodes节点命名规则:符合正则表达式规范(/\A+\Z)。
  puppet文件的导入和类的声明
  在manifests目录内文件与文件之间的导入功能通常使用import函数来完成。
  示例1:
  site.pp
  import nodes
  示例2:
  site.pp
  import 'nodes/*.pp'
  注释:import函数可以导入manifests目录中的一个文件,也可以导入多个文件,多个文件可以使用通配符"*"来表示.
  类的声明:
    node base {  
      include ntp
  
      include apache
  
    }
页: [1]
查看完整版本: Puppet代码书写规范(十九)