puppet(3) 变量、数据类型、表达式、条件判断语句-if、case、selector、unless

puppet(4) 变量、数据类型、表达式、条件判断语句-if、case、selector语句

  • puppet变量:
    一、名称必须以$开头;赋值使用=,支持追加赋值+=;
    二、每一个变量都有两种引用格式:简短名称和FQN(彻底限定名称)
    绝对路径:$::scope::scope::variablephp

    $webserver=
    
          package{"$webserver":
              ensure  => present,
          }

    三、 变量赋值能够赋除正则表达式这种非标准数据类型的其余一切数据类型。
    四、 变量有使用范围,代码隔离只能隔离资源属性的默认值和变量。不能隔离资源名称 和 资源引用,因此 在puppet 中一个模块中定义的同一类型资源的title不能重复mysql

  • 数据类型
    puppet中除 正则表达式这种非标准类型的数据类型外 其余标准数据类型均可以赋值给变量,接下来要看下puppet中有哪些数据类型。linux

    puppet的数据类型:nginx

    一、直接字串
          能够用引号,也能够不用;单引号 强引用,双引号 弱引用
          换行符为\n, windows中为\r\n
    
      二、布尔型
          true, false
          其它有些类型在会自动转换为布尔型:
              字符串:空串为false;
              数字:都为true
              未定义:false
    
      三、数值:
          整数
          浮点数
    
      四、数组:
          $array=['red','blue','green']
    
          $array[0]
    
          package{['nginx','php','mysql-server']:
              ensure  => present,
          }
    
      五、hash
    
          {key1 => value1, key2 => value2,}
    
          key只能使用字符串
    
          value能够puppet支持的任意数据类型
    
          $dic = {mon => 'monday', 2 => 'tuesday'}
              $dic[mon]
    
      六、undef
          不能加引号,当你引用以前从未定义过的变量会报错,解决报错的方法就是,定义好这个变量名 $a = undef
    
      七、正则表达式
          puppet中的表达式可使用的地方有限,正则表达式是个模式,它能够作通配的。
          它属于puppet的非标准的数据类型,所以不能赋值给变量,并且仅能用于有限几个能够 接受正则表达式的位置,好比说可以使用 =~ 或!~ 匹配操做符的位置。一般包括case语句 ,selector语句以及节点名称匹配的位置。另外它们不能传递给函数 或用于资源属性的定义。
          正则表达式的使用方法:
              \(?i-mx(centos|ubuntu)\
              i 表示不区分大小写
              m 表示把.替换成换行符
              x 忽略空格和注释
    
          一个正则表达式的使用举例:
              $packages = $operatingsystem ? {
                  /(?i-mx:ubuntu|debian)/        => 'apache2',
                  /(?i-mx:centos|fedora|redhat)/ => 'httpd',
              }
              定义一个变量,变量名称为 $packages  给这个变量 赋值 一个selector语句
              $operatingsystem ? {
                  /(?i-mx:ubuntu|debian)/         => 'apache2',
                  /(?i-mx:centos|fedora|redhat)/  => 'httpd',
              }
              这个的意思,根据 factor里的变量 $operatingsystem的值,肯定返回是‘apache2’仍是‘httpd’

    一个用到以上大部分知识的资源配置例子:web

    $webserver = $operatingsystem ? {
          /(?i-mx:ubuntu|debian)/         => 'apache2',
          /(?i-mx:centos|fedora|redhat)/  => 'httpd',
      }
      package{$webserver:
          ensure => latest,
      }
      file{"/etc/$webserver/httpd.conf":
          ensure => file,
          source => "/opt/puppet/modules/$webserver/files/nginx.conf",
          require => Package[$webserver],
          # notify => Service['nginx'],
      }
      service{"$webserver":
          ensure => running,
          enable => true,
          hasstatus => true,
          hasrestart => true,
          # restart => 'systemctl reload nginx.service',
          require => [ Package[$webserver], File["/etc/$webserver/httpd.conf"]],
          subscribe => File["/etc/$webserver/httpd.conf"],
      }
  • puppet的变量种类:正则表达式

    一、 自定义变量sql

    二、 facter变量:可在语言中直接调用apache

    查看puppet支持的各facter:
          facter -p

    三、内置变量:ubuntu

    客户端内置:
          $clientcert
          $clientversion
      服务端内置:
          $servername
          $serverip
          $serverversion
          $module_name: 模块名称
  • puppet表达式windows

    比较操做符:==,!= ,< , >, <= ,=> , !~ 不能被模式匹配, =~能被模式匹配, in
      逻辑操做符: and ,or ,|
      算数操做符: +, - ,*,/, %, << , >>
          $osfamily == 'CentOS'
          $kernel in ['Linux','solaris','freebsd']
  • puppet的条件判断语句:

    if
          case
          selector
          unless

    if语句的条件能够是:

    1.变量引用
          2.表达式
          3.有返回值的函数

    if语句的用法举例

    if $processorcount > 1{
              notice('SMP host')
          } else {
              notice('po gai')
          }

    if语句又有正则表达式的举例:

    if $operatingsystem =~ /^(?i-mx:(centos|redhat))/ {
              notice("Welcome to $1 linux server")
          }

    PS:若是变量$operatingsystem的值能被/^(?i-mx:(centos|redhat)/)模式匹配则条件成立,$1指从左开始,第一个括号内匹配的内容。

    case 语句 是多条件if语句 的简单实现方式。

    case CONTROL_EXPRESS{
          case1,case2,case3: {statement}
          case4,....: {}
          case7,....: {}
          default:{statement}
      }
    
          CONTROL_EXPRESS 能够是:
                  1. 表达式
                  2. 变量
                  3. 有返回值的函数
          cases能够 是:
                  1. 一个直接的值
                  2. 一个变量
                  3. 只有一个返回值的函数
                  4. 正则表达式,表示控制表达式的值若是能被case里的正则表达式所匹配 就知足条件了

    selector语句相似于cascase语句,区别在于case语句条件为真后后面执行一段代码能够没有返回值,而selector语句条件为真时,后面必须是一个有返回值的类型。

    CONTROL_VARIABLE ? {
          case1 => value1,
          case2 => value2,
          ...
          default => valueN
      }
          CONTROL_VARIABLE: 变量、有返回值的函数,但不能是表达式
          case: 直接值(须要带引号)、变量、有返回值的函数、正则表达式的模式或default
          selector 各 case的值能够是一个除了hash之外的直接值、变量、能调用返回值的函数或其余的selector

    使用举例:

    $packages = $operatingsystem ? {
          /(?i-mx:ubuntu|debian)/        => 'apache2',
          /(?i-mx:centos|fedora|redhat)/ => 'httpd',  
      }

    selector 使用要点:

    整个selector语句会被看成一个单独的值,
      必须提供一个default case
      selector的控制变量只能是变量或者有返回值的函数,切记不能使用表达式
      其case能够是直接值(须要加引号),变量,有返回值的函数,正则表达式模式或default
      各case不能使用列表
      selector的各case的值能够是一个除了hash意外的直接值,变量,有返回值的函数或者其余的selector,不能是屡次嵌套。

总结:

puppet资源:notify, file, service, cron, user, group, exec, package
    依赖关系:
        before, require
        notify, subscribe
puppet变量:自定义变量($VARNAME)、facts、内置
puppet数据类型:字符、数值、布尔、数组、哈希、undef、RegExp
    /(?i-mx:PATTERN)/
puppet条件判断语句:if、case、selector、unless
    unless CONDITION {
        statement
    }
相关文章
相关标签/搜索