puppet的变量类型

puppet变量必须要$符开头,不管是定义还是引用

变量是有作用域的,一个变量的作用域受限于类、模块等 而且引用一个变量,如果不是在当前作用域的变量的话,要引用必须使用它的FQN,而且引用时必须用双冒号隔开

FQN表示:

$::abc

如果在node scope中则加上node名称即可

撤销值:

$abc=undef

正在匹配

只能在几个有限能接受正在的地方才可以定义

比如=~以及!~匹配操作符的位置,才能够使用正在表达式

·属于puppet的非标准数据类型不能赋值给变量,仅能用户有限的几个接受正则表达式的地方

即使用=~ 和 !~ 匹配操作符的位置,通常包括case语句中的selector 以及各节点名称匹配的位置

它们不能传递给函数或者用于资源属性的定义;

·puppet中的正则表达式支持使用(?<ENABLED OPTION>:<SUBPATTERN>)和(?-<DISTABLED OPTION>:<SUBPATTERN>)

两个特殊符号

如果做正则匹配的时候启用选项i(忽略大小写),但是不支持使用m(将.作为换行符)和 x (忽略模式中的空白字符和注释)

例:

以往正在表达式,匹配centos或redhat开头:

^/(centos|redhat)/linux/ig

而puppet则需要以下方式:

(?i:^(Redhat|CentOS))

忽略大小写

(?i-mx:^(Redhat|CentOS))

例:

如果是某个系统则显示某条信息

首先做简单判断

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

#而后复制完成之后则package则有个值,那么其要么是httpd要么是apache2

#因为会直接返回字符串

现在我们想显示puppet的值:

notify {'notice':
        message => "Install$Package",
}

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

notify {'notice':
        message => "Install$Package",
}

puppet的条件判断语句

puppet2.7之后支持3种判断,分别是

if , case , selector

puppet3.0之后支持4种判断,分别是

if , case , selector , unless

if语句

单分支语句:

if condition {

statement

}

双分支语句

if condition {

Statement

……

}

else {

statement

}

多分支语句

if condition {

statement

}  elsif {

statement

}

else {

statement

}

条件

·变量

·表达式

·有返回值的函数

例:

如果某变量大于30则显示old man 如果小于30则显示youngman

[root@node3 if]# cat test1.pp

$test = 21

if $test > 30 {

notice('old man')

} else {

notice ('young man')

}

[root@node3 if]# puppet applytest1.pp

Notice: Scope(Class[main]): young man

Notice: Compiled catalog fornode3.test.com in environment production in 0.06 seconds

Notice: Finished catalog runin 0.03 seconds

判断当前操作系统如果是redhat系列则显示httpd如果是debian|ubuntu则显示apache2

这里需要用到变量operatingsystem ,其作用是显示当前操作系统的类型

具体可以使用facter命令来查看当前所提供的变量

[root@node3 if]# facter -p |grep ope

operatingsystem => CentOS

[root@node3 if]# cat test2.pp

if $operatingsystem =~/(?imx:^(centos|redhat))/ {

notice 'installed httpd'

} elsif $operatingsystem =~/(?imx:^(debian|ubuntu))/ {

notice 'installed apache2'

} else {

notice 'unkown OS'

}

[root@node3 if]# puppet applytest2.pp

Notice: Scope(Class[main]): installed httpd

Notice: Compiled catalog for node3.test.comin environment production in 0.06 seconds

Notice: Finished catalog runin 0.04 seconds

定义资源引用,将匹配的程序进行安装,完善如下:

[root@node3 if]# cat test3.pp

if $operatingsystem =~/(?imx:^(centos|redhat))/ {

$package = 'httpd'

notice 'installed httpd'

} elsif $operatingsystem =~/(?imx:^(debian|ubuntu))/ {

$package = 'apache2'

notice 'installed apache2'

} else {

notice 'unkown OS'

}

package {"$package":        #引用变量

allow_virtual => false,

ensure => installed,

}

[root@node3 if]# puppet applytest3.pp

Notice: Scope(Class[main]):installed httpd

Notice: Compiled catalog fornode3.test.com in environment production in 0.83 seconds

Notice:/Stage[main]/Main/Package[httpd]/ensure: created

Notice: Finished catalog runin 26.86 seconds

类(class)

命名的代码块,可以调用其代码块,类似于shell中的函数

不调用是不会被执行的

类是用于通用目标的一组资源,因此它的命名的代码块,在某位置创建之后可在puppet全局使用,只不过调用的时候,调用类和调用变量是近似的,有的时候是需要定义作用于的

如下所示

class httpd{
package {'httpd':
        ensure => installed,
        before =>File{'/etc/httpd/conf/httpd.conf'}
     }

file{'/etc/httpd/conf/httpd.conf':
        ensure => file,
        source =>'/backup/httpd/conf/httpd.conf',
        mode => 0644,
        owner => root,
        group => root,
        notify => Service['httpd'],
      }

service {'httpd':
        ensure => running,
        #subscribe =>File['/etc/httpd/conf/httpd.conf'],
        }
}

include httpd

一个例子

class apache {

package {'httpd':

ensure => installed

}

file {'httpd.conf':

path =>'/etc/httpd/conf/httpd.conf',

ensure => file,

require => Package['httpd'],

}

service {'httpd':

ensure => true,

require => Package['httpd'],

subscribe => File['httpd.conf'],

}

}

声明class

这样声明的好处是因为类可以带参数的

在带参数的类,在传递参数的时候使用类似于资源声明风格的类声明就很有必要了

同样是一个类,比如nginx类,但有时候装的nginx还有另外一个变种叫tengin,虽然名字叫tengin 但是它的服务脚本和配置文件仍然是nginx

[root@node3 class]# cattest2.pp

class httpd {

package {'httpd':

ensure => installed,

before => File['/etc/httpd/conf/httpd.conf'],

}

file {'/etc/httpd/conf/httpd.conf':

ensure => file,

source => '/backup/httpd/conf/httpd.conf',

mode => 0644,

owner => root,

group => root,

notify => Service['httpd'],

}

service {'httpd':

ensure => true,

}

}

class {'httpd':}

相比include,带参数的class 更具灵活性

类的继承

当定义好一个类以后,类给的信息还不够详细的话,则可以在其基础之上再次细化

在原有基础上再新增一些属性或条件判断属性

比如我们需要安装nginx使其做web服务,或做反向代理

例:

class nginx {
    package {'nginx':
        ensure => installed,
    }
}

只安装程序包,那么服务启动和配置安装都没有管理,因为用在反向代理配置中和直接用在webserver中是不一样的,因此在这基础上可以根据各自的需要去丰满它

所以,如下所示:

使用inherits 为继承nginx

[root@node3 class]# catnginx.pp

class nginx {

package {

ensure => installed,

}

}

class nginx::webserverinherits nginx {

file {'/etc/nginx/nginx.conf':

ensure => file,

mode => 0644,

user => root,

group => root,

source => '/backup/nginx/conf',

requrie => Package['ninx'],

}

service{'nginx':

ensure => true,

subscribe => File['/etc/nginx/nginx.conf'],

}

}

class {'nginx':}

如果我们想使其做反向代理,而其有指定的配置文件,那么则需再继承新的类

class nginx {
    package {'nginx':
     ensure => installed,
    }
}

class nginx::web inherits nginx {
    file {'/etc/nginx/nginx.conf':
        ensure => file,
        mode => 0644,
        owner => root,
        group => root,
        source => '/backup/conf/nginx/nginx.conf',
        require => Package['nginx'],
    }

service {'nginx':
     ensure => true,
     subscribe => File['/etc/nginx/nginx.conf'],
    }
}

include nginx::web

如果我们想让其做proxy的功能,那么可以引用其他类,如下所示:

class nginx {

package {'nginx':

ensure => installed,

}

}

class nginx::web inheritsnginx {

file {'/etc/nginx/nginx.conf':

ensure => file,

mode => 0644,

group => root,

owner => root,

source => '/backup/conf/nginx/nginx-web.conf',

require => Package['nginx'],

}

service {'nginx':

ensure => true,

subscribe =>File['/etc/nginx/nginx.conf'],

}

}

classnginx::proxy inherits nginx {

file {'/etc/nginx/nginx.conf':

ensure => file,

mode => 0644,

owner => root,

group => root,

source =>'/backup/conf/nginx/nginx-web.conf',

require => Package['nginx'],

}

service {'nginx':

ensure => true,

subscribe => File['/etc/nginx/nginx.conf'],

}

}

includenginx::proxy

以上所继承的类完全不一样

假如我们当前节点想安装web则声明web类,如果想安装的是代理服务器那么则声明proxy类

include nginx::         #表示只执行第一个类,而proxy是不会被执行的

include nginx::proxy    #表示执行proxy类,同时也会继承父类

puppet之判断和class相关推荐

  1. puppet recurse 导致的性能问题一例

    很久之前使用puppet时遇到的一个问题,简单分享下. 1.监控team报一台机器的swap报警,机器内存使用出现问题,导致系统开始使用swap. 2.登录服务器,通过top –d 1 –c查看系统状 ...

  2. 自动化运维工具之puppet简单实用

    一.简介 什么是puppet编辑 puppet是一种Linux.Unix.windows平台的集中配置管理系统,使用自有的puppet描述语言,可管理配置文件.用户.cron任务.软件包.系统服务等. ...

  3. puppet运行慢的一个小例子

    一个小例子来看下怎么debug puppet运行慢的问题. 一个小例子来看下怎么debug puppet运行慢的问题. 发现一台机器的agent运行比较缓慢,首先看下puppet server的整体性 ...

  4. puppet yum模块、配置仓储、mount模块

    转载:http://blog.51cto.com/ywzhou/1577335 作用:自动为客户端配置YUM源,为使用yum安装软件包提供便捷. 1.服务端配置yum模块 (1)模块清单 [root@ ...

  5. puppet 深入讲解

    一.Modules概述 到目前为止,关于puppet的资源申报.定义类.声明类等所有功能都只能在一个manifest(清单)文件中实现,但这却非最有效的基于puppet管理IT基础架构的方式 实践中, ...

  6. 客户端安装服务器的路径查找文件,柴少鹏的官方网站-puppet系列(一)之puppet的部署、配置文件以及命令详解...

    一.puppet的介绍(文字解释部分参考了权威指南) 作为自动化运维管理老大哥级别的软件,这个词大家都很熟悉了,我也就不阐述什么发展史啊,跟其他工具的对比了.不过有一点是要注意的,puppet分为社区 ...

  7. puppet自动化运维之exec资源

    Puppet通过exec来执行外部的命令或者脚本,一般来讲是shell脚本. 这里面就涉及到一个重复执行的问题,因为默认的agent一连接上来就会自动执行对应的命令或者脚本.如果脚本重复执行对系统没影 ...

  8. 自动化配置和部署工具--puppet(1)--什么是puppet

    参考网站:http://blog.chinaunix.net/uid-24250828-id-3882898.html http://369369.blog.51cto.com/319630/7858 ...

  9. puppet全方位学习之总结

    2019独角兽企业重金招聘Python工程师标准>>> puppet总结 一.基础知识 1. Puppet是开源的基于Ruby的系统配置管理工具,依赖于C/S的部署架构.Puppet ...

最新文章

  1. puppet企业架构部署
  2. 有效括号 python_python 有效的括号的实现代码示例
  3. 近世代数--素理想和极大理想--有单位元的交换环,每个极大理想都是素理想
  4. js一个按钮弹出两个按钮_没有电位器,用两个按钮可以实现变频器调速吗?
  5. java calendar_Java Calendar getLeastMaximum()方法与示例
  6. Ntdll32.dll病毒清除办法
  7. phpmyadmin在nginx环境下配置错误
  8. 通过JS制作一个简易数码时钟
  9. 联想y470上三代cpu_联想Y470笔记本i3处理器能换i5或者i7处理器嘛?
  10. 申城一叙:SDCC 2017·上海站数据库专场讲师+议题抢鲜版纵览
  11. Contradiction Detection with Contradiction-Specific Word Embedding
  12. 为什么说龙妈能活到最后?
  13. 块级和图片的1px间隙
  14. 要用什么态度去面对生活?
  15. 维基解密再爆料:CIA 2008年就开始监控iPhone了
  16. 天龙八部科举答题问题和答案(全8/8)
  17. LU_ASR01语音模块使用
  18. 从因果关系来看小样本学习
  19. 小程序服务器域名和业务域名的总结和配置
  20. springboot瘦身打包

热门文章

  1. C++ 常量类型 const 详解
  2. 哭!有人偷了我的漏洞报告,还冒领了奖金!
  3. go数据类型之map
  4. [数位DP]JZOJ 3363 Number
  5. Django扩展 —— uwsgi+nginx部署
  6. 为什么用 Java:一个 Python 程序员告诉你
  7. TeeChart的X轴,使用伪装的时间
  8. WinForm两点注意的地方
  9. SEO 搜索引擎优化技巧
  10. gdb 调试带参数的程序-转