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:直接给出文件内容,支持\n, \t;

      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'] ],
}
}

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

    类声明的方式,

      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',
}

    类继承:

      定义方式:

        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

模板:基于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 /^web\d+\.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/

【Linux】【Services】【Configuration】puppet的更多相关文章

  1. 【Linux】-NO.5.Linux.1.CentOS.1.001-【CentOS7 Foundation Configuration】-

    1.0.0 Summary Tittle:[Linux]-NO.5.Linux.1.CentOS.1.001-[CentOS7 Foundation Configuration]- Style:Lin ...

  2. 【Linux&amp;Unix--open/close/write/read系统调用】

    个人学习整理.如有不足之处,请不吝不吝赐教. 转载请注明:@CSU-Max 系列博文:      Linux&Unix学习第一弹 -- 文件描写叙述符与权限  Linux&Unix学习 ...

  3. 【linux之设备,分区,文件系统】

    一.设备 IDE磁盘的设备文件采用/dev/hdx来命名,分区则采用/dev/hdxy来命名,其中x表示磁盘(a是第一块磁盘,b是第二块磁盘,以此类推), y代表分区的号码(由1开始,..3以此类推) ...

  4. 【linux之挂载,Raid,LVM】

    一.挂载,卸载 挂载:将新的文件系统关联至当前根文件系统卸载:将某文件系统与当前根文件系统的关联关系移除 cat /etc/mtab 存储着已经挂载的文件系统 (跟 mount 一样) mount:显 ...

  5. 【linux之进程管理,系统监控】

    一.进程管理 前台进程:一般是指占据着标准输入和/或标准输出的进程后台进程:不占据默认开启的进程都是前台进程ctrl+C 中断ctrl+z 从前台转入后台bg 后台进程编号 让其在后台运行ls -R ...

  6. 【Linux运维-集群技术进阶】Nginx+Keepalived+Tomcat搭建高可用/负载均衡/动静分离的Webserver集群

    额.博客名字有点长.. . 前言 最终到这篇文章了,心情是有点激动的. 由于这篇文章会集中曾经博客讲到的全部Nginx功能点.包含主要的负载均衡,还有动静分离技术再加上这篇文章的重点.通过Keepal ...

  7. 【Linux磁盘优化管理--RAID和LVM】

    在现阶段的企业环境中,为了数据的安全性及完整性必须要有一个合理的存储方案.面对着每秒可能产生超过几TB的数据,考虑到磁盘能不能实现 热冗余,及扩容,缩容.Linux给出了RAID(磁盘阵列)以及LVM ...

  8. 【Linux 内核网络协议栈源码剖析】网络栈主要结构介绍(socket、sock、sk_buff,etc)

    原文:http://blog.csdn.net/wenqian1991/article/details/46700177 通过前面的分析,可以发现,网络协议栈中的数据处理,都是基于各类结构体,所有有关 ...

  9. 【linux之链接,函数,随机数】

    一.链接 硬链接(hard link):同一个文件使用了多个别名.新建文件是已经存在的一个别名,,当原文件删除时,新建的文件仍然可以使用.硬链接和原来的文件没有什么区别,而且共享一个inode号.通过 ...

  10. 5.2【Linux 内核网络协议栈源码剖析】socket 函数剖析 ☆☆☆

    深度剖析网络协议栈中的 socket 函数,可以说是把前面介绍的串联起来,将网络协议栈各层关联起来. 应用层 FTP SMTP HTTP ... 传输层 TCP UDP 网络层 IP ICMP ARP ...

随机推荐

  1. python与C结构体之间二进制数据转换

    python与C结构体之间数据转换 前言 在实际应用中,可能会遇到直接和C进行二进制字节流协议通信,这时要把数据解包成python数据,如果可能,最好与C定义的结构体完全对应上. python中有2种 ...

  2. Django笔记&教程 2-2 URL详细匹配规则

    Django 自学笔记兼学习教程第2章第2节--URL详细匹配规则 点击查看教程总目录 本章第一节中我们简单介绍了URL与View关系 简单概括来说,网页请求的url会通过urls.py里面的urlp ...

  3. 【Python】300行代码搞定HTML模板渲染

    一.前言 模板语言由HTML代码和逻辑控制代码组成,此处@PHP.通过模板语言可以快速的生成预想的HTML页面.应该算是后端渲染不可缺少的组成部分. 二.功能介绍 通过使用学习tornado.bott ...

  4. [loj6734]图上的游戏

    考虑原图是一条链的情况-- 思路:随机一个点$x$,将其所在段(边集)再划分为两段,重复此过程即可得到该链 实现上,(从左到右)维护每一段的左端点和边集,二分找到最后一个删除后$x$到根不连通的段,那 ...

  5. redis可以设置过期key回调实现延时队列

    <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring- ...

  6. 由于vue的for循环id并不严谨,提高id严谨性

    如果后台没有传入id,我们拿到的数据没有id修改等操作不方便,如何拿到id呢 https://github.com/dylang/shortid 提供唯一id 插件的引入和使用: <templa ...

  7. python-面向过程、面向对象、类

    目录 python-面向过程.面向对象.类 面向过程编程 面向对象 类和对象 二者区别 定义格式: 定义类发生的事情 定义类的标准格式 属性的查找顺序 python-面向过程.面向对象.类 面向过程编 ...

  8. Codeforces 809E - Surprise me!(虚树+莫比乌斯反演)

    Codeforces 题目传送门 & 洛谷题目传送门 1A,就 nm 爽( 首先此题一个很棘手的地方在于贡献的计算式中涉及 \(\varphi(a_ia_j)\),而这东西与 \(i,j\) ...

  9. Codeforces 639E - Bear and Paradox(二分+贪心)

    Codeforces 题目传送门 & 洛谷题目传送门 原来 jxd 作业里也有我会做的题 i 了 i 了 首先这种题目的套路就是先考虑对于一个固定的 \(c\),怎样求出得分最高的策略,而类似 ...

  10. 洛谷 P6499 - [COCI2016-2017#2] Burza(状压 dp)

    题面传送门 一道挺有意思的思维题(?) 首先我们假设根节点深度为 \(0\),那么 Daniel 的目标显然就是堵住一些节点使得 Stjepan 不能移动到深度为 \(k\) 的节点,Stjepan ...