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,即可做到在标准化模板文件不变的情况下自定义修改。

  • 相关阅读:
    C++Primer 中间Sales_items.h头文件
    2014最不受欢迎10编程语言种
    解决ubuntu 14.04删ibus导致系统设置项目的损失后,,退出关机问题是不正常的
    会计翻译成英文
    Delphi 使用 Format格式话字符串的用法
    浅谈暂估应付账款的会计处理
    Delphi TcxTreelist 设置scrollbars 不起作用的原因
    Delphi 调试 通过BreakPoint
    折现率”的公式
    考会计证 需要的科目
  • 原文地址:https://www.cnblogs.com/Caesary/p/8073608.html
Copyright © 2011-2022 走看看