20171204 Puppet(二)

  • Puppet模块
  • Puppet部署master/agent模式
  • Puppet多环境配置
  • Puppet kick机制

一、Puppet模块

  • 模块就是一个按约定的、预定义的层级结构存放了多个文件或子目录的目录,目录里的这些文件或子目录必须遵循一定格式的命名规范

  • puppet会在配置的路径下查找所需要的模块,默认路径:/etc/puppet/modules和/usr/share/puppet/modules

(一)puppet模块目录结构

  • MODULES_NAME/:
    模块名只能以小写字母开头,可以包含小写字母、数字和下划线,但不能使用"main"和"settings"

  • 模块名目录下的子目录:

    • manifests/:类定义文件
      init.pp:必须存在一个类定义,类名称必须与模块名称相同
    • files/:静态文件
      类定义中的格式(puppet URL):puppet:///modules/MODULE_NAME/FILE_NAME
    • templates/:
      类定义中的格式:tempate('MOD_NAME/TEMPLATE_FILE_NAME')
    • lib/:插件目录,常用于存储自定义的facts以及自定义类型
    • spec/:类似于tests目录,存储lib/目录下插件的使用帮助和范例
    • tests/:当前模块的使用帮助或使用范例文件
  • 注意:
    1、puppet 3.8及以后的版本中,资源清单文件的文件名要与文件子类名保持一致,例如某子类名为"base_class::child_class",其文件名应该为"child_class.pp"
    2、无需在资源清单文件中使用import语句;
    3、manifests目录下可存在多个清单文件,每个清单文件包含一个类,其文件名同类名;

(二)puppet的配置

  • puppet config命令:获取或设定puppet配置参数
    puppet config print [argument]
    puppet config print modulepath:puppet查找模块文件的路径

  • puppet配置文件:/etc/puppet/puppet.conf
    puppet config设定的配置直接保存在配置文件中

  • 实验1:建立一个模块,实现redis的主从配置

    mkdir modules/redis/{manifests,files,templates,lib,spec,tests} -pv    // 建立模块目录结构
    cd modules/redis
    vim manifests/init.pp
    class redis {
            package{'redis':
                    ensure => latest,
            } ->
            service{'redis':
                    ensure => running,
                    enable => true,
                    hasrestart => true,
                    restart => 'service redis restart',
                    }
    }
    
    vim manifests/master.pp
    class redis::master inherits redis {
            file{'/etc/redis.conf':
                    ensure => file,
                    source => 'puppet:///modules/redis/redis-master.conf',
                    owner => redis,
                    group => root,
                    require => Package['redis'],
            }
            Service['redis'] {
                    restart => 'systemctl restart redis.service',
                    subscribe => File['/etc/redis.conf'],
            }
    }
    
    vim manifests/slave.pp
    class redis::slave($masterip,$masterport='6379',$masterpass='') inherits redis {
            file{'/etc/redis.conf':
                    ensure => file,
                    content => template('/redis/redis-slave.conf.erb'),
                    owner => redis,
                    group => root,
                    require => Package['redis'],
            }
            Service['redis'] {
                    restart => 'systemctl restart redis.service',
                    subscribe => File['/etc/redis.conf'],
            }
    }
    cp /etc/redis.conf files/redis-master.conf
    cp /etc/redis.conf files/redis-slave.conf
    vim files/redis-master.conf
    bind 0.0.0.0
    vim files/redis-slave.conf
    bind 0.0.0.0
    slaveof 192.168.136.230 6379
    cp -r  /root/modules/redis/ /etc/puppet/modules/
    puppet module list
    puppet apply -v --noop  -e "include redis"
    puppet apply -v --noop  -e "include redis::master"
    puppet apply -v --noop  -e "include redis::slave"
    
    20171204 Puppet(二)_第1张图片

二、Puppet部署master/agent模式

(一)puppet的master/agent模式工作原理

  • 工作步骤:

    • 步骤1:agent每隔30min向master发送自己的主机名和有关系统信息
    • 步骤2:master确定agent身份并根据站点清单将相关类编译为伪代码(catalog),然后发送给agent
    • 步骤3:agent接收到伪代码后,先执行状态查询,然后强制打成伪代码中的目标状态
  • master/agent实现互通的问题;
    通过主机名实现互通,故需要在puppet的内网中设置DNS服务器

  • master/agent之间的安全通信问题:

    • 双方通信内容涉及敏感配置信息,必须加密
    • 由于master/agent主机位于内网,外网无法直接访问,故不需要专业CA机构签发证书,由master负责自签发证书
    • agent主机会在第一次正式通信之前,向master发送证书请求,master端需要手动签发
  • master如何确定不同agent需要应用哪些模块中的哪些类的问题:
    根据站点清单的定义

(二)配置master/agent模式的命令

  • 安装程序包:facter(收集系统信息), puppet(agent端), puppet-server (master端)

  • 初始化master:
    puppet master --no-daemonize --verbose

  • 生成一个完整的配置参数列表:
    puppet master --genconfig
    puppet agent --genconfig

  • 打印基于默认配置生效的各配置参数列表:
    puppet config [--section SECTION_NAME]
    puppet config print

  • 基于命令行设定某参数的值:
    puppet config set

  • master端管理证书签署:
    puppet cert [--all|-a] []
    action:
    list
    sign
    revoke
    clean:吊销指定的客户端的证书,并删除与其相关的所有文件

(三)站点清单的定义:

  • 主机名定义:要求见名识意
    主机名(主机角色)#-机架-机房-运营商-区域.域名
    www1-rack1-yz-unicom-bj.magedu.com

  • 站点清单配置路径:/etc/puppet/manifests/site.pp

    //每个节点公共的定义
    node 'base' {    
        include ntp 
    }
    
    node 'HOSTNAME' {
    ...puppet code...
    }
    
    // 节点定义支持pattern          
    node /node[0-9]+\.magedu\.com/ {
    ...puppet code...
    }
                          
    // 节点定义的继承
    node NODE inherits PAR_NODE_DEF {
    ...puppet code...
    }
    
  • 清单配置信息可模块化组织:
    nodes.d/:
    可通过多个pp文件分别定义各类站点的清单,而后统一导入site.pp
    site.pp文件使用中如下配置:
    import 'nodes.d/*.pp'

  • 实验2:puppet部署master/agent模式示例,实现配置一个redis主从服务器

    • 实验环境:
      master主机名:node0.hellopeiyang.com
      agent(redis master)主机名:node1.hellopeiyang.com
      agent(redis slave)主机名:node2.hellopeiyang.com

    • 步骤1:master和agent端主机的通用设置

    // 同步时间
    ntpdate 172.18.0.1
    // 配置主机名,HOST_NAME视情况替换为实验环境中主机名的要求
    hostnamectl set-hostname HOST_NAME
    // 本例不再配置DNS服务器,通过配置/etc/hosts文件代替
    vim /etc/hosts
    192.168.136.230 node0.hellopeiyang.com
    192.168.136.130 node1.hellopeiyang.com
    192.168.136.131 node2.hellopeiyang.com
    
    • 步骤2:master端配置模块
    mkdir /etc/puppet/modules/redis/{manifests,files,templates,tests,lib,spec} -pv
    cd /etc/puppet/modules/
    vim redis/manifests/init.pp
    class redis {
            package{'redis':
                    ensure => latest,
            } ->
            service{'redis':
                    ensure => running,
                    enable => true,
                    hasrestart => true,
                    restart => 'service redis restart',
                    }
    }
    
    vim redis/manifests/master.pp
    class redis::master inherits redis {
            file{'/etc/redis.conf':
                    ensure => file,
                    source => 'puppet:///modules/redis/redis-master.conf',
                    owner => redis,
                    group => root,
                    require => Package['redis'],
            }
            Service['redis'] {
                    restart => 'systemctl restart redis.service',
                    subscribe => File['/etc/redis.conf'],
            }
    }
    
    vim redis/manifests/slave.pp
    class redis::slave($masterip,$masterport='6379') inherits redis {
            file{'/etc/redis.conf':
                    ensure => file,
                    content => template('redis/redis-slave.conf.erb'),
                    owner => redis,
                    group => root,
                    require => Package['redis'],
            }
            Service['redis'] {
                    restart => 'systemctl restart redis.service',
                    subscribe => File['/etc/redis.conf'],
            }
    }
    
    cp /etc/redis.conf redis/files/redis-master.conf
    vim redis/files/redis-master.conf
    bind 0.0.0.0
    
    cp /etc/redis.conf redis/templates/redis-slave.conf.erb
    vim redis/templates/redis-slave.conf.erb
    bind 0.0.0.0
    slaveof <%= @masterip %> <%= @masterport %>
    
    tree .
    
    20171204 Puppet(二)_第2张图片
    • 步骤3:master端配置主机清单
    yum install puppet-server
    vim /etc/puppet/manifests/site.pp
    node 'node1.hellopeiyang.com' {
            include redis::master
    }
    node 'node2.hellopeiyang.com' {
        class {'redis::slave': 
            masterip => '192.168.136.130',
            masterport => '6379',
          }
    }
    
    • 步骤4:agent端配置puppet
    /etc/puppet/puppet.conf
    server = node0.hellopeiyang.com     // [main]或[agent]下均可
    
    • 步骤5:启动puppet服务
    systemctl start puppetmaster.service     // master端
    systemctl start puppetagent.service      // agent端
    
    • 步骤6:master端签发证书
    puppet cert list
    puppet cert sign node1.hellopeiyang.com
    puppet cert sign node2.hellopeiyang.com
    puppet cert list --all
    

    签发node1.hellopeiyang.com发来的证书请求

    20171204 Puppet(二)_第3张图片

    查看所有由 puppet master签发的证书,包含为自身签发的证书

    20171204 Puppet(二)_第4张图片
    • 步骤7:测试

    redis master节点(node1.hellopeiyang.com)的redis服务启动,创建键值对mykey: "hello today"

    20171204 Puppet(二)_第5张图片

    redis slave节点(node2.hellopeiyang.com)的redis服务启动,查询到键mykey的值"hello today"

    20171204 Puppet(二)_第6张图片

三、Puppet多环境配置

  • puppet支持master端根据agent端发送的环境配置应用不同的模块及不同的类,并且可以切换

  • 默认环境是production

(一)master端的配置:

(1)puppet 3.4 之前的版本配置多环境的方法:
  • 各环境配置:
    /etc/puppet/environments/{production,development,testing}

  • 编辑配置文件:/etc/puppet/puppet.conf

    [master]
    # modulepath=
    # manifest=
    environments = production, development, testing
                  
    [production]
    modulepath=/etc/puppet/environments/production/modules/
    manifest=/etc/puppet/environments/production/manifests/site.pp
                  
    [development]
    modulepath=/etc/puppet/environments/development/modules/
    manifest=/etc/puppet/environments/development/manifests/site.pp   
                  
    [testing]
    modulepath=/etc/puppet/environments/testing/modules/
    manifest=/etc/puppet/environments/testing/manifests/site.pp   
    
(2)puppet 3.6之后的版本配置多环境的方法:
  • 编辑配置文件:/etc/puppet/puppet.conf,添加如下:

    [master]
    environmentpath = $confdir/environments
    
  • 在多环境配置目录下为每个环境准备一个子目录

    ENVIRONMENT_NAME
    |
    |-----manifests
    |     |
    |     |-----site.pp
    modules/
    

(二)agent端的配置:

  • 编辑配置文件:/etc/puppet/puppet.conf,添加如下:

    // [agent]字段下添加
    environment = ENVIRONMENT_NAME    // 指定环境
    
  • 实验3:puppet多环境配置举例

    • 实验环境:继承实验2中搭建的master/agent环境,至保留以下主机节点
      node0.hellopeiyang.com:作为puppet master
      node1.hellopeiyang.com:作为puppet agent

    • 实验要求:规划node1.hellopeiyang.com主机在三种环境(开发、测试、生产)下的memcached设置

    • 步骤1:配置文件指定多环境目录路径

    vim /etc/puppet/puppet.conf      // 添加如下内容
    [master]
        environmentpath = $confdir/environments
    
    • 步骤2:配置多环境的模块及主机清单
    // 构建多环境目录结构
    mkdir -pv /etc/puppet/environments/{testing,development,production}/{manifests,modules}
    // 构建模块目录结构
    mkdir /root/memcached/{manifests,files,templates} -pv
    vim /root/memcached/manifests/init.pp
    class memcached ($maxmemory="64") {
            package{'memcached':
                    ensure => 'latest',
            }
            file{'/etc/sysconfig/memcached':
                    ensure => file,
                    content => template('memcached/memcached.erb'),
                    owner => 'root',
                    group => 'root',
                    mode => '0644',
            }
            service{'memcached':
                    ensure => running,
                    enable => true,
            }
            Package['memcached'] -> File['/etc/sysconfig/memcached'] ~> Service['memcached']
    }
    
    yum install memcached     // 安装只为了获取配置文件用作模板,实际工作中不需要
    cp /etc/sysconfig/memcached /root/memcached/templates/memcached.erb
    vim /root/memcached/templates/memcached.erb
    CACHESIZE="<%= @maxmemory %>"     // 修改本行
    
    // 模块配置完成,复制进多环境目录结构中
    cp -r /root/memcached/ /etc/puppet/environments/testing/modules/
    cp -r /root/memcached/ /etc/puppet/environments/development/modules/
    cp -r /root/memcached/ /etc/puppet/environments/production/modules/
    // 配置每个环境的主机清单
    cd /etc/puppet/
    vim environments/development/manifests/site.pp
    node 'node1.hellopeiyang.com' {
            include memcached
    }
    
    vim environments/testing/manifests/site.pp
    node 'node1.hellopeiyang.com' {
            class {'memcached':
                    maxmemory => '128',
            }
    }
    
    vim environments/production/manifests/site.pp
    node 'node1.hellopeiyang.com' {
            class {'memcached':
                    maxmemory => '256',
            }
    }
    
    systemctl start puppetmaster.service
    tree environments/
    

    master端最终配置完成后的目录结构:

    20171204 Puppet(二)_第7张图片
    • 步骤3:测试
    // 执行development环境下的配置
    puppet agent --no-daemonize -v --environment=development
    grep -i 'cachesize' /etc/sysconfig/memcached
    // 执行testing环境下的配置
    puppet agent --no-daemonize -v --environment=testing
    grep -i 'cachesize' /etc/sysconfig/memcached
    // 执行production环境下的配置
    puppet agent --no-daemonize -v --environment=production
    grep -i 'cachesize' /etc/sysconfig/memcached
    

    puppet在development环境下成功配置

    20171204 Puppet(二)_第8张图片

    puppet在testing环境下成功配置

    20171204 Puppet(二)_第9张图片

    puppet在production环境下成功配置

    20171204 Puppet(二)_第10张图片
    • 步骤4:按照agent的默认环境配置
      实际上主机节点的环境很少变更,在配置文件中配置默认环境后,可以直接启动服务
    vim /etc/puppet/puppet.conf
    environment = testing     // [agent]字段下添加
    grep -i 'cachesize' /etc/sysconfig/memcached
    systemctl start puppetagent.service
    grep -i 'cachesize' /etc/sysconfig/memcached
    
    20171204 Puppet(二)_第11张图片

(三)额外配置文件:

  • 文件系统:fileserver.conf,文件传送有关
  • 认证(URL):auth.conf

四、Puppet kick机制

  • puppet kick:master端主动向agent端推送消息,通知其立即向master端拉取最新的配置

  • 使用情况:当需要立即修改agent的配置时采用

  • 实现条件:
    agent端打开监听端口
    agent端认证master端

  • puppet的配置

    • agent端:
    /etc/puppet/puppet.conf
    [agent]
    listen = true
              
    vim /etc/puppet/auth.conf
    path /run
    method save 
    auth any
    allow master.magedu.com
    
    systemctl restart puppetagent.service
    
    • master端:
      puppet kick
      puppet kick [--host ] [--all]
  • 实验4:在实验3的基础上,实现通过puppet kick机制通知agent立即更新配置

    • 步骤1:agent端设置
    vim /etc/puppet/puppet.conf 
    [agent]                       // agent字段下添加如下内容
    Listen = true
    
    vim /etc/puppet/auth.conf     // 添加如下内容
    path    /run
    method  save
    auth    any
    allow   node0.hellopeiyang.com
    // 以上添加的内容必须在以下内容之上添加
    path /
    auth any 
    
    systemctl restart puppetagent.service
    
    • 步骤2:master端修改配置,通过puppe kick机制通知agent端
    cd /etc/puppet/environments/testing/
    // 建立一个模块nginx
    mkdir modules/nginx/{manifests,files,templates} -pv
    vim modules/nginx/manifests/init.pp
    class nginx {
            package{'nginx':
                    ensure => latest,
            }
    }
    
    // 将nginx类添加至主机清单
    vim manifests/site.pp 
    node 'node1.hellopeiyang.com' {
            class {'memcached':
                    maxmemory => '128',
            }
            include nginx     // 新增内容
    }
    
    systemctl restart puppetmaster.service
    puppet kick node1.hellopeiyang.com
    

你可能感兴趣的:(20171204 Puppet(二))