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
    }
相關文章
相關標籤/搜索