zi663227 发表于 2018-8-1 13:45:00

puppet完整模块实例分步解读

  本文示例针对puppet自身模块,详细解读模块的结构及语法应用,通过本例的学习,可以掌握puppet模块应用的技能,为自动化应用打下坚实基础。
  下面就以agent为例分步测试
  1创建puppet模块目录结构
  # cd /etc/puppet/modules/                        #进入模块主目录
  #mkdir puppet                               #创建puppet模块主目录
  #cd puppet
  #mkdir files manifests templates   #创建模块目录结构
  #tree ../puppet
  ../puppet
  ├── files#存放下载的文件
  ├── manifests#存放puppet配置
  └── templates#存放配置模板,方便pp文件引用
  2创建模块puppet配置文件
  # cd manifests
  # touch init.pp config.pp install.pp params.pp service.pp
  # tree ../
  ../
  ├── files
  ├── manifests
  │   ├── config.pp            #管理模块puppet配置
  │   ├── init.pp                   #管理模块所有pp文件配置
  │   ├── install.pp               #管理puppet应用安装
  │   ├── params.pp            #管理模块中变量以及一些判断
  │   └── service.pp             #管理puppet服务
  └── templates
  3编写模块配置文件
  整个过程是这样的,首先应该安装puppet(install.pp),然后配置puppet(config.pp),最后启动puppet服务(service.pp)
  3.1 编辑init.pp
  # vim init.pp
  class    puppet{      #创建模块puppet类
  include puppet::install      #包含子类install,可以是install.pp文件,也可以直接写入本文件
  }
  3.2 编辑install.pp
  注意:class名称要和创建的模块名保持一致,名称为puppet,由于在整个配置文件中init.pp为起始配置文件,包含的都应该是子配置文件,所有应该写成“class主类名称::class子类名称”,而class子类名称需要和创建的pp文件名保持一致,比如puppet::install,那么创建的子类名称就应该是install.pp
  # vim install.pp
  class    puppet::install{      #包含下面两个子类
  include puppet::puppet_install,puppet::facter_install
  }
  class puppet::puppet_install{
  package { 'puppet':
  ensure => installed,    #处于被安装状态
  }
  }
  class puppet::facter_install{
  package { 'facter':
  ensure => installed,
  }
  }
  也可以写成下面格式
  # vim install.pp
  class puppet::install{#一个类包含两个资源
  package { 'puppet':
  ensure => installed,
  }
  package { 'facter':
  ensure => installed,
  }
  }
  具有判断版本的写法
  # vim install.pp
  class puppet::install{
  include puppet::puppet_install,puppet::facter_install
  }
  class puppet::puppet_install{
  package { 'puppet':
  ensure => $operatingsystemmajrelease ?{ #判断系统版本
  5 => '2.7.25-1.el5',
  6 => '2.7.25-1.el6',
  }
  }
  }
  class puppet::facter_install{
  package { 'facter':
  ensure => $operatingsystemmajrelease ?{
  5 => '1.7.5-1.el5',
  6 => '1.7.5-1.el6',
  }
  }
  }
  3.3 编辑site.pp
  将模块应用到agent上
  # vim /etc/puppet/manifests/site.pp
  $master = 'master.puppet.com'
  node 'master_cert.puppet.com'{
  includetest,puppet
  }
  node 'agent1_cert.puppet.com'{
  includetest,puppet
  }
  node 'agent2_cert.puppet.com'{
  includetest,puppet
  }
  node 'agent3_cert.puppet.com'{
  includetest,puppet
  }
  所有节点都使用相同的模块,也可以是以下写法
  # vim /etc/puppet/manifests/site.pp
  $master = 'master.puppet.com'
  class environments{
  include motd,puppet
  }
  node default{
  include environments
  }
  简单测试
  # puppet agent -t --noop    #通过--noop进行尝试性测试,可以看到节点变化情况
  3.4 编写config配置
  编写params.pp文件,增加certname变量
  # vim params.pp
  class puppet::params {
  $puppetserver = 'master.puppet.com'#增加puppetserver变量指向master名称
  case $hostname{   #增加certname变量
  agent1: {
  $certname = 'agent1_cert.puppet.com'
  }
  agent3: {
  $certname = 'agent3_cert.puppet.com'
  }
  default: {#设置默认不存在的情况下报错
  fail("certname is not supported on ${::operatingsystem}")
  }
  }
  }
  编写puppet.conf.erb模板
  puppet的erb模板的存在是为了解决每个节点单独配置一个文件的问题,因为erb模板可以引用fact变量,变量的内容会根据节点系统的不同而变化。
  # vim ../templates/puppet.conf.erb
  ### config bypuppet ###
  
  logdir = /var/log/puppet
  rundir = /var/run/puppet
  ssldir = $vardir/ssl
  
  classfile = $vardir/classes.txt
  localconfig = $vardir/localconfig
  server = <%= scope.lookupvar('puppet::params::puppetserver') %>#引用变量puppetserver
  certname = <%= scope.lookupvar('puppet::params::certname') %>#引用变量certname
  runinterval = 10
  编写config.pp
  # vim config.pp
  class puppet::config{
  include puppet::params                                           #添加引用关系,
  file { '/etc/puppet/puppet.conf':                              #节点文件存放的路径
  ensure=> present,                                                 #要求存在
  content => template('puppet/puppet.conf.erb'),#要求根据模板生成,路径写法为相对路径(templates目录隐藏掉)
  owner   => 'root',                                                #要求文件属主为root
  group   => 'root',                                                #要求文件属组为root
  mode    => '0644',                                                #要求文件权限为644

  require =>>  }
  }
  3.5 编写service.pp文件
  # vim service.pp
  class puppet::service{
  service { 'puppet':
  ensure   => running,#设置puppet服务一直处于运行状态
  hasstatus=> true,#通过标准的命令“service server_name status"进行检查状态
  hasrestart => true,#设置puppet服务具有标准的restart命令
  enable   => true,#要求开机自动启动,其实通过chkconfig设置puppet状态为on
  }
  }
  3.6 更新config.pp文件,增加通知服务重启功能
  # vim config.pp
  class puppet::config{
  include puppet::params
  file { '/etc/puppet/puppet.conf':
  ensure=> present,
  content => template('puppet/puppet.conf.erb'),
  owner   => 'root',
  group   => 'root',
  mode    => '0644',

  require =>>
  notify=>>  }
  }
  3.7 添加class puppet::service puppet::config到init.pp中
  # vim init.pp
  class puppet{
  include puppet::install,puppet::config,puppet::service
  }
  结语:配置文件编辑完成后,可在agent上测试是否正常,到此,模块完整结构已经详细分步展示,每一步后均可以自我调整测试,依照这种模块结构,可以移植到其他模块应用,语法上也可以尝试多变,配置有很强的灵活性。
页: [1]
查看完整版本: puppet完整模块实例分步解读