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

  • puppet变量:

    1、名称必须以$开头;赋值使用=,支持追加赋值+=;

    2、每个变量都有两种引用格式:简短名称和FQN(完全限定名称)

    绝对路径:$::scope::scope::variable

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

    3、 变量赋值可以赋除正则表达式这种非标准数据类型的其他一切数据类型。

    4、 变量有使用范围,代码隔离只能隔离资源属性的默认值和变量。不能隔离资源名称 和 资源引用,所以 在puppet 中一个模块中定义的同一类型资源的title不能重复

  • 数据类型

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

    puppet的数据类型:

      1、直接字串
    可以用引号,也可以不用;单引号 强引用,双引号 弱引用
    换行符为\n, windows中为\r\n 2、布尔型
    true, false
    其它有些类型在会自动转换为布尔型:
    字符串:空串为false;
    数字:都为true
    未定义:false 3、数值:
    整数
    浮点数 4、数组:
    $array=['red','blue','green'] $array[0] package{['nginx','php','mysql-server']:
    ensure => present,
    } 5、hash {key1 => value1, key2 => value2,} key只能使用字符串 value可以puppet支持的任意数据类型 $dic = {mon => 'monday', 2 => 'tuesday'}
    $dic[mon] 6、undef
    不能加引号,当你引用之前从未定义过的变量会报错,解决报错的方法就是,定义好这个变量名 $a = undef 7、正则表达式
    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’

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

    $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的变量种类:

    1、 自定义变量

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

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

    3、内置变量:

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

      比较操作符:==,!= ,< , >, <= ,=> , !~ 不能被模式匹配, =~能被模式匹配, 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
}

puppet(3) 变量、数据类型、表达式、条件判断语句-if、case、selector、unless的更多相关文章

  1. SQL中的条件判断语句(case when zhen if,ifnull)用法

    简介: case具有两种格式.简单case函数和case搜索函数.这两种方式,可以实现相同的功能.简单case函数的写法相对比较简洁,但是和case搜索函数相比,功能方面会有些限制,比如写判定式.还有 ...

  2. 『忘了再学』Shell流程控制 — 33、if条件判断语句(一)

    目录 1.单分支if条件语句 2.双分支if条件语句 (1)示例1 (2)示例2 什么是流程控制? 普通理解:Shell编写的程序是顺序执行的,也就是说第一命令先执行,然后接着执行第二条命令,然后再下 ...

  3. 前端笔记知识点整合之JavaScript(三)关于条件判断语句、循环语句那点事

      一.条件分支语句 条件分支语句,也叫作条件判断语句,就是根据某种条件执行某些语句,不执行某些语句. JS中有三种语法是可以表示条件分支的 1.1 if……else…… 条件分支的主力语法,这个主力 ...

  4. 前端笔记之JavaScript(三)关于条件判断语句、循环语句那点事

    一.条件分支语句 条件分支语句,也叫作条件判断语句,就是根据某种条件执行某些语句,不执行某些语句. JS中有三种语法是可以表示条件分支的 1.1 if……else…… 条件分支的主力语法,这个主力语法 ...

  5. 求1+2+…+n,要求不能使用乘除法、for、while、if、else、s witch、case 等关键字以及条件判断语句(A?B:C)和不用循环/goto/递归输出1~100的10种写法

    来源:据说是某一年某个公司的面试题 题目:求1+2+…+n, 要求不能使用乘除法.for.while.if.else.s witch.case 等关键字以及条件判断语句(A?B:C) 分析:这题本来很 ...

  6. python自学-day2(变量、if条件判断、运算符操作)

    1.变量 变量只是用于保存内存位置,将变量存储在内存中的作用,方便后面调用,这意味着,在创建变量时会在内存中开辟一个空间. 变量命名规则: 由字母.数字.下划线(_)组成 不能以数字开头 不能使用 P ...

  7. [19/09/16-星期一] Python的运算符和条件判断语句

    一.运算符 (1)算术运算符  + 加法运算符(如果是两个字符串之间进行加法运算,则会进行拼串操作) a = 10 + 5  计算 a = 'hello' + ' ' + 'world' 拼串  - ...

  8. Interview----求 1+2+...+n, 不能用乘除法、for、while if、else、switch、case 等关键字以及条件判断语句 (A?B:C)

    题目描述: 求 1+2+...+n, 要求不能使用乘除法.for.while.if.else.switch.case 等关键字以及条件判断语句 (A?B:C). 分析: 首先想到的是写递归函数,但是遇 ...

  9. C语言奇思妙想:求1+2+…+n,要求不能使用乘除法、for、while、if、else、s witch、case 等关键字以及条件判断语句(A?B:C)

    来源:据说是某一年某个公司的面试题 题目:求1+2+…+n, 要求不能使用乘除法.for.while.if.else.s witch.case 等关键字以及条件判断语句(A?B:C) 分析:这题本来很 ...

随机推荐

  1. EasyAR 开发实例---AR礼物(简单demo)

    一个节日礼物效果 --显示模型 在本次的案例中,我使用的是unity5.6.3版本,EasyAR 为2.0.(用1.0的版本,在渲染那块有问题) [导入SDK]到EasyAR官网(http://www ...

  2. sklearn神经网络分类

    sklearn神经网络分类 神经网络学习能力强大,在数据量足够,隐藏层足够多的情况下,理论上可以拟合出任何方程. 理论部分 sklearn提供的神经网络算法有三个: neural_network.Be ...

  3. Seaborn入门

    Seaborn入门 Seaborn是基于matplotlib的python数据可视化库,提供更高层次的API封装,使用起来更加方便快捷. displot displot()集成了hist直方图和kde ...

  4. 如何修改CCS 7.2 代码和注释的颜色以及折叠代码

    默认的字体总是让人感觉很难受,作为一个热爱生活的人,工作的时候也得尽力创造一个舒适的环境----程序猿们,对自己好一点. 首先废话一下--------------------------------- ...

  5. 逻辑回归与神经网络还有Softmax regression的关系与区别

    本文讨论的关键词:Logistic Regression(逻辑回归).Neural Networks(神经网络) 之前在学习LR和NN的时候,一直对它们独立学习思考,就简单当做是机器学习中的两个不同的 ...

  6. sqli-labs Less-11 and Less-12

    这关是post注入的世界,post注入就是表单中填好数据通常会被送到服务器,然后由服务器将其发送到它要去的地方(比如,送到一个服务器网关程序中,然后由这个程序对其进行处理). 不显示东西,那么加引号等 ...

  7. ES6_入门(5)_解构赋值

    学习参考:http://es6.ruanyifeng.com/#docs/destructuring //2017/7/20 /*对象的解构赋值*/ //对象的解构赋值,当变量名的对象的属性名相同时, ...

  8. 首席技术官应该考虑的网络安全问题 IT大咖说 - 大咖干货,不再错过

    首席技术官应该考虑的网络安全问题 IT大咖说 - 大咖干货,不再错过   http://www.itdks.com/dakalive/detail/5523

  9. 做了一个动态代理IP池项目,邀请大家免费测试~

    现在出来创业了,目前公司在深圳. 做了啥呢, 做了一个动态代理 IP 池项目 现在邀请大家免费测试体验! 免费激活码:关注微信公众号:2808proxy (每人每天限领一次噢~) 网站:https:/ ...

  10. 运维笔记10 (Linux软件的安装与管理(rpm,yum))

    概述:用rpm安装和管理软件(rpm解决依赖性),用yum安装与管理软件(yum解决依赖性). 1.linux的软件 linux能够说是一款改变时代的操作系统,可是一个操作系统再优秀假设没有好用的应用 ...