辍耕录 2018-03-23
puppet变量:
1、名称必须以$开头;赋值使用=,支持追加赋值+=;
2、每个变量都有两种引用格式:简短名称和FQN(完全限定名称)
绝对路径:$::scope::scope::variable
$webserver= package{"$webserver": ensure => present, }3、 变量赋值可以赋除正则表达式这种非标准数据类型的其他一切数据类型。
数据类型
前面说了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语句
selector语句和case语句的区别在于,case语句 条件为真后 后面执行一段代码可以没有返回值,而selector语句条件为真时,后面 必须是一个有返回值的类型。
类似于case,但分支的作用不在于执行代码片段,而是返回一个直接值:
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 }