【Linux】【Services】【Configuration】puppet

1. 简介

1.1. 官方网站:https://docs.puppet.com/

1.2. puppet是IT基础设施自动化管理工具,他的整个生命周期包括:provisioning,configuration,orchestration,reporting

1.3. puppet是master/agent模型的,但是agent可以独立执行操作,agent是真正执行相应管理操作的核心部件,他会周期地去master请求与自己相关的配置

1.4. puppet的工作模式:

  声明性、基于模型:

    定义:使用puppet配置语言定义基础配置信息

    模拟:模拟测试运行

    强制:强制当前与定义的目标状态保持一致

    报告:通过puppet api将执行结果发送给接收者

1.5. puppet有三个层次:

  配置语言

  事务层

  资源抽象层

    资源类型:例如用户、组、文件、服务、cron任务等等

    属性及状态 与其实现方式分离

    期望状态

1.6. puppet核心组件:资源

  资源清单:manifests

  资源清单及清单中的资源定义的所依赖文件、模板等数据按特定结构组织起即为“模板”

2. 安装

2.1. agent: puppet, facter

2.2. master: puppet-server

3. 命令

3.1. puppet:

  命令的用法格式:

    Usage:puppet <subcommand> [options] <action> [options]

  获取所支持的所有的资源类型:

    # puppet describe -l

    # puppet describe RESOURCE_TYPE

3.2. 定义资源:

  type { ‘title’:

    attribute1 => value1,

    attribute2 => value2,

  }

    type必须小写:title在同一类型下必须唯一;

  常用资源类型:

    user, group, file, package, service, exec, cron, notify

  group:

    管理组资源

    常用属性:

      name:组名,NameVar

      gid:GID

      system:true,false

      ensure:present,absent

      members:组内成员

  user:

    管理用户

    常用属性:

      comment:注释信息

      ensure:present,absent

      expiry:过期期限

      gid:基本组id

      groups:附加组

      home:家目录

      shell:默认shell

      name: NameVar

      system:是否为系统用户,true|false

      uid:UID

      password:

  

  file:

    管理文件、目录、符号链接等;内容可通过content属性直接给出,也可以通过source属性根据远程服务器路径下载生成;

    指明文件内容来源

      content:直接给出文件内容,支持 , ;

      source:从指定位置下载位置;

      ensure:file,directory,link,present,absent

    常用属性

      force:强制运行,可用值yes,no,true,false

      group:属组

      owner:属主

      mode:权限,支持八进制格式权限,以及u,g,o的赋权方式

      path:目标路径

      source:源文件路径,可以是本地文件路径(单机模型),也可以使用puppet:///modules/module_name/file_name

      target:当ensure为“link”时,target表示path指向的文件是一个符号链接文件,其目标为此target属性所指向的路径,此时content及source属性自动失效

  exec:

    运行--外部命令;命令应该具有“幂等性”;

      幂等性:

        1、命令本身具有幂等性;

        2、资源有onlyif,unless等属性以实现命令的条件式运行;

        3、资源有refreshonly属性,以实现只有订阅的资源发生变化时才执行;

    command:运行的命令:NameVar

    creates:此属性指定的文件不存在时才执行此命令

    cwd:在此属性指定的路径下运行命令

    user:以指定的用户身份运行命令

    group:指定组

    onlyif:给定一个测试命令;仅在此命令执行成功(返回状态码为0)时才运行command指定的命令;

    unless:给定一个测试命令;仅在此命令执行失败(返回状态码不为0)时才运行command指定的命令;

    refresh:接受到其他资源发来的refresh通知时,默认是重新执行exec定义的command,refresh属性可改变这种行为,即可指定仅在refresh时运行的命令;

    refreshonly:仅在收到refresh通知,才运行此资源;

    returns:期望的状态返回值,返回非此值时表示命令执行失败;

    tries:尝试执行的次数;

    timeout:超时时长

    path:指明命令搜索路径,其功能类型PATH环境变量;其值通常为列表['path1', 'path2', ...],如果不指明此属性,则必须给定命令的绝对路径

  notify:

    核心属性:

      message:要发送的消息的内容: NameVar

  cron:

    管理cron任务:

    常用属性:

      ensure:present,absent

      command:要运行的job

      hour:

      minute:

      month:

      monthday:

      weekday:

      name:

      user:运行的用户

      environment:运行时的环境变量

  package:

    管理程序包:

    常用属性:

      ensure:installed,latest,VERSION(2.3.1-2.el7),present,absent

      name:程序包名称

      source:包来源:可以本地文件路径或URL;

      provider:rpm

  service:

    管理服务:

    常用属性:

      enable:是否开机自动启动,true|false;

      ensure:启动(running),停止(stopped);

      hasrestart:是否支持restart参数;

      hasstatus:是否支持status参数;

      name:服务名称,NameVar

      path:脚本查找路径;

      pattern:用于搜索此服务相关的进程的模式;当脚本不支持restart/status时,用于确定服务是否处于运行状态;

      restart:用于执行“重启”的命令;

      restart:

      stop:

      status:

  特殊属性:metaparameters

    资源引用:

      Tpye['title']

    依赖关系

      被依赖的资源中使用:before

      依赖其他资源的资源:require

      ->:链式依赖

    通知关系

      被依赖的资源中使用:notify

      监听其他资源的资源:subscribe

      ->:链式通知

puppet的变量及其作用域

  变量名均以$开头,赋值符号=;任何非正则表达式类型的数据均可赋值给变量;

  作用域:定义代码的生效范围,以实现代码间隔离;

    仅能隔离:变量,资源的默认属性;

    不能隔离:资源的名称,及引用;

    每个变量两种引用路径:

      相对路径

      绝对路径:$::scope::scopt::variable

    变量的赋值符号:

      =

      +=:追加赋值

    数据类型:

      布尔型:true,false

      undef:未声明

      字符型:可以不用引号,支持单引号(强引用),双引用(弱引用)

      数值型:整数和浮点数;

      数组:[item1, item2, ...],元素可为任意可用数据类型,包括数组和hash;索引从0开始,还可以使用负数;

      hash:{key => value, key => value, ...},键为字符串,而值可以是任意数据类型;

      正则表达式:

        非标准数据类型,不能赋值给变量;

          语法结构:

            (?<ENABLED OPTION>:<SUBPATTERN>)

            (?-<DISABLED OPTION>:<SUBPATTERN>)

            OPTION:

              i:忽略字符大小写;

              m:把.当换行符;

              x:忽略模式中的空白和注释;

      表达式:

        比较操作符:==,!=,<,<=,>,>=,=~,!~,in

        逻辑操作符:and,or,!

        算术操作符:+,-,*,/,%,>>,<<

  puppet中变量的种类:

    自定义变量

    facter变量:可直接使用

      查看puppet支持的各facts:

        facter -p

    内置变量:

      客户端内置:

        $clientcert

        $clientversion

      服务器端内置

        $servername

        $serverip

        $serverversion

        $module_name

  条件判断:

    if,case,selector,unless

    if语句:

      if CONDITION{

        ...

      }

      if CONDITION{

        ...

      }

      else{

        ...

      }

      CONDITION的用法:

        1、比较表达式

        2、变量引用

        3、有返回值的函数调用

      if $operatingsystem =~ /^(?i-mx:(centos|redhat|fedora|ubuntu))/ {

        notice("Welcome to $1 distribution linux.")

      }

    case语句:

      

      case CONTROL_EXPRESSION {

        case1, case2: { statement }

        case3, case4, case5: { statement }

        ...

        default: { statement }

      }

      CONTROL_EXPRESSION:表达式、变量、函数(有返回值):

      case:

        字符串,变量,有返回值函数,模式,default

    selector语句:

      类似于case,但分支的作用不在于执行代码片段,而是返回一个函数值;

      CONTROL_VARIABLE:变量、有返回值的函数;但不能是表达式;

      case:直接值(需要带引号)、变量、有返回值的函数、正则表达式模式或default

  类:class

    用于公共墓地的一组资源,是命名的代码块;创建后可在puppet全局进行调用;类可以被继承;

    语法格式:

      class class_name {

        ...puppet code...

      }

      注意:类名只能包含小写字母、数字和下划线

    

class nginx {
        $webserver=nginx

        package{$webserver:
                ensure => latest,
        }

        file{'/etc/nginx/nginx.conf':
                ensure => file,
                source => '/root/modules/nginx/file/nginx.conf',
                require => Package['nginx'],
                notify => Service['nginx'],
        }

        service{'nginx':
                ensure => running,
                enable => true,
                hasrestart => true,
                hasstatus => true,
                require => [ Package['nginx'], File['/etc/nginx/nginx.conf'] ],
        }
}
View Code

    注意:类在声明后方才执行:

    类声明的方式,

      include class_name, class_name, ...

    定义能够接受参数的类:

      class class_name ($arg1='value1', $arg2='value2') {

        ...puppet code...  

      }

    类声明方式2:

      class{'class_name':

        arg1 => value,

        arg2 => value,

      }

class nginx {
        $webserver=nginx

        package{$webserver:
                ensure => latest,
        }

        file{'/etc/nginx/nginx.conf':
                ensure => file,
                source => '/root/modules/nginx/file/nginx.conf',
                require => Package['nginx'],
                notify => Service['nginx'],
        }

        service{'nginx':
                ensure => running,
                enable => true,
                hasrestart => true,
                hasstatus => true,
                require => [ Package['nginx'], File['/etc/nginx/nginx.conf'] ],
        }
}

class{'nginx':
        webserver => 'tengine',
}
View Code

    类继承:

      定义方式:

        class base_class {

          ... puppet code ...

        }

        class base_class::class_name inherits base_class {

          ... puppet code ...

        }

      作用:继承一个已有的类,并实现覆盖资源属性,或向资源属性追加额外值;

      类继承时:

        (1)声明子类时,其基类会被自动首先声明;

        (2)基类成为了子类的父作用域,基类中的变量和属性默认值会被子类复制一份;

        (3)子类可以覆盖父类中同一资源的相同属性的值;

      在子类中覆盖父类中已经定义的资源的属性值:

class nginx {
        package{'nginx':
                ensure => latest,
        } ->

        service{'nginx':
                enable => true,
                ensure => running,
                hasrestart => true,
                hasstatus => true,
                restart => 'systemctl restart nginx.service',
        }
}

class nginx::webserver inherits nginx {
        Package['nginx'] {
                name => tengine,
        }
        file{'/etc/nginx/nginx.conf':
                source => '/root/modules/nginx/file/nginx.conf',
                ensure => file,
                notify => Service['nginx'],
        }
}

class nginx::proxy inherits nginx {
        file{'/etc/nginx/nginx.conf':
                source => '/root/modules/nginx/file/nginx_proxy.conf',
                ensure => file,
                notify => Service['nginx'],
        }
}

include nginx::webserver
View Code

模板:基于ERB模板语言,在静态文件中使用变量等变成元素生成适用于多种不同的环境的文本文件(配置文件):Embedded Ruby,用于实现在文本文件中嵌入ruby代码,原来的文本信息不会被改变,但ruby代码会被执行,执行结果将直接替换原来代码

  <%= Ruby Expression %>:替换为表达式的值;

  <% Ruby Expression %>:仅执行代码,而不替换;

  <%# comment %>:文本注释;

  <%%:输出为<%;

  %%>:输出为%>;

  <%- Ruby code %>:忽略空白字符;

  <% Ruby code -%>:忽略空白行;

  在模板中可以使用变量,包括puppet的任意可用变量,但变量名以@字符开头;

  条件判断:

    <% if CONDITION -%>

      some test

    <% end %>

 

    <% if CONDITION -%>

      some test

    <% else %>

      some other test

    <% end %>

  迭代:

    <% @ArrayName.echo do | Variable_Name | -%>

      some text with <%= Variable_Name %>

    <% end %>

  模块:

    modules

      module_name/

        manifests/

          init.pp:至少应该包含一个与当前模块名称同名类;

        files:静态文件;puppet:///modules/module_name/file_name;

        templetes:模板文件目录;template('module_name/template_file_name');

        lib:插件目录;

        tests:当前模块的使用帮助文件及示例文件;

        spec:类似于tests目录,存储lib目录下定义的插件的使用帮助及示例文件;

  模块管理命令:

      puppet module <action> [--environment production ] [--modulepath $basemodulepath]

        ACTIONS:
          build Build a module release package.
          changes Show modified files of an installed module.
          generate Generate boilerplate for a new module.
          install Install a module from the Puppet Forge or a release archive.
          list List installed modules
          search Search the Puppet Forge for a module.
          uninstall Uninstall a puppet module.
          upgrade Upgrade a puppet module.

  ageng/master:

    agent:默认每隔30分钟向master发送node name和facts,并请求catalog;

    master:验证客户端十分,查找与其相关的site manifest,编译生成catalog,并发送给客户端;

    ssl xmlrpc,https

      8140/tcp

    master:puppet,puppet-server,facter

    agent: puppet, facter

  

  配置文件:

    主配置文件:/etc/puppet/puppet.conf

    

    显示或设置配置参数:

      puppet config

        print

        set

    手动生成完成配置文件:

      master:基于现有配置文件生成配置文件,请保持配置文件为yum默认安装后的配置文件,否则可能会出错

        puppet master --genconfig > /etc/puppet/puppet_default.conf

      agent:

        puppet agent --genconfig >> /etc/puppet/puppet_default.conf

      注意:

        (1)生成新的配置之前不能删除或移动原有的puppet.conf;

        (2)生成的配置中,有的参数已经被废弃,与现有Puppet版本可能不兼容;

        (3)有的参数的默认值与现在版本所支持值可能不相兼容;

    获取puppet文档:

      puppet doc

        分段,称为reference

        列出所有的reference:

          puppet doc --list

        查看某一reference:

          puppet doc -r REFERENCE_NAME

     配置文件的组成部分:

      [main]

      [master]

      [agent]

    签署证书:

      puppet cert <action> [-h|--help] [-V|--version] [-d|--debug] [-v|--verbose]  [--digest <digest>] [<host>]

      Action:

        list:查看所有签署请求

  配置agent/master:

    1、配置master;

      # puppet master --no-daemonize -v

      # systemctl start puppetmaster.service

      # systemctl enable puppetmaster.service

      # netstat -untlp|grep 8140/tcp

    2、配置agent:

      # puppet agent --server=MASTER_HOST_NAME --no-daemonize --noop --test -v

      # puppet agent --server=MASTER_HOST_NAME --no-daemonize -v -d

    3、在master端为客户端签署证书

      # puppet cert list

      # puppet cert sign NODE_NAME

      # puppet cert sign --all

    4、在master端:

      (1)安装所有要用到的模块:

        puppet module install

        自己安装自己研发的模块

      (2)定义site manifest;

         /etc/puppet/manifests/site.pp

          node 'NODE_NAME' {

            ... puppet code ...

          }

        例如:

          node "node3.magedu.com" {

            include nginx::proxy

          }

  节点管理:

    stie.pp定义节点的方式:

      (1)以主机名直接给出其相关定义:

        node 'NODE_NAME' {

          ... puppet code ...

        }

      (2)把功能相近的主机事先按统一格式命名,按统一格式调用:

        node /^webd+.magedu.com/ {

          ... puppet code ...

        }

    主机命名规范:

      角色-运营商-机房名-IP.DOMAIN.TLD

        web-unicom-jxq-1.1.1.1.magedu.com

    对节点配置分段管理:

      /etc/puppet/manifests/

        site.pp #import "webservers/*.pp"

        webservers/

          unicom.pp

          telecom.pp

        cacheservers/

        appservers/

原文地址:https://www.cnblogs.com/demonzk/p/7093741.html