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

[经验分享] Puppet之基础篇

[复制链接]
YunVN网友  发表于 2018-8-2 08:01:58 |阅读模式
  
  一、基本概念

  •   资源:是Puppet最基础的元素。资源可以是文件、服务、软件包、自定义脚本等。Puppet主要的特色就是处理资源与资源之间的依赖与关系
  •   属性:资源需要定义的相关属性值,通过属性的定义才知道资源在做什么
  •   类:将多个资源组织起来进行重新定义。
  •   模块:多个类的集合。
  •   变量:与其他语言类似,同样支持变量。
  •   参数:通常把传递给变量的值称为参数
  •   节点:Puppet的每一个客户端,即主机。Puppet在管理主机时要求与计算机配置的主机名保持一致,并建议采用DNS来管理主机名。
  
  二、语法与命令
  1、语法基础
  Puppet语法规则是以括号{}分类,以冒号 : 声明,以逗号 , 属性结束
  例: file {‘nginx’:
  ensure=> file,
  }
  注释

  •   #这是一个注释
  •   /*这是一个注释*/
  •   //这是一个注释,不建议使用这种
  变量的引用

  •   不包含变量的字符串应该使用单引号(’’)括起来。
  •   包含变量的字符串应该使用双引号(””)括起来,字符串中的所有变量应该使用花括号{}括起来
  例:“${::operatingsystem}is not supported by ${module_name}”

  •   对变量本身的引用最好不用花括号
  例:mode => $my_mode
  资源
  (1)资源名
  资源名采用单引号(’’)引起来,采用冒号:结尾。如果有变量的时候就用双引号引起来。
  例:package { ‘nginx’:
  ensure=> present
  }
  (2)对齐
  资源名称和各个符号之间都有一个空格
  (3)属性的顺序
  当声明一个资源时,应该先指定它的ensure属性,方便阅读
  (4)文件权限
  设置一个文件的权限时,需要将权限用单引号引起来
  例:
  file {‘/var/log/syslog’:
  ensure=> present,
  mode=> ‘0644’,
  }
  (5)资源默认值
  通常需要设置一些资源默认值,为一组资源指定一个默认的参数值,减少重复定义。资源默认值类似于全局变量。设置资源默认值时应将资源类型的第一个字母大写。最常见的用法是使用exec资源指定path变量目录,避免在以后使用命令时找不到操作系统的环境变量
  例:
  vim /etc/puppet/manifests/site.pp
  Exec { PATH => “/usr/bin:/usr/sbin:/usr/local/bin”}
  定义一个文件资源的用户默认值
  vim /etc/puppet/manifests/site.pp
  file {
  mode=> ‘0644’,
  owner=> ‘root’,
  group=> ‘root’,
  }
  类
  (1)文件名的命名方式
  在一个模块中,如果定义了一个类,且它还有子类,那么它的文件命名方式就是”子类名.pp“。比如定义一个apache的类,包含ssl与virtual_host两个类。那么在manifests目录同时有3个文件:init.pp、ssl.pp、virtual_host.pp。配置方法如下:
  # /etc/puppet/modules/apache/manifests
  #init.pp
  class apache {}
  #ssl.pp
  class apache::ssl {}
  #virtual_host.pp
  define apache::virtual_host () {}
  (2)关系声明
  声明两个资源之间的关系时,必须是从左到右的顺序进行,不能从右到左
  例: Package[‘httpd’]-> Service[‘httpd’]
  (3)类的继承
  表达方式如下:
  class ssh {}
  class ssh::client inherits ssh {...}#client 子类继承ssh类
  class ssh::server inherits ssh {...}#server子类继承ssh类
  2.语法检查
  puppet parservalidate init.pp #对init.pp做语法检查
  一次检查多个文件
  方法一:
  $ for file in $(find . -iname ‘*.pp’); dopuppet parser validate --color false --render-ass --modulepath=modules $file ;done;
  #通过find命令查找当前目录下pp结尾的文件,然后采用for循环执行puppet检查文件语法
  方法二:
  $ find -name ‘*.pp’ | xargs -n 1 -t puppetparser validate
  #通过find命令查找当前目录下以pp结尾的文件,通过管道传给xargs命令
  #-n 参数指定一次只处理一个变量,-t参数启用跟踪方式执行puppet检查文件语法
  代码的调试
  方法一:
  用logoutput输出更详细的信息
  例:
  $ vim test_output.pp
  exec { ‘test_logoutput’:
  command=> “/bin/ls linuxtone.org”,
  logoutput=> on_failure,
  }
  如果你想不管命令执行成功或者失败都输出错误信息,可以这样做:
  logoutput => true,
  方法二:
  用notify输出需要的信息,与执行一条echo语句的意义类似
  例:
  notify { “i am running on node $fqdn” }
  3、常用命令
  Puppet中所有命令都可以使用puppet help 命令查看。
  $puppet help
  agent                      #客户端进程,负责从Master获取数据
  apply                      #运行本地manifests
  ca                        #本地证书的管理
  catalog                     #编译、保存、查看Puppet代码,或转换成Catalogs
  cert                       #证书颁发,用于签署
  certificate                  #提供访问CA证书的管理
  certificate_request          #管理证书请求
  certificate_revocation_list      #管理撤销证书的列表
  config                      #配置选项
  describe                    #资源帮助
  device                      #管理远程网络设备
  doc                        #生成puppet文档
  facts                       #系统信息检索
  file                        #在filebucket中检索和存储文件
  filebucket                    #在filebucket中检索和存储文件
  help                       #查看帮助
  inspect                     #发送report报告
  instrumentation_date            #管理监听的数据
  instrumentation_listener          #管理监听状态
  instrumentation_probe            #管理监听探测
  key                        #创建、保存、删除证书密钥
  kick                       #远程控制agent,远程触发puppet agent命令
  man                        #查看手册
  master                      #服务端进程
  modules                     #从puppet forge创建、安装查询模块
  node                       #管理节点
  parser                     #解析器管理
  plugin                     #插件管理
  queue                      #队列进程
  report                     #创建查看报告
  resource                    #查看资源帮助
  resource_type                 #查看类、默认资源类型与节点信息
  secret_agent                 #模拟agent
  status                     #查看puppet状态
  其中常用命令有:
  puppet master
  puppet master 的主要功能是编译配置文件、模板
  常用参数:

  •   --daemonize 简写-D
  •   --no-daemonize
  •   --debug 简写-d
  •   --version 简写-V
  •   --verbose简写-v
  例:
  输出默认配置文件
  puppet master --genconfig>puppet.conf
  不启用后台守护进程方式运行,把信息显示出来
  puppet master --no-daemonize --verbose
  puppet agent
  puppet agent在每个节点以守护进程方式运行,每隔30分钟向master请求一次,以确定新的信息并询问是否有变更,然后负责运行编译好的catalog。
  常用参数:

  •   --certname                #指定客户端证书名称
  •   --daemonize
  •   --no-daemonize
  •   --debug
  •   --noop                   #模拟执行
  •   --test                   #测试
  •   --verbose
      例:
  测试连接master并模拟运行
  puppet agent --test --noop --verbose
  puppet apply
  运行命令,主要在检测manifests时或在没有网络的情况下使用
  常用常数:

  •   --debug
  •   --noop
  •   --verbose
  •   --loadclasses
  例:
  将输出信息输出到日志文件
  puppet apply -l /tmp/init.log init.pp
  在客户端运行命令,加载服务器端定义好的一个类
  puppet apply -e “include test” --noop
  puppet cert
  用于管理本地证书、查看、签署证书、废除、清除证书
  常用操作:

  •   clean                  #清除证书
  •   list                    #查看认证客户列表
  •   sign                    #签署证书
  •   revoke                   #废除已认证的主机
  •   verify                   #验证本地指定的认证
  常用参数:

  •   --all                    #执行所有操作
  •   --digest                  #设置证书指纹加密方式
  •   --debug
  •   --verbose
  例:
  查看请求认证的客户端列表
  puppet cert list
  为主机dx.a1.com签署认证
  puppet cert sign dx.a1.com
  列出所有签名和为签名的证书
  puppet cert list --all
  清除所有证书
  puppet cert clean
  puppet kick
  用于连接到agent客户端让它主动运行puppet agent --test命令,类似于主动触发配置。最常见的用法是指定一个类主机或一组主机。或指定匹配主机只运行带”tag”标志的类。
  要使用puppet kick需要做如下配置:
  (1)设置puppet agent所有节点的/etc/puppet/puppet.conf在[agent]字段增加 listen=true
  (2)设置puppet agent所有节点的防火墙开发8139端口
  (3)设置puppet agent所有节点/etc/puppet/auth.conf  path /之前增加
  path /run
  method save
  auth any
  allow puppet-master.domain.com
  常用参数:

  •   --all
  •   --class                        #指定类
  •   --debug
  •   --host                         #指定主机
  •   --parallel                      #并发连接,提高效率,但会导致master压力增大
  •   --tag                        #指定标签
  例:
  指定主机执行kick操作
  puppet kick -p 10 host1 host2
  puppet describe
  提供资源的类型等帮助信息
  常用参数:

  •   --help
  •   --providers                     #列出类型详细说明
  •   --list                        #列出所有类型
  例:
  查看所有的资源类型
  puppet describe --list
  列出资源的providers
  puppet describe file --providers
  三、资源
  资源是puppet最基础的元素,每个资源的定义都具有标题、类型以及一系列的属性。puppet的特色就是处理资源之间的依赖关系。
  资源定义有如下特性:
  l  puppet使用title在编译时区分每个资源,使用命令变量在执行是区分资源
  l  在同一类型的资源中title和namevar都是唯一的
  l  每个类型都有部分属性有默认值
  l  如果不指定namevar,则默认赋予其title的值
  资源清单manifests
  puppet系统中有两个地方会出现manifests
  /etc/puppet/manifests主要用于管理主机(节点)信息,其中会存放puppet主配置文件site.pp,用于定义全局变量及主机的加载。而在定义模板时会在模块目录中创建manifests目录,即/etc/puppet/modules/modules_name/manifests,这里的manifests是用来管理模块的代码文件,其中init.pp是主文件,其余.pp文件可以使用require或include加载。
  资源之间的依赖关系
  require
  引用一个或多个依赖的对象,引用的对象执行之后该资源才被应用
  before
  与require相反,本资源执行成功后,before引用的对象才被应用
  before和require不具备触发功能,只表示依赖关系。
  subscribe
  类似require,引用一个或多个依赖的对象,当引用的对象资源发生改变时,执行相应动作,相当于监测某个资源
  notify
  类似before,引用一个或多个依赖的对象,当该资源对象发生改变时,通知某个资源进行更新
  通常在相关的依赖资源配置中,只需配置一个,例如file文件资源发生改变时利用notify属性通知service资源重启服务。或service资源利用subscribe属性探测到file文件资源进行更新时重启服务。
  例:
  指定某个资源依赖于某个类

  require =>>  指定某个资源依赖于软件包及某个类
  require => [ Package[‘test’],Class[‘testclass’]
  注意:
  在编写资源清单时有两处要用到首字母大写
  (1)定义资源的默认值
  例:
  在site.pp配置文件中使用exec资源定义全局path变量
  Exec { path =>“usr/local/sbin:/xxxxxx..” }
  (2)资源之间的依赖关系
  在利用before、notify、require、subscribe等参数定义资源之间的依赖时,被依赖的资源名称应该使用首字母大写
  例: require =>Package{‘aaa’}
  常用资源:
  (1)用户资源user
  用户资源user即管理系统用户。常用参数:

  •   ensure:指定用户是否存在,创建用户使用present,删除用户使用absent
  •   expiry:过期时间
  •   gid:用户组ID
  •   groups:用户组
  •   home:家目录
  •   shell:指定shell
  •   system:指定是否系统用户
  •   uid:用户ID,不指定自动选择
  •   passwd:密码
  例:
  创建用户dx并指定uid为555,shell为/bin/bash,家目录,过期时间
  user {‘dx’:
  ensure=> present,
  uid=> 555,
  shell=> ‘/bin/bash’,
  home=> ‘/home/dx’,
  expiry=> ‘2018-8-8’,
  }
  (2)用户组资源group
  group即管理系统用户组。常用参数:

  •   ensure:创建present,删除absent
  •   name:组名
  •   gid:组ID
  •   groups:组名
  •   members:组成员管理
  •   system:指定是否创建系统组
  例:
  创建一个gid为15的dx组,组内有两位用户成员aa和bb
  groups { ‘dx’:
  ensure=> present,
  name=> ‘dx’,
  members=> [ ‘aa’,’bb’],
  }
  (3)软件安装package
  常用参数:

  •   configfiles:是否保留或者替换软件的配置文件,大多数软件不支持这个参数,可设置false和true
  •   ensure:设置软件包状态。installed表示要安装该软件,也可以学成present,obsent卸载,pureged干净的移除该软件,latest表示安装软件包的最新版本。
  •   name:该资源的名字,即软件包的名字
  •   install_options:以数组形式附加到安装选项,通常使用INSTALLDIR来指定软件安装路径
  例:
  确保nginx已安装
  package { ‘nginx’:
  name=> ‘nginx’,
  ensure=> present,
  }
  确保nginx软件包版本为仓库中的最新版本(指定yum源中的最新版本)
  package { ‘nginx’:
  ensure=> lastest,
  }
  指定软件的安装版本
  package { ‘nginx’:
  ensure=> ‘1.2.5’,
  }
  指定软件包管理器进行安装
  package { ‘nginx’:
  provider=> apt-get,
  ensure=> present,
  }
  指定本地软件包安装
  package { ‘rack’:
  ensure=> present,
  provider=> gem,
  source=> ‘/home/rack.gem’,
  }
  指定远程软件包进行安装
  package { ‘screen’:
  ensure=> present,
  provider=> rpm,
  source=> http://$fileserver/screen.rpm,
  }
  安装多个软件包
  package { [‘nginx’,’httpd’,’mysql-server’]:
  ensure=> present,
  }
  (4)文件管理file

  •   file可以管理文件、目录、符号连接、属性、权限等
  •   常用参数:
  •   ensure:值可以为删除absent,文件file,目录directory,文件present(检查文件是否存在,如果存在则不创建)
  •   backup:通过filebucket备份文件
  •   checksum:检查文件是否被修改的方法,默认检查方法为md5
  •   ctime:只读属性,文件的ctime
  •   mtime:
  •   content:文件的内容,与source和target属性互斥
  •   force:强制执行删除文件、软连接及目录的操作。下列三种情况需要使用force属性:清空子目录、修改文件或软连接的目录、删除目录时确保ensure=absent
  •   owner:用户名或用户ID
  •   group:指定该文件的用户组,可以是组名或ID
  •   ignore:忽略指定的匹配文件、可以匹配目录结构
  •   link:软件连接
  •   mode:文件权限配置,通常使用数字符号,例0644
  •   path:文件路径,必须使用双引号,不定义title时path等于资源的title
  •   purge:清空目录中未在puppet manifest中定义的文件或目录,必须与recurse=>true同时使用
  •   recurse:递归目录,值为true、false、inf、remote
  •   replace:判断当本地已存在的文件与source或content指定的文件内容不同时是否覆盖。如果设置为false,则允许文件资源初始化时忽略本地已存在的文件,即本地文件不发生变化。这个特性只对文件内容有影响。默认值为true
  •   source:源文件,从哪下载文件至本地,或者从本地读取
  •   target:指定目标,符号链接专用
  •   type:只读状态检查文件类型
  例:
  创建一个文件
  file {‘/tmp/aa.txt’:
  ensure=> file,
  }
  指定资源title为test,利用path属性指定文件路径
  file { ‘test’:
  path=> ‘/tmp/test’,
  ensure=> present,
  }
  以上代码为简写方式,在使用require等参数进行资源依赖的时候可以直接指定资源的title,不用写太长的path内容,如
  require => File[‘tmp/test’],
  创建一个目录
  file { ‘/tmp/aa’:
  ensure=> directory,
  }
  创建一个符号链接
  file {‘/tmp/testlink’:
  ensure=> ’link’,
  target=> ‘/tmp/testlink’,
  }
  将服务器文件同步至本地
  file { ‘test’:
  name=> ‘/tmp/test’,
  ensure=> present,
  source=> ‘puppet:///modules/test/test’
  }
  注意!这里的‘puppet:///modules/test/test’,文件是存放在/etc/puppet/modules/test/files/test中的。source属性定义时使用的”///”是省略了本地puppetmaster的servername,在没有定义fileserver的情况下,puppet默认会去master模块本地的files文件目录查找
  (5)服务管理service
  常用参数:

  •   enable:用于开机自动启动,可以设置值为true或false
  •   ensure:服务的状态,停止false,运行true
  •   hasrestart:指出管理脚本是否支持restart参数,如果不支持,就使用stop/start实现restart的效果,可以设置值为true或false
  •   hasstatus:指出管理脚本是否支持status参数,可以设置值为true或false
  •   name:运行服务的名称
  •   path:指定查找init脚本的路径
  •   restart:可以指定重启命令
  •   start:指定启动命令
  •   status:指定状态命令
  •   stop:指定停止命令
  例:
  开启nginx服务,不随系统启动
  service { ‘nginx’:
  ensure=> ‘running’,
  enable=> false,
  }
  指定命令路径,确保服务运行并随系统启动而启动
  service { ‘nginx’:
  enable=> true,
  ensure=> running,
  path=> “/etc/init.d”,
  }
  通过指定restart属性来指定服务重启命令
  service { ‘nginx’:
  ensure=> running,
  enable=> true,
  hasrestart=> true,
  hasstatus=> true,
  subscribe=> File[ ‘nginx.conf’],

  restart=> “/etc/init.d/nginx>  }
  puppet在接收到事件通知并重启服务时,如果提供了一个明确的restart属性重启服务,puppet每次会先判断restart属性是否有值,如果有就执行restart值。如果没有,会再次根据hasrestart属性的定义判断脚本是否支持restart,如果不支持此参数,会以stop/start来实现restart效果。
  因此,restart与hasrestart这两个属性可以不同时进行定义
  (6)定时脚本cron
  定时脚本用于安装和管理系统cron作业。puppet会将任务写入/var/spool/cron目录与用户对于的文件中,/etc/crontab中原有的任务不会变。如果puppet指定的任务与现有的一致,puppet不会对它做任何修改。
  常用参数:

  •   ensure:可配置为present或absent
  •   command:需要执行的命令,通常使用双引号引起来
  •   environment:运行的环境变量配置,例如PATH=/bin
  •   hour:小时。0-23
  •   minute:分钟。0-59
  •   month:月。1-12
  •   monthday:月中的天,1-31
  •   weekday:星期几,0-7
  •   name:名称
  •   user:指定运行的用户,默认为root
  •   target:指定用户的cron项,默认为用户的shell
  例:
  每天早上6点执行一次ntpdate
  cron { ‘ntpdate’:
  ensure=> present,
  command=> “/usr/sbin/ntpdate ntpserver.domain.com”,
  user=> root,
  hour=> 6,
  minute=> 0,
  }
  (7)执行命令exec
  puppetlabs建议少用exec资源。常用参数:

  •   command:执行的命令。命令必须包含绝对路径或在path中定义了搜索路径
  •   creates:指定命令生成的文件。如果提供了这个参数,那么命令只会在所指定的文件不存在的情况下被执行。
  •   cwd:指定命令执行的当前目录
  •   environment:为命令设置额外的环境变量
  •   group:运行命令的用户组
  •   user:执行命令的用户
  •   logoutput:是否记录输出,默认为on_failure,可以定义为true或false
  •   onlyif:参数中设置的命令返回0时才执行,即成功时才执行
  •   path:执行命令的搜索路径
  •   refreshonly:该参数可以使命令变成仅刷新触发的,也就是说只有在一个依赖的对象被改变时,命令才会被执行。仅当命令与其他对象有依赖关系时,这个参数才有意义。当要触发某个行为时,这个参数会显得很有用。
  •   timeout:命令执行超时时间,默认300秒
  例:
  解压nginx.tar.gz至/tmp目录,如果“/tmp/myfile”文件不存在,则执行exec命令。如果文件存在则不执行
  exec { ‘tar -xvzf /tmp/nginx.tar.gz’:
  cwd=> ‘/tmp’,
  creates=> ‘/tmp/myfile’,
  path=> [ ‘/usr/bin’,’/usr/sbin’,’/bin’],
  }
  当文件被更新时触发该资源被执行
  #从服务端下载aliases文件
  file { ‘/etc/aliases’:
  source=> ‘puppet://server/module/aliases’,
  }
  exec { ‘newaliases’:
  path=> [‘/usr/bin’,’/usr/sbin’],
  subscribe=> File[“/etc/aliases”]
  refreshonly=> true,
  }
  以上代码,只有当文件/etc/aliases再次被更新时才触发newaliases动作。所有refreshonly需要配置subscribe和notify才有意义
  四、模块
  模块是多个类的集合。
  模块的结构:
  #/etc/puppet/modules/test模块
DSC0000.jpg

  模块的目录及命名通常以应用软件来命名,好处是可以一目了然的知道此模块的功能。每个模块都包含files(文件)、lib(插件)、manifests(资源)、templates(模板)四个目录和init.pp文件。当加载一个模块,会先加载manifests下的init.pp文件。
  详细说明:
  l  MODULE NAME:模块名称,也即模块目录名称;模块名称只能以小写字母开头,可以包含小写字母、数字和下划线,但不能使用“main”或“settings”作为模块名;
  l  manifests目录:包含当前模块的所有manifest文件;每个manifest文件必包含一个类或一个定义的类型,此文件访问路径格式为“ModuleName::[SubDirectoryName::]ManifestFileName”,注意manifiest文件名不需要其后缀.pp;
  l  init.pp:只能包含一个单独的类定义,且类的名称必须与模块名称相同;
  l  files目录:包含了一组静态文件,这些文件可被节点下载使用;每个文件的访问路径遵循puppet:///modules/MODULE_NAME/filename路径格式;
  l  lib目录:插件目录,常用于自定义fact及自定义资源类型等;
  l  templates目录:存储了manifest用到的模板文件,其访问路径遵循template('ModuleName/TemplateName')格式;
  l  tests目录:当前模块的使用帮助或使用范例文件,类似如何声明当前模块中的类及定义的类型等,不是必须;
  l  spec目录:类似于tests目录的功能,只不过,其是为lib目录中定义的各插件提供使用范例的,不是必须;
  模块的默认目录为/etc/puppet/modules,运行命令puppet apply --configprint modulepath可以查看。
  “puppet module list”可列出当前puppet上已经安装的所有模块。如果要安装模块,可使用“puppetmodule install <Module Name>”命令。
  以上图结构为例:创建一个nginx模块
  (1)创建所需的目录
  #mkdir -pv /etc/puppet/modules/test/{manifests,templates,files,lib}
  只创建manifests,templates,files三个目录也可以
  (2)创建init.pp
  #vim/etc/puppet/modules/test/manifests/init.pp
  class nginx {
  package{ ‘nginx’:
  ensure=> present,
  }
  service{ ‘nginx’:
  ensure=> running,
  enable=> true,
  subscribe=> File[‘nginx.conf’],
  }
  file{ ‘nginx.conf’:
  ensure=> present,
  mode=> 644,
  path=> ‘/etc/nginx/nginx.conf’,
  content=> template(“nginx/nginx.conf.erb”),
  }
  (3)创建模板
  可以把nginx.conf拷过来做修改即可,下面只截取部分做示例
  #user nobody;
  worker_processes  <%= processorcount %>;
  #error_log logs/error.log;
  #error_log logs/error.log  notice;
  #error_log logs/error.log  info;
  #pid       logs/nginx.pid;
  events {
  worker_connections  1024;
  }
  ...
  示例说明:
  nginx模块定义了一个nginx类,类中包含资源package、file、service,其中service依赖于file,nginx.conf文件内容采用content定义来源于template中对应的nginx.conf.erb模板内容
  
  五、类
  Class是用于通用目标或目的的一组资源,因此,它是命名的代码块,在某位置创建之后可在puppet全局使用。类似于其它编程语言中的类的功能,puppet的类可以继承,也可以包含子类。类的名称只能以小写字母开头,可以包含小写字母、数字和下划线。
  (1)类的定义

  class>  在同一个模块中定义了多个类,可以采用双冒号:: 例:
  class nginx { ... }
  class nginx::config { ... }
  class nginx::vhost { ... }
  config、vhost为nginx的子类
  (2)类的继承
  类的继承主要是一个类继承另一个类,且可以实现覆盖、追加资源属性
  下面以这个nginx模块代码为例来介绍类的继承
  定义nginx为父类,nginx::foo为子类。父类代码如下:
  class nginx {
  service{ ‘nginx’:
  ensure=> running,
  enable=> true,
  require=> File[‘nginx.conf’]
  }
  }
  例:
  继承(对原有参数不做修改原样写上)、覆盖资源属性
  nginx::foo inherits nginx {
  service[‘nginx’]{ ensure=> running,enable => false }
  }
  追加资源属性
  nginx::foo inherits nginx {
  service{ ‘nginx’:
  require+> [ File[‘nginx.conf’],File[‘foo.conf’] ],
  }
  }
  (3)带参数的类
  同一个类在不同的OS上可能会略有不同,因此需要通过获取相应系统的fact来实现有区别对待。然而,万一相应的OS没有输出类所期望的fact或者是类依赖于非fact因素时,此机制将无法满足需求。此实就需要使用带参数的类来完成此类功能,同时,在声明类时为其参数传递相应的值即可完成传参功能。
  在定义在带参数的类时,需要将参数声明在类名后的小括号“()”,参数可以有默认值;如果使用多个参数,彼此间要使用逗号分隔。在类的内部使用参数的方式同使用本地变量。下面的示例定义了一个具有两个参数的类:
  class mysql ($user = 'mysql', $port = 3306) {
  ...
  }
  向类传递参数时,即调用时,其方式如同定义资源的属性,因此,其也称为“资源属性风格的类声明”,其语法格式如下
  class {'class_name':
  para1 => value1,
  para2 => value2,
  ...
  }
  例如,向上述的mysql类的$user参数传递一个与默认mysql不同的值的方式如下所示。
  class {'mysql':
  user => mysqlserver,
  }
  如果使用mysql类默认值的话,直接用include mysql 就好了
  注意,不能在使用include声明类时向其传递参数,也就是说不能在include函数中为声明的类指定参数值。对于带参数的类来说,如果使用其参数的默认值,仍然可以使用include声明类,否则就必须使用“资源属性风格的类声明”。另外,如果在使用不同的参数值将某个类声明了多次,最后生效的声明将很难判定。
  六、模板
  模板的定义与声明
  puppet模板主要是基于ERB模板语言的。在模板中可以使用的变量是调用次模板的当前类中的所有变量,包含facts、全局变量、在类中定义的当前作用域变量。
  (1)标签
  除打上标签的内容外,ERB模板中的内容会原封不动的传送回puppet。ERB标签如下,可包含一行或多行:
  <% document = “” %>
  (2)打印、输出表达式
  要打印或输出一个表达式,这样写,经常会用到这个输出获取到的facter信息
  <%= aaa %>
  (3)注释
  注释不会被解析为代码也不会显示输出
  <%# ... %>
  模板结合
  如果有多个模板时,可以使用逗号进行结合,例:
  template(‘my_module/template1.erb’,’my_module/template2.erb’)
  模板还支持数组、条件表达式,用到的时候再做详细了解吧
  七、节点
  puppet每个客户端都称为节点。所有的节点都需要在站点文件中进行定义,采用import的方式进行引用。一般都会以主机名来命名节点配置文件,做到一目了然。
  例:
  nodes目录下存在多个节点配置文件,可以在site.pp中import所有节点文件
  #vim /etc/puppet/manifests/site.pp
  import “nodes/*.pp”
  节点配置文件分类存放
  #vim /etc/puppet/manifests/site.pp
  import “nodes/cnc/*.pp”
  import “nodes/ctc/*.pp”
  主机命名规范
  建议遵循以下规范:
  role-isp-idc-ip.centos.domain.com
  #角色名-运营商-机房名-机器IP.管理域名.com
  例:
  web-cnc-bj-174.129.158.192.centos.linuxtone.org
  节点继承
  如果某个上线的服务存在相同的网络环境,所有服务器都需要应用同一配置并定义同一变量,类似于系统环境的初始化,可以采用定义一个basenode默认节点的方法进行配置,其他主机节点采用 inherits 继承basenode的配置信息,如:
  node basenode {
  $my_puppet_server= “10.42.0.10”
  $my_local_network= “10.42.0.0/24”
  $my_syslog_server= “10.42.0.11”
  $my_ntp_server= “10.42.0.12”
  }
  node ‘www.domain.com’ inherits basenode {
  includegeneral
  includehttpd::php
  }
  以上代码www.domain.com继承basenode默认节点的属性,4个变量直接应用到该节点内,同时还包含了general和httpd::php两个类
  如果有需要,继承的时候可以覆盖其中的变量
  node ‘ntp.domain.com’ inherits basenode {
  $my_ntp_server= “0.pool.ntp.org”
  }
  默认类与默认节点
  定义默认类与默认节点的目的相同,这样定义默认类:
  class general {
  includeyum
  includehosts
  ...
  }
  默认节点的定义,除了定义basenode,我们还可以定义一个default,如果没有明确定义一个节点,将按default进行操作。default的定义存在puppet每次都会编译catalog的问题,也就是说不管所定义的default有没有在用,都回忆将它编译到catalog,如果没有使用的情况下,将会导致性能下降,如果没有特殊需求,建议采用basenode或baseclass(general)的方法实现。default定义如下:
  node default {
  $my_local_network= “10.42.0.0/24”
  }
  
  八、Facter
  facter最大作用就是获取服务器信息,这些信息包括主机名、IP地址、内存大小、操作系统等。
  使用方法:
  #facter
  或
  #facter fqdn
  即可输出当前主机的所有信息或其中一个信息
  结合条件语句的使用:
  if $operatingsystem == debian {
  package{ ‘apache’:
  ensure=> latest,
  }
  }
  else {
  package{ ‘apache’:
  name=> ‘http’,
  ensure=> latest,
  }
  }
  使用case条件判断
  case $operatingsystem {
  debian:{ $apache = “apache” }
  centos:{ $apache = “httpd” }
  default:{ fail(“unrecognized operating system for webserver”) }
  }
  package { ‘apache’:
  ensure=> latest,
  }
  
  九、标签
  tag用于为资源指定标签
  例:
  file { ‘/etc/nginx/nginx.conf’:
  ensure=> present,
  tag=> ‘ngx-conf-file’,
  }
  指定标签运行特定配置,例:
  客户端使用
  puppet agent --tags centos
  服务器端使用
  puppet kick -p 10 -t centos dx.domain.com
  在节点配置中指定
  通常会配合notify使用,如:
  tag(“nginx”)
  if tagged(“nginx”) {
  notify{ “this will succed”: }
  }
  用法还有很多,用到再详细了解吧

运维网声明 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-545023-1-1.html 上篇帖子: Puppet模块管理 下篇帖子: puppet入门与掌握之puppet介绍二(介绍篇)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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