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

原文地址:https://www.cnblogs.com/Caesary/p/8073608.html