Puppet是一种Linux、Unix平台的集中配置管理系统使用ruby语言可管理配置文件用户、cron任务软件包系统服务等。Puppet把这些系统实体称之为资源,Puppet的设计目标是简化对这些资源的管理以及妥善处理资源间的依赖关系


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

基于puppet ,可实现自动化重复任务快速部署关键性应用以及在本地或云端完成主动管理变更和快速扩展架构规模等

遵循GPL 协议(2.7.0-), 基于ruby语言开发

2.7.0 以后使用(Apache 2.0 license)

对于系统管理员是抽象的只依赖于rubyfacter

能管理多达40 多种资源例如fileusergrouphostpackageservicecronexecyum repo


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

puppet_第1张图片

Puppet工作流程

puppet_第2张图片


使用模型

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



单机使用模型

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

puppet_第3张图片

master/agent模型

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

puppet_第4张图片

从上面的图我们可以看到,Master接收到Agent的请求后会查找自己的Manifests及相关的配置并找到请求节点相关的内容然后编译成Catalog,发回给Agent执行


这个过程大概有这样几个步骤

1. Master加载配置文件

2. 查找节点定义查看节点中声明的资源和类

3. 查找到这些资源和类编译生成Catalog

 

 

puppet 名词解释

 

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

    一组资源清单

    模块包含多个类相当于ansible中的角色

    站点清单以主机为核心应用哪些模块

 


操作篇:

 操作环境:

   


192.168.80.181


master.czm.com

ruby ruby-libs ruby-shadow

 puppet puppet-server facter

ntp

192.168.80.182 client01.czm.com  puppet    ntp
192.168.80.183 client02.czm.com  puppet      ntp

注:三台主机均为NAT模式

修改主机名:

  hostnamectl set-hostname   主机名

  exit  登出

  重连即可



master:

搭建

systemctl stop firewalld && setenforce 0 //关闭防火墙及selinux

释放网络仓库    重启网卡使主机可以ping通外网ip  

vi /etc/hosts

puppet_第5张图片

scp 发送给其他两台主机


yum install ntp -y  //时间同步

ntpdate time1.aliyun.com   //同步阿里云网络时间


yum install -y epel-release   //安装网络源

yum -y install ruby ruby-libs ruby-shadow  

yum -y  install puppet puppet-server facter


vi /etc/puppet/puppet.conf //[main]下新增

  modulepath = /etc/puppet/modules:/usr/share/puppet/modules


systemctl start puppetmaster

systemctl enable puppetmaster    //启动服务以及开机自启


netstat -anpt | grep 8140

image.png


client:(01和02搭建的环境基本一致)

关闭防火墙以及selinux      ntp同步网络时间     安装epel源

yum install -y puppet

注:

其中主配置文件为/etc/puppet/puppet.conf,使用的主程序为/usr/bin/puppet。

 

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

 

puppet describe [-h|--help] [-s|--short] [-p|--providers] [-l|--list] [-m|--meta] [type]

-l:列出所有资源类型;

-s:显示指定类型的简要帮助信息;

-m:显示指定类型的元参数,一般与-s一同使用;

 

例子:

puppet describe  -l -s -m


vi /etc/puppet/puppet.conf  //[agent]下添加末尾添加

puppet_第6张图片

定义主服务器name



service puppet start

systemctl enable puppet

ps aux | grep pupp

puppet_第7张图片


——————————申请与注册————————————


 

client上操作--接着在服务器上授权

 

client申请注册

puppet agent --server=master.czm.com --no-daemonize --verbose --debug

 

master

puppet cert --list //查看申请的客户端

puppet_第8张图片

 

puppet cert sign --all

 //将未注册的客户端进行注册

ll /var/lib/puppet/ssl/ca/signed/  //查看已经注册的客户端

puppet_第9张图片

 

认证报错后

find /var/lib/puppet -type f -print0 |xargs -0r rm  //删除认证ssl

将删除语句执行在了master主机上客户端连接报以下错

重启puppetmaster即可

 

到此申请完成


配置实例

案例描述

为了保护linux的ssh端口,批量修改客户端sshd端口,将22端口修改为9922,并实现重启工作。


注:配置文件内要注意格式  结尾不能多加空格行

1、创建必要的目录

master

mkdir -p /etc/puppet/modules/ssh/{manifests,templates,files}

//创建ssh模块模块下面有三个文件:manifests、templatesfiles  

 

 

mkdir /etc/puppet/manifests/nodes   //创建节点目录

mkdir /etc/puppet/modules/ssh/files/ssh   //创建ssh模块目录

chown -R puppet /etc/puppet/modules/

 

 

ll /etc/puppet/modules/ssh/

 

 

2、创建模块配置文件install.pp

vi /etc/puppet/modules/ssh/manifests/install.pp  //新建文件首先确定客户端安装ssh服务

 

class ssh::install{

package{"openssh":

        ensure => present,

        }

}

 

 

 

vi /etc/puppet/modules/ssh/manifests/config.pp//新建文件

class ssh::config{

file {"/etc/ssh/sshd_config":

        ensure => present,

        owner => "root",

        group => "root",

        mode => "0600",

        source => "puppet://$puppetserver/modules/ssh/ssh/sshd_config",

        require => Class["ssh::install"],

        notify => Class["ssh::service"],

        }

}

 

 

vi /etc/puppet/modules/ssh/manifests/service.pp //新建文件

class ssh::service {

        service {"sshd":

                ensure=>running,

                hasstatus=>true,

                hasrestart=>true,

                enable=>true,

                require=>Class["ssh::config"]

        }

}

 

 

vi /etc/puppet/modules/ssh/manifests/init.pp  //新建文件

class ssh{

        include ssh::install,ssh::config,ssh::service

}

 

ll /etc/puppet/modules/ssh/manifests/  //下面有四个文件

 

 

cp /etc/ssh/sshd_config /etc/puppet/modules/ssh/files/ssh/

chown puppet /etc/puppet/modules/ssh/files/ssh/sshd_config  //修改权限

 

vi /etc/puppet/manifests/nodes/ssh.pp

node 'client02.czm.com' {

        include ssh

}

node 'client01.czm.com' {

        include ssh

}

 

 

vi /etc/puppet/manifests/site.pp  //新建文件

import "nodes/ssh.pp"

 

vi /etc/puppet/modules/ssh/files/ssh/sshd_config  //修改(13)

Port 9922

 

service puppetmaster restart  //重新启动puppet

 

--------------client----客户端主动拉取---------

puppet agent -t

 

 puppet_第10张图片

cat /etc/ssh/sshd_config   //验证如下

Port 9922

#AddressFamily any

#ListenAddress 0.0.0.0

#ListenAddress ::

 

从上图可以看出更换了ssh的端口

 

netstat -tunlp| grep ssh  //查看服务器ssh服务是否重启端口是否生效

 image.png

 

5、配置服务器推送同步客户端

 

vi /etc/puppet/puppet.conf  //最后一行添加

listen = true

 

vi /etc/puppet/auth.conf   //最后一行添加

allow *

 

service puppet restart  //启动puppet客户端

 

 

cat /etc/ssh/sshd_config //查看

#Port 22

#AddressFamily any

#ListenAddress 0.0.0.0

#ListenAddress ::

 

 

netstat -tunlp| grep ssh   //确认启动ssh服务

 

 

------------master---------------

 

puppet kick  clientname  //开始往客户端推送

 

 

vi /etc/ssh/sshd_config   //clientname上查看验证如下

Port 9922

#AddressFamily any

#ListenAddress 0.0.0.0

#ListenAddress ::

 

 

netstat -tunlp| grep sshd  //clientname上查看查看服务器ssh服务是否重启端口是否生效


扩展

管理系统上的用户组

vim group.pp
        group{'mygrp':
        name => 'mygrp',
        ensure => present,
        gid => 2000,
        }

说明

        name:组名可以省略如果省略将继承title的值
        gid:GID;
        system:是否为系统组,true OR false;
        ensure:目标状态,present/absent;
        members:成员用户;

 

管理系统上的用户

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

说明

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

 

puppet的管理软件包

vim package1.pp
        package{'nginx':
                   ensure  => installed,
            provider    =>  yum
        }        

 

说明

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

 

定义服务的状态

vim service1.pp
        service{'nginx':
                    ensure  => true,
            enable  => false
        }

 

说明

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

 

管理文件目录软链接

vim file1.pp
        file{'aaa':
                    path    => '/data/aaa',
            source  => '/etc/aaa',
            owner   => 'keerr',
            mode    => '611',
        }

说明

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

 

执行命令慎用通常用来执行外部命令

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

 

说明

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

 

 

定义周期性任务

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

 

说明

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