zoukankan      html  css  js  c++  java
  • puppet 实战之新增标准化文件需求

    需求:PUPPET(puppet v3.6.0)对线上所有机器(暂时对部分机器(系统版本:centos6)测试)新增标准化配置文件需求

    最终配置文件样例:

    global:
    # 公司标识:corp,hans等等
      corp:corp
    # 环境标识:prod、stage、dev、local
      env:prod
    # 机房标识:m6、dx、yz、bx
      zone:m6
    # 服务器类别:physical、docker
      machine:physical
    
    moa:
    # 注册中心
      basekeeper:
        master:redis_basekeeper.base.com
        slave:
          - redis_basekeeper_s1.base.com
          - redis_basekeeper_s2.base.com
          - redis_basekeeper_s3.base.com
    # Store注册中心
      basestore:
        zk:
          - mtp_zk_g3_1.base.com:2183
          - mtp_zk_g3_2.base.com:2183
          - mtp_zk_g3_3.base.com:2183

    入口文件:site.pp (PUPPET/manifests/site.pp) (注:PUPPET为puppet配置主目录)

     ### 针对主机名以lab-base-0开头的机器做策略
    node /^lab-base-0.*.dx/ {
    ### 包含 role模块下的lab-base.pp文件 (路径:PUPPET/modules/role/manifests/lab-base.pp)
    ### 这里需要注意 include 后的模块中不能带中横线,应改为下划线 lab-base -> lab_base ### include role::lab
    -base
    include role::lab_base
    }

    规则文件: lab_base.pp (PUPPET/modules/role/manifests/lab_base.pp)

    ## role模块的lab-base.pp 继承 role模块也就是这个文件:(role/manifests/init.pp)
    class
    role::lab_base inherits role {
    ## 包含了profile模块的lab_base.pp文件 (路径: PUPPET/modules/profile/manifests/lab_base.pp)
    ## include ::profile:lab_base 写法的"::"为从puppet主模块层级,每加一个::,都要往下找一个 "子模块/manifests/" include ::profile::lab_
    base }

    主配置文件: lab_base.pp (PUPPET/modules/profile/manifests/lab_base.pp)

    class profile::lab_base {
    ## 包含facters模块的lab_base.pp (路径: PUPPET/modules/facters/manifests/lab_base.pp)
    ## 这里包含这个文件的意思是,要根据所管理的机器配置成一个组,组名叫lab_base,且需要在这个组内定义一些变量 include ::facters::lab_
    base
    ## 这里的env 就是最关键的标准化配置模块
    include ::env }

    facters文件: lab_base.pp (PUPPET/modules/facters/manifests/lab_base.pp)

    class facters::lab_base {
    ## 包含了facters的基本配置,下边会展示内容 include facters Class[
    'facters'] -> Class['facters::lab_base']
    ## 定义一个组名 file {
    '/etc/facter/facts.d/group.txt': ensure => present,
    ## 这里定义组名为:lab-base,会从(PUPPET/hieradata/group/lab-base.json) 取值,下边会说到。(注意:include 里不能写中横线,group里是可以写的) content
    => "group=lab-base ", } }

    facters基本配置文件: init.pp (PUPPET/modules/facters/manifests/init.pp)

    class facters {
      file { '/etc/facter':
        ensure => directory,
      }
    
      file { '/etc/facter/facts.d':
        ensure  => present,
        mode    => '0755',
        require => File['/etc/facter'],
        recurse => true,
        source  => "puppet:///modules/${module_name}/",
      }
    }

    接下来该说下env标准化模块和facter里group的变量了。

    env标准化模块:(PUPPET/modules/env)

    tree modules/env/
    modules/env/
    ├── manifests
    │   ├── init.pp
    │   └── lab_base.pp (忽略,暂时没用到)
    └── templates
        └── env.yaml.erb

    标准化模块配置文件 init.pp (PUPPET/modules/env/manifests/init.pp)

    class env (
    ## base_env_file、base_env_dir 是定义的变量,file资源里会用到 $base_env_file
    = '/etc/base/env.yaml', $base_env_dir = '/etc/base',
    ## 以下5个变量为标准化配置的变量,放在这里是作为默认值,假如facter里定义过自定义变量,会覆盖这个值。咱们就是要定义在facter里。 $corp
    = 'base', $env = 'prod', $moa_basekeeper_master = [], $moa_basekeeper_slave = [], $moa_basestore_zk = [], ) { file { $base_env_file: ensure => file, mode => '0644',
    ## 这个是标准化配置的模板,渲染进变量即可 content
    => template("${module_name}/env.yaml.erb"), require => File[$base_env_dir], } file { $base_env_dir: ensure => directory, mode => '0755', recurse => true, } }

    标准化配置模板文件: env.yaml.erb (PUPPET/modules/env/templates/env.yaml.erb)

    global:
    ## 此变量是人为定义 corp:
    <%= @corp %>

    ## 此变量是人为定义 env: <%= @env %>
    ## 此变量由服务器facter取
    zone: <%= @location %>
    ## 此变量由服务器facter取
    machine: <%= @virtual %> moa: basekeeper:
    ## 此变量由人为定义 master:
    <%= @moa_basekeeper_master %>
    ## 此变量由人为定义
    slave: <%= @moa_basekeeper_slave %> basestore:
    ## 此变量由人为定义 zk:
    <%= @moa_basestore_zk %>

    重点来了: facter变量文件: (PUPPET/hieradata/group/lab-base.json)

    {
    ## 正常写法为:env::lab-base::env 解释为:env是puppet的一个模块目录 lab_base为 env/manifests/lab_base.pp文件 env为该文件里的env变量。
    ## 这里既然写成env::env 意思是取的是 env/manifests/init.pp 文件里的env 变量。可以省略init
    "env::corp": "lab", "env::env": "lab", "env::moa_basekeeper_master": [], "env::moa_basekeeper_slave": [], "env::moa_basestore_zk": [] }

    hireadata主文件: hiera.yaml (PUPPET/hiera.yaml)

    ---
    :backends:
      - json
    
    # if datadir is empty , hiera uses its defaults:
    # - /var/lib/hiera on *nix
    # - %CommonAppData%PuppetLabshieravar on Windows
    # When specifying a datadir, make sure the directory exists.
    :json:
      :datadir: /etc/puppet/hieradata
    
    :hierarchy:
    ## 优先级逐渐变低
    - node/%{::fqdn} - location/%{::location}
    ## 我们用到的是group里的变量。
    - group/%{::group} - os/%{::operatingsystem}%{::operatingsystemmajrelease} - common # options are native, deep, deeper :merge_behavior: deeper :logger: console

    做好以上配置后,即可根据在facter里group下的变量渲染到最终的标准化模板文件里,每当新增一个组,只需要增加一个特定的group下的变量文件,并被include,即可做到在标准化模板文件不变的情况下自定义修改。

  • 相关阅读:
    learnyou 相关网站
    hdu 3038 How Many Answers Are Wrong
    hdu 3047 Zjnu Stadium 并查集高级应用
    poj 1703 Find them, Catch them
    poj 1182 食物链 (带关系的并查集)
    hdu 1233 还是畅通工程
    hdu 1325 Is It A Tree?
    hdu 1856 More is better
    hdu 1272 小希的迷宫
    POJ – 2524 Ubiquitous Religions
  • 原文地址:https://www.cnblogs.com/Caesary/p/8073608.html
Copyright © 2011-2022 走看看