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. windows下安装mysql遇到的问题

    windows下安装mysql5.6.41步骤:http://www.cnblogs.com/sjy18039225956/p/9203052.html 系统错误2详见MySQL安装过程net sta ...

  2. 深入理解JVM(3)——垃圾收集策略详解

    Java虚拟机的内存模型分为五部分:程序计数器.Java虚拟机栈.本地方法栈.堆.方法区. 程序计数器.Java虚拟机栈.本地方法栈都是线程私有的,也就是每个线程都拥有这三个区域,而且这三个区域会随着 ...

  3. Hibernate(5)session的方法

    1. Session缓存 Session缓存(Hibernate一级缓存),在 Session 接口的实现中包含一系列的 Java 集合, 这些 Java 集合构成了 Session 缓存.只要 Se ...

  4. JDBC(14)—对DAO进行改进修改

    结构: DAO2_7< T >(接口)->DAOTestImpl< T >(实现类)->CustomerDAO(继承的子类)->CustomerDAOTest ...

  5. 最新版Xamarin Mono For Android、Monotouch 安装、破解(实时同步更新)

    以上链接如不是最新,以官方为主,官方更新地址如下:http://xamarin.com/installer_assets/v3/Mac/Universal/InstallationManifest.x ...

  6. 【独家】硅谷创业公司在中国常跌的五个坑|禾赛科技CEO李一帆柏林亚太周主题演讲

    [独家]硅谷创业公司在中国常跌的五个坑|禾赛科技CEO李一帆柏林亚太周主题演讲 李一帆 Xtecher特稿作者 关注  Xtecher推荐   演讲者:李一帆   翻译:晓娜   网址:www.xt ...

  7. Oracle 学习笔记 10 -- 约束

    本次笔记来学习约束,约束在表中无处不在. 比如,表中的数据不同意为空或者是表中id为设为主键,都是约束. 约束分类:         主键约束(PRIMARY KEY):主键表示表中一个唯一的标识,本 ...

  8. V-rep学习笔记:切削

    V-REP allows you to perform cutting simulations. The user can model almost any type of cutting volum ...

  9. 安装Docker,Asp.net core

    升级项目到.NET Core 2.0,在Linux上安装Docker,并成功部署 Docker从入门到实践 一.安装Docker a).设置Docker仓库 1.按惯例,首先更新Ubuntu的包索引 ...

  10. puppeteer:官方出品的chrome浏览器自动化测试工具

    puppeteer发布应该有一段时间了,这两天正好基于该工具写了一些自动化解决方案,在这里抛砖引给大家介绍一下. 官方描述: Puppeteer is a Node library which pro ...