puppet 入门详解 超详细!!!

Puppet是一种集中式配置管理系统,用于自动化管理和配置Linux、Unix及Windows平台的IT基础设施。它采用声明式语言,通过资源抽象、定义、属性来管理各种系统实体,如用户、服务、文件等。Puppet的工作模式包括单机和master/agent模型,后者实现集中式管理。文章详细介绍了Puppet的资源类型、类和模块的使用,以及master/agent模型的设置和操作流程。

目录

一、puppet概述

二、Puppet的工作模式是什么?

三、Puppet的适用场景是什么?

四、原理

(一)工作模型

 (二)工作流程

 (三)使用模型

1、单机使用模型

 2、master/agent 模型

 (四)名词解释

五、puppet 资源详解

(一)程序安装及环境

(二)puppet 资源简介

1、资源抽象

2、资源定义

3、资源属性

(三)常用资源

1、查看资源

2、group(管理系统上的用户组。)

3、user(管理系统上的用户)

4、package(puppet的管理软件包)

5、service(定义服务的状态)

6、file(管理文件、目录、软链接)

7、exec(执行命令,慎用。通常用来执行外部命令)

8、cron(定义周期性任务)

9、notify(调试输出)

(四)资源的特殊属性

1、puppet 中也提供了 before、require、notify 和 subscribe 四个参数来定义资源之间的依赖关系和通知关系。

2、同时,依赖关系还可以使用 -> 和 ~> 来表示:

3、举例如下:

4、我们还可以使用在最下面统一写依赖关系的方式来定义:

5、tag 标签:

6、实例:

(五)puppet 变量

1、数据类型:

2、正则表达式:

3、puppet的变量种类

4、变量的作用域

(六)puppet 流程控制语句

1、if 语句

2、case 语句

3、selector 语句

六、class类

(一)什么是类?

1、类是 puppet 中命名的代码模块,常用于定义一组通用目标的资源,可在 puppet 全局调用;类可以被继承,也可以包含子类;

2、具体定义的语法如下:

3、我们来看一个简单的例子:

(二)带有参数的类

1、我们定义的类也可以进行参数设置,可以进行参数的传递。

2、具体语法如下所示:

3、举例:

4、由上,我们可以总结出,调用类的方式有两种:

 5、一个比较全面的例子

(三)类的继承

1、类似于其它编程语言中的类的功能,puppet 的Class 可以被继承,也可以包含子类。

2、其定义的语法如下:

3、举例:

七、模板

(一)模板通常以 erb 结尾。

(二)模板均使用 erb 语法。

(三)关于 puppet 兼容的 erb 语法,我们可以去官方文档查看,下面附上官方文档地址:https://docs.puppet.com/puppet/latest/reference/lang_template_erb.html。以下,附上部分重要内容:

(四)实例:puppet 模板实现修改 redis 端口地址

1、我们使用 puppet 模板来实现,将 redis 监听端口修改为本机的 ip 地址。首先,我们先来定义一个 file.pp 文件,在该文件中调用我们的模板:

2、接着,我们去修改配置文件的源,也就是我们的模板文件:

3、修改完成以后,我们就可以执行查看结果了:

4、然后,我们去查看一下 /tmp/redis.conf文件:

八、模块

(一)什么是模块?

(二)模块的命名规范

 (三)实例:定义一个redis主从模块

1、我们先来创建对应的目录格式:

2、目录格式创建完成之后,我们就可以来创建对应的父类子类文件了。首先,我们来创建父类文件:

3、创建完成后,我们再来创建对应的子类文件:

4、准备文件:

5、查看目录结构

6、模块放入系统模块

7、调用模块

九、master/agent 模型

(一)实验前准备

1、下载包

 2、解析主机名

3、时间同步

 (二)开启 master 端的 puppet 服务

1、手动前台开启,观察服务开启过程:

2、直接 systemctl 开启服务,监听在 8140 端口

(三)在 agent 端开启服务

1、在配置文件中指明server端的主机名:

2、开启 agent 服务

3、在 master 端签署证书

4、终止服务开启,再次开启

(四)配置站点清单,且测试agent 端是否实现

1、设置站点清单

2、给puppet 用户授权

3、手动前台开启 agent 端服务

4、直接开启服务,agent 会自动去master 端获取配置

十、实战

使用 master-agent 模型完成完整的 redis 主从架构

(一)准备环境

(二)实验前准备

1、下载包

2、主机名解析

3、时间同步

(三)开启puppet 的master、agent 服务

1、开启服务

 2、master 签署颁发证书

(四)配置站点清单

 (五)检测主从架构

 (六)再添加个模块准备配置进站点清单

1、创建一个 chrony 模块,前准备

2、配置chrony 模块

3、puppet 添加这个模块,并生效

(七)再配置站点清单

(八)测试


一、puppet概述

1、Puppet是一种Linux、Unix、windows平台的集中配置管理系统,使用自有的Puppet描述语言,可管理配置文件、用户、cron任务、软件包、系统服务等。

2、puppet 是一个 IT 基础设施自动化管理工具,它能够帮助系统管理员管理基础设施的整个生命周期: 供应(provisioning)、配置(configuration)、联动(orchestration)及报告(reporting)。

3、puppet也是目前互联网企业的自动化运维工具之一,其使用一种描述性的语言给客户端声明了一些状态配置,比如,一个服务应该被安装等。

4、puppet也是目前互联网企业的自动化运维工具之一,其使用一种描述性的语言给客户端声明了一些状态配置,比如,一个服务应该被安装等。

5、基于 puppet ,可实现自动化重复任务、快速部署关键性应用以及在本地或云端完成主动管理变更和快速扩展架构规模等。puppet 遵循 GPL 协议(2.7.0-),基于ruby语言开发。2.7.0 以后使用(Apache 2.0 license),对于系统管理员是抽象的,只依赖于 ruby 与 facter。能管理多达40 多种资源,例如:file、user、group、host、package、service、cron、exec、yum repo等。

6、puppet既可以工作在主动模式下,也可以工作在被动模式下,在主动模式下,puppet客户端主动拉取服务器配置文件;在被动模式下,puppet服务器主动通知puppet客户端,使puppet客户端开启同步工作。

7、对于puppet而言,如果硬件设备性能比较高,在被管理客户端配置一致的情况下,管理成千上百台设备是非常简单的。但是在一些大型的企业中,如果只有一台puppet服务器,则puppet服务器的压力则会非常大,这时可以考虑把puppet扩展成一个服务器集群组。

8、puppet使用ruby语言编写,而ruby语言是解析型语言,所谓解析型语言,就是ruby语言的每次执行,都需要借助翻译器将ruby语言翻译成可以被CPU直接执行的机器码。由于多了这么一个“翻译”的过程,因此,ruby语言编写的程序执行速度较慢。

二、Puppet的工作模式是什么?

Puppet采用C/S星状的结构,所有的客户端和一个或几个服务器交互。每个客户端周期的(默认半个小时)向服务器发送请求,获得其最新的配置信息,并且严格按照配置文件来配置客户端,保证和该配置信息同步。配置完成以后,Puppet客户端可以反馈给服务器端一个消息. 如果出错,也会给服务器端反馈一个消息。

三、Puppet的适用场景是什么?

1、由于Puppet的工作模式是agent节点到master节点“拉取同步信息”,它适用于有非常多的节点的大集群,对配置生效时间不敏感的场景。

2、puppet把这些系统实体称之为资源,Puppet的设计目标是简化对这些资源的管理以及妥善处理资源间的依赖关系。

3、Puppet的全部就是管理资源,因此Puppet语言的焦点就是处理这些资源,避免重复配置。

4、Puppet的编译器会避免在不同的代码段里面管理同一个资源, 如果在不同的代码段对同一个资源进行配置,执行Puppet的时候你会得到一个语法错误.Puppet探测这种冲突的情况是通过判断资源类型和资源的title(标题),如果两个资源有相同的资源类型和title,那么就认为这两个资源是表示同一个资源。

四、原理

(一)工作模型

puppet 通过声明性、基于模型的方法进行IT自动化管理:
定义:通过puppet 的声明性配置语言定义基础设置配置的目标状态;
模拟:强制应用改变的配置之前先进行模拟性应用;
强制:自动、强制部署达成目标状态,纠正任何偏离的配置;
报告:报告当下状态及目标状态的不同,以及达成目标状态所进行的任何强制性改变;

puppet 三层模型如下:

 (二)工作流程

 (三)使用模型

puppet 的使用模型分为单机使用模型和 master/agent 模型

1、单机使用模型

实现定义多个 manifests --> complier --> catalog --> apply

 2、master/agent 模型

master/agent 模型实现的是集中式管理,即 agent 端周期性向 master 端发起请求,请求自己需要的数据。然后在自己的机器上运行,并将结果返回给 master 端。

架构和工作原理如下:

 

 (四)名词解释

1、资源:是puppet的核心,通过资源申报,定义在资源清单中。相当于ansible中的模块,只是抽象的更加彻底。

2、类:一组资源清单。

3、模块:包含多个类。相当于ansible中的角色

4、站点清单:以主机为核心,应用哪些模块。

五、puppet 资源详解

(一)程序安装及环境

首先,我们还是来安装一下 puppetpuppet 的安装可以使用源码安装,也可以使用 rpm(官方提供)、epel 源、官方提供的 yum 仓库来安装(通过下载官方提供的 rpm 包可以指定官方的 yum 仓库)。在这里,我们就是用 yum 安装的方式。

 命令:yum  -y  install  puppet

安装完成过后,我们可以通过rpm -ql puppet | less来查看一下包中都有一些什么文件。其中主配置文件为 /etc/puppet/puppet.conf,使用的主程序为 /usr/bin/puppet

(二)puppet 资源简介

1、资源抽象

puppet 从以下三个维度来对资源完成抽象:

①相似的资源被抽象成同一种资源**“类型”** ,如程序包资源、用户资源及服务资源等;

将资源属性或状态的描述与其实现方式剥离开来,如仅说明安装一个程序包而不用关心其具体是通过 yum、pkgadd、ports 或是其它方式实现;

仅描述资源的目标状态,也即期望其实现的结果,而不是其具体过程,如“确定 nginx 运行起来” 而不是具体描述为“运行 nginx 命令将其启动起来”;

这三个也被称作 puppet 的资源抽象层(RAL),RAL 由 type( 类型) 和 provider( 提供者,即不同 OS 上的特定实现)组成。

2、资源定义

资源定义通过向资源类型的属性赋值来实现,可称为资源类型实例化;

定义了资源实例的文件即清单,manifest;

定义资源的语法如下:

type {'title':

attribute1 => value1,

atrribute2 => value2,

……

}

注意:type必须使用小写字符;title是一个字符串,在同一类型中必须惟一;每一个属性之间需要用“,”隔开,最后一个“,”可省略。例如,可以同时有名为nginx 的“service”资源和“package”资源,但在“package” 类型的资源中只能有一个名为“nginx”的资源。

3、资源属性

资源属性中的三个特殊属性:

Namevar:可简称为name;

ensure:资源的目标状态;

Provider:指明资源的管理接口;

(三)常用资源

1、查看资源

我们可以使用puppet describe来打印有关Puppet资源类型,提供者和元参数的帮助。使用语法如下:

puppet describe [-h|--help] [-s|--short] [-p|--providers] [-l|--list] [-m|--meta] [type]
    -l:列出所有资源类型;
    -s:显示指定类型的简要帮助信息;
    -m:显示指定类型的元参数,一般与-s一同使用;
 

2、group(管理系统上的用户组。)

①查看使用帮助信息:

②group 使用帮助

属性:

        name:组名,可以省略,如果省略,将继承title的值;

        gid:GID;

        system:是否为系统组,true OR false;

        ensure:目标状态,present/absent;

        members:成员用户;

③简单举例如下:

vim group.pp

        group{'mygrp':

           name => 'mygrp',

           ensure => present,

           gid => 2000,

        }

运行一下:

运行写好的group资源

3、user(管理系统上的用户)

①查看使用帮助信息:

 ②user使用帮助

属性:
    name:用户名,可以省略,如果省略,将继承title的值;
    uid: UID;
    gid:基本组ID;
    groups:附加组,不能包含基本组;
    comment:注释;
    expiry:过期时间 ;
    home:用户的家目录;
    shell:默认shell类型;
    system:是否为系统用户 ;
    ensure:present/absent;
    password:加密后的密码串;
 

 ③简单举例如下:

vim user1.pp
    user{'keerr':
        ensure => present,
        system => false,
        comment => 'Test User',
        shell => '/bin/tcsh',
        home => '/data/keerr',
        managehome => true,
        groups => 'mygrp',
        uid => 3000,
    }
 

4、package(puppet的管理软件包)

①查看使用帮助信息:

②package 使用帮助

属性:
    ensure:installed, present, latest, absent, any version string (implies present)
    name:包名,可以省略,如果省略,将继承title的值;
    source:程序包来源,仅对不会自动下载相关程序包的provider有用,例如rpm或dpkg;
    provider:指明安装方式;

 ③简单举例如下:

vim package1.pp

        package{'nginx':

          ensure => installed,

          procider => yum

        }

5、service(定义服务的状态)

①查看使用帮助信息:

②service 使用帮助

属性:
    ensure:服务的目标状态,值有true(running)和false(stopped)
    enable:是否开机自动启动,值有true和false
    name:服务名称,可以省略,如果省略,将继承title的值
    path:服务脚本路径,默认为/etc/init.d/下
    start:定制启动命令
    stop:定制关闭命令
    restart:定制重启命令
    status:定制状态

 ③简单举例如下:

vim service1.pp

        service{'nginx':

          ensure => true,

          enable => false

        }

6、file(管理文件、目录、软链接

①查看使用帮助信息:

②file使用帮助

属性:
    ensure:目标状态,值有absent,present,file,directory和link
        file:类型为普通文件,其内容由content属性生成或复制由source属性指向的文件路径来创建;
        link:类型为符号链接文件,必须由target属性指明其链接的目标文件;
        directory:类型为目录,可通过source指向的路径复制生成,recurse属性指明是否递归复制;
    path:文件路径;
    source:源文件;
    content:文件内容;
    target:符号链接的目标文件;
    owner:定义文件的属主;
    group:定义文件的属组;
    mode:定义文件的权限;
    atime/ctime/mtime:时间戳;

 ③简单举例如下:

vim file1.pp

        file{'aaa':

          path => '/data/aaa',

          source => '/etc/aaa',

          owner => 'keerr',

          mode => '611',

        }

7、exec(执行命令,慎用。通常用来执行外部命令)

①查看使用帮助信息:

puppet describe exec -s -m

②exec 使用帮助

属性:
    command(namevar):要运行的命令;
    cwd:指定运行该命令的目录;
    creates:文件路径,仅此路径表示的文件不存在时,command方才执行;
    user/group:运行命令的用户身份;
    path:指定命令执行的搜索路径;
    onlyif:此属性指定一个命令,此命令正常(退出码为0)运行时,当前command才会运行;
    unless:此属性指定一个命令,此命令非正常(退出码为非0)运行时,当前command才会运行;
    refresh:重新执行当前command的替代命令;
    refreshonly:仅接收到订阅的资源的通知时方才运行;

 ③简单举例如下:

vim exec1.pp
    exec{'cmd':
            command => 'mkdir /data/testdir',
        path => ['/bin','/sbin','/usr/bin','/usr/sbin'],
    #   path => '/bin:/sbin:/usr/bin:/usr/sbin',
    }

8、cron(定义周期性任务)

①查看使用帮助信息:

②cron 使用帮助

属性:
    command:要执行的任务(命令或脚本);
    ensure:目标状态,present/absent;
    hour:时;
    minute:分;
    monthday:日;
    month:月;
    weekday:周;
    user:以哪个用户的身份运行命令(默认为root);
    target:添加为哪个用户的任务;
    name:cron job的名称;

 ③简单举例如下:

vim cron1.pp
    cron{'timesync':
        command => '/usr/sbin/ntpdata 172.16.0.1',
        ensure  => present,
        minute  => '*/3',
        user    => 'root',
    }

我们可以运行一下,查看我们的 crontab,来看看该任务是否已经被添加:

[root@master manifests]# puppet apply -v --noop cron1.pp         #试运行
[root@master manifests]# puppet apply -v  cron1.pp                 #运行
[root@master manifests]# crontab -l                #查看计划任务
# HEADER: This file was autogenerated at 2017-12-14 15:05:05 +0800 by puppet.
# HEADER: While it can still be managed manually, it is definitely not recommended.
# HEADER: Note particularly that the comments starting with 'Puppet Name' should
# HEADER: not be deleted, as doing so could cause duplicate cron jobs.
# Puppet Name: timesync
*/3 * * * * /usr/sbin/ntpdata 172.16.0.1

9、notify(调试输出)

①查看使用帮助信息:

 ②notify使用帮助

属性:

 message:记录的信息

 name:信息名称

该选项一般用于 master/agent 模式中,来记录一些操作的时间,比如重新安装了一个程序呀,或者重启了应用等等。会直接输出到代理机的运行日志中。以上,就是我们常见的8个资源。其余的资源我们可以使用 puppet describe -l 来列出。

(四)资源的特殊属性

1、puppet 中也提供了 beforerequirenotify 和 subscribe 四个参数来定义资源之间的依赖关系和通知关系。

before:表示需要依赖于某个资源
require:表示应该先执行本资源,在执行别的资源
notify:A notify B:B依赖于A,且A发生改变后会通知B;
subscribe:B subscribe A:B依赖于A,且B监控A资源的变化产生的事件;

2、同时,依赖关系还可以使用 -> 和 ~> 来表示:

-> 表示后资源需要依赖前资源
~> 表示前资源变动通知后资源调用

3、举例如下:

vim file.pp
    file{'test.txt':                    #定义一个文件
        path   => '/data/test.txt',
        ensure  => file,
        source  => '/etc/fstab',
    }
 
    file{'test.symlink':                #依赖文件建立超链接
        path   => '/data/test.symlink',
        ensure  => link,
        target  => '/data/test.txt',
        require => File['test.txt'],
    }
 
    file{'test.dir':                    #定义一个目录
        path   => '/data/test.dir',
        ensure  => directory,
        source  => '/etc/yum.repo.d/',
        recurse => true,
    }

4、我们还可以使用在最下面统一写依赖关系的方式来定义:

vim redis.pp
    package{'reids':
        ensure  => installed,
    }
 
    file{'/etc/redis.conf':
        source  => '/root/manifets/files/redis.conf',
        ensure  => file,
        owner   => redis,
        group   => root,
        mode    => '0640',
    }
&n

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值