设为首页 收藏本站
查看: 861|回复: 0

[经验分享] puppet之判断和class

[复制链接]

尚未签到

发表于 2018-8-2 11:39:37 | 显示全部楼层 |阅读模式
  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 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 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类,同时也会继承父类

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-545319-1-1.html 上篇帖子: centos7 简单安装puppet 下篇帖子: puppet之模块详解
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表