puppet 深入讲解

一、Modules概述

到目前为止,关于puppet的资源申报、定义类、声明类等所有功能都只能在一个manifest(清单)文件中实现,但这却非最有效的基于puppet管理IT基础架构的方式

实践中,一般需要把manifest文件分解成易于理解的结构,例如将类文件、配置文件甚至包括后面将要提到的模板文件等分类存放,并且通过某种机制在必要时将他们整合起来;

这种机制就是“模板”,它有助于以结构化、层次化的方式使用puppet,而puppet则基于“板块自动装载器”完成模块装载,从另一个角度来说,模板实际上就是一个按约定的、预定义的结构存放了多个文件或子目录的目录,目录里的这些文件或子目录必须遵循其命名规法

puppet会按照此种规法在特定位置查找所需的模块文件,不过,这些特定目录也可以通过puppet的配置参数modulepath定义

只要在某模板中定义了一个类,就可以在任何manifest文件中使用它,puppet会自动去查找并装载包含了这个类的定义的manifest文件任意使用他们。于是基于模块机制的puppet的主manifest文件就可以变得很小,也更易懂并能基于策略进行定制

模块目录的结构

在puppet中,模块本身用一个目录表示,其需要存放于puppet的modulepath参数所定义的目录中,如/etc/puppet/modules,模块目录名称必须与模块名称相同,需要遵循特定的组织结构,如下

MODULE NAME

    manifests
        init.pp
    files

    templates

    lib

    tests
    spec
MODULE NAME:模块名称,也是模块目录名称;模块名称只能以小写字母开头,可以包含小写字母、数字和下划线,但不能使用"main"或"setting"作为模块名;
   manifests目录:包含当前模块的所有manifest文件;每个manifest文件必须
                  包含一个类或定义一个类,此访问访问路径格式为
                  "ModuleName::[SubDirectoryName::]ManifestFileName"
                   注意manifest文件名不需要其后缀.pp
              init.pp:只能包含了一个单独的类定义,且类的名称必须与模块名称相同;

   files目录 :包含了一组静态文件,这些文件可被节点下载使用;每个
               文件的访问路径遵循
       puppet://modules/MODULE_NAME/filename路径格式

   lib  目录 :插件目录,常用于自定义fact及自定义资源类型等;
   templates目录:存储了manifest用到的模板文件,其访问路径遵循
       template(‘ModuleName/TemplateName‘)格式
   tests目录 : 当前模块的使用帮助或使用范例文件,类似于如何声明当前模块中的类即定义的类型等;
    spec目录 :类似于tests目录的功能,只不过,其是为lib目录定义的各插件提供使用范例的;

二、类知识点回顾

类就是命名的代码块,存放着一个或者多个资源 ;可以继承

类的命名方式

class class_name {

...puppet code...

}

子类的命名方式

class parent_name::subclass_name inherits parent_name {

}

多级继承的子类

class grand_name::parent_name::subclass_name inherits grand_name::parent_name {

}

=> 在子类中覆盖父类中的资源

+> 在子类中为父类的资源新增属性

声明类(3种方式)

include

require

class { ‘class_name‘:

params1 =>value1,

params2 =>value2,

}

三、 实例演示

nginx模块:

nginx  ---------------父类

nginx程序包 ------父类定义的资源

nginx::web  ---------子类1

file    -------子类1定义的资源1

service ------ 子类2定义的资源2

nginx::rproxy -------子类2

file    --------子类2定义的资源1

service --------子类2定义的资源2

实现步骤:

1、 定义一个父类清单,并应用测试

#puppet agent --configprint modulepath   查看模块目录路径
 /etc/puppet/modules:/usr/share/puppet/modules 这两个路径都可以使用,都可以被puppet自动找到
# cd /etc/puppet/modules
# mkdir -pv nginx/{manifests,files,templates}
定义一个父类
# cd  /nginx/manifests
# vim init.pp
class nginx {
      package {‘nginx‘:
            ensure => present,
            name   => nginx,
       }
}
# puppet apply -d -v -e ‘include nginx‘
# rpm -q nginx
  nginx-1.0.15-5.el6.x86_64

我们可以不使用 #puppet apply -d -v -e ‘include nginx‘来应用

另一种方式应用 ----node调用

知识点:

定义节点:也需要在清单文件中定义,文件名后缀为.pp;在master/agent中,所有节点清单入口文件为site.pp
格式:
  node ‘node_name‘ {
      节点专用变量
      类声明
  }
##建议一类节点使用一个清单文件,所有的清单文件都在site.pp中使用import包含进来
# vim  local.pp
node ‘node3.linux.com‘ {
   include nginx
}
# puppet apply local.pp
# rpm -q nginx
  nginx-1.0.15-5.el6.x86_64

2、定义两个子类并应用测试

# cd  /etc/puppet/modules/nginx
# cp  /etc/nginx/nginx.conf files/nginx.web.conf
# cp  /etc/nginx/nginx.conf files/nginx.rproxy.conf
# vim files/nginx.web.conf 做如下修改
  worker_processes  4;
  worker_connections  10240;
# vim  files/nginx.reproxy.conf 做如下修改
  worker_processes  2;
###简单修改下,方便后边的应用测试

2.1 创建子类nginx::web

# cd  /etc/puppet/modules/nginx
# cd manifests
# vim web.pp
class nginx::web inherits nginx {
  file {‘nginx.conf‘:
        ensure  => file,
        source  => "puppet:///modules/nginx/nginx.web.conf",
        path    => ‘/etc/nginx/nginx.conf‘,
        require => Package[‘nginx‘],
        mode    => ‘0644‘,
        notify  => Service[‘nginx‘],
   }
   service {‘nginx‘:
         ensure  => true,
         enable  => true,
         name    => nginx,
         restart => ‘/etc/inig.d/nginx reload‘,
   }

应用子类nginx::web

先卸载掉nginx
# rpm  -e nginx
# puppet apply -d -v -e ‘include nginx::web‘
# rpm -q nginx
  nginx-1.0.15-5.el6.x86_64
# cat /etc/nginx/nginx.conf | grep worker_processes
  worker_processes  4;
# cat /etc/nginx/nginx.conf | grep worker_connections
  worker_connections  10240;
##跟我们上边修改的web.conf配置文件相同,应用正常

2.2创建子类 nginx::rproxy

# cd /etc/puppet/modules/nginx/
# cd manifests
# vim rproxy.pp
class nginx::rproxy inherits nginx {
        file {‘nginx.conf‘:
           ensure => file,
           source => "puppet:///modules/nginx/nginx.rproxy.conf",
           path   => "/etc/nginx/nginx.conf",
           require => Package[‘nginx‘],
           mode   => ‘0644‘,
           notify => Service[‘nginx‘],
         }
         service {‘nginx‘:
            ensure => true,
            enable => true,
             restart => ‘/etc/init.d/nginx reload‘,
         }
}

应用测试子类 nginx::rproxy

先将nginx卸载
# rpm -e nginx
# rm -rf /etc/nginx/
创建一个node调用
# vim local.pp
node ‘node3.linux.com‘ {
   include nginx::rproxy
}
# puppet apply  local.pp
# rpm -q  nginx
 nginx-1.0.15-5.el6.x86_64
# service nginx status
nginx (pid  5669) 正在运行...
# cat /etc/nginx/nginx.conf | grep worker_processes
worker_processes  2;
###程序包已安装,服务已启动,而且rproxy.conf配置文件已经应用。

四、puppet模板

语法:

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

<%= @processorcount %>

<% ruby code %>仅执行代码,不做任何替换;常用于条件判断或循环语句、设定变量以及在输出之前对数据进行处理;

<%# commit%>注释

<%% 输出<%

%%>:显示%>

调用模板变量:变量完全限定名称

迭代和条件判断

使用模板生成文件时,使用的文件属性为content

content => template(‘module_name/template_file_name‘)

实例:

1、提供模板

#cd  /etc/puppet/modules/
#cd nginx/files
#rm -rf * 删除过去拷贝的文件
#cp /etc/nginx/conf.d/default.conf nginx.web.conf
#cp /etc/nginx/conf.d/default.conf nginx.rproxy.conf
#vim nginx.web.conf 稍作修改
  server_name  node3.linux.com;
#vim nginx.rproxy.conf 稍作修改
   proxy_pass http://172.16.0.1;
#cd /etc/puppet/modules/nginx/templates
#cp /etc/nginx/nginx.conf . 提供一个模板文件
#vim nginx.conf 修改如下内容
 worker_processes  <%= @processorcount %>;
# mv nginx.conf nginx.conf.erb

2 创建父类

# cd /etc/puppet/modules/nginx/manifests
# vim init.pp
class nginx {
      package {‘nginx‘:
           ensure => present,
      }
      file {‘nginx.conf‘:
           ensure => file,
           content => template(‘nginx/nginx.conf.erb‘),
           path   => ‘/etc/nginx/nginx.conf‘,
           require => Package [‘nginx‘],
           mode   => ‘0644‘,
      }
}

3、定义两个子类 nginx::web  nginx::rproxy

nginx::web

# cd /etc/puppet/modules/nginx/manifests
# vim web.pp
class nginx::web inherits nginx {
        file {‘nginx.web.conf‘:
           ensure => file,
           source => "puppet:///modules/nginx/nginx.web.conf",
           path   => "/etc/nginx/conf.d/default.conf",
           require => Package[‘nginx‘],
           mode   => ‘0644‘,
         }
         service {‘nginx‘:
            ensure => true,
            enable => true,
             restart => ‘/etc/init.d/nginx reload‘,
            subscribe => File[‘nginx.conf‘,‘nginx.web.conf‘],
         }
}

nginx::rproxy

#cd /etc/puppet/modules/nginx/manifests
# vim rproxy.pp
class nginx::rproxy inherits nginx {
        file {‘nginx.rproxy.conf‘:
           ensure => file,
           source => "puppet:///modules/nginx/nginx.rproxy.conf",
           path   => "/etc/nginx/conf.d/default.conf",
           mode   => ‘0644‘,
           notify => Service[‘nginx‘],
         }
         service {‘nginx‘:
            ensure => true,
            enable => true,
             restart => ‘/etc/init.d/nginx reload‘,
            subscribe =>File[‘nginx.conf‘,‘nginx.rproxy.conf‘],
         }
}

应用测试子类nginx::web

先卸载掉nginx
# rpm -e nginx
# rm -rf /etc/nginx/ 删除目录
# puppet apply -d -v -e ‘include nginx::web‘
# cat /etc/nginx/nginx.conf | grep worker_processes
  worker_processes  2;
根据 <%= @processorcount %>变量调用当前cpu的核心数
# cat /etc/nginx/conf.d/nginx.conf
  server_name  node3.linux.com;
####我们修改的nginx.wen.conf 也应用上来了,一切正常

五、master/agent 架构

即主从模式下工作

agent每隔30分钟向master发出请求,查看适用于自己的清单是否发生改变;

注意事项:

1 master/agent 架构中,各个节点必须能够解析到彼此的主机名;

标准的主机名命名方式为:

角色名-运营商-机房名-机器IP.域名

例如:web-CNC-ShangHai-1.1.1.1.jungege.com

2 各个节点要做到时间同步;

1)安装

配置epel的yum源,使用yum命令安装

环境搭建:

puppet-master 172.16.13.2 node2.linux.com

puppet-agent  172.16.13.3 node3.linxu.com

安装puppet服务器端

#yum  -y install puppet-server

安装puppet客户端

#yum -y install puppet

2)解析双方主机

解析双方主机,可以使用DNS和hosts文件,我们直接使用host解析的方式经I系那个

建议的主机命名方式

角色名-运营商-机房名-机器ip.域名

3)master服务器配置

初始化

#puppet master --daemonize -d -v
info: Creating a new SSL key for ca
info: Creating a new SSL certificate request for ca
info: Certificate Request fingerprint (md5): FA:B1:10:A7:AD:EA:8B:83:04:A1:3B:F8:4F:77:85:92
notice: Signed certificate request for ca
notice: Rebuilding inventory file
debug: Using cached certificate for ca
info: Creating a new certificate revocation list
info: Creating a new SSL key for node2.linux.com
debug: Using cached certificate for ca
info: Creating a new SSL certificate request for node2.linux.com
info: Certificate Request fingerprint (md5): 63:26:1D:A0:B9:D7:F4:0C:A7:E0:C4:59:8D:D9:04:19
notice: node2.linux.com has a waiting certificate request
debug: Using cached certificate for ca
debug: Using cached certificate_request for node2.linux.com
notice: Signed certificate request for node2.linux.com
notice: Removing file Puppet::SSL::CertificateRequest node2.linux.com at ‘/var/lib/puppet/ssl/ca/requests/node2.linux.com.pem‘
notice: Removing file Puppet::SSL::CertificateRequest node2.linux.com at ‘/var/lib/puppet/ssl/certificate_requests/node2.linux.com.pem‘
notice: Starting Puppet master version 2.7.23

定义配置文件

#puppet  master genconfig >> /etc/puppet/puppet.conf         qi

启动服务

# service puppetmaster start
# ss -ntlp
默认侦听在8140端口

同步时间

# ntpdate time.windows.com

4)配置puppet客户端

puppet agent在首次启动时,会像指定的puppet srver申请证书,并完成后续的连接请求,由于我们只是测试,接入当前puppet集群中的首个agent节点可以以非守护进程的方式运行,并观察其启动过程

# puppet  agent --server node2.linux.com --no-daemonize --debug
info: Creating a new SSL key for node2.linux.com
info: Caching certificate for ca
info: Creating a new SSL certificate request for node2.linux.com
info: Certificate Request fingerprint (md5): BC:B2:36:9F:B5:78:CD:60:1E:72:9A:D5:88:DE:4B:57

此时,在puppet服务器段使用puppet cert命令管理客户端的证书请求,--list选项能够查看等待签署证书的客户端列表,而--sign选项可以用于为指定节点签署证书,如果要一次性地对多个节点申请进行签署可以使用--all选项

# puppet cert list
  "node3.linux.com" (A0:DA:47:AD:A5:AF:0F:89:54:31:50:A3:FB:BE:50:C0)
# puppet cert sign node3.linux.com
notice: Signed certificate request for node3.linux.com
notice: Removing file Puppet::SSL::CertificateRequest node3.linux.com at ‘/var/lib/puppet/ssl/ca/requests/node3.linux.com.pem

一旦anget节点收到签署过的证书,其将会显示如下信息

# puppet agent --no-daemonize -d -v --test
info: Caching certificate for node3.linux.com
notice: Starting Puppet client version 2.7.25

确保上述agent相关操作,不存在问题后,便可以使用--server选项指定puppet master服务器,并以守护进程的方式启动服务了,其配置文件为/etc/puppet/puppet.conf

# echo "server=node2.linux.com" >> /etc/puppet/puppet.conf
# service puppet start
# chkconfig puppet on

5)site.pp的配置

在puppet服务器段的/etc/puppet/manifests/中创建site.pp,在master/agent架构中,所有节点访问清单文件的入口为site.pp

# vim node3.linux.com.pp 如果有多个节点,就创建多个...
node ‘node3.linux.com‘ {
   include nginx::web
}
# vim site.pp
import "*.linux.com.pp"

建议:一类节点使用一个清单文件,所有清单文件都在site.pp文件中用import函数包含进来

6)自动签发证书

可以设置master自动签发所有节点的证书,只需要在/etc/puppet目录下创建autosign.conf即可

# echo "*.linux.com." > /etc/puppet/autosign.conf
这样就会对所有来自autosign.conf的机器请求自动签署证书

7)puppet kick推送功能的实现

puppet客户端默认每30分钟向服务器申请一次,有的特殊情况需要立刻生效,则需要puppet kick将当前配置推送给客户端,立刻实现目标状态的改变

① 编辑客户端配置文件/etc/puppet/puppet.conf 在[agent]段添加如下内容

# echo "listen=true" >> /etc/puppet/puppet.conf
# ss -ntl
默认侦听在8139端口

② 在客户端创建新文件/etc/puppet/namespaceauth.conf

[puppetrunner]
allow *.linux.com

③ 在客户端编辑/etc/puppet/auth.conf文件,添加如下内容

path  /run
method save
auth  any
allow *.linux.com

④kick推送,在服务器段运行kick子命令

# puppet kick -p 10 node.linux.com
Triggering node3.linux.com
Getting status
status is success
node3.linux.com finished with exit code 0
Finished

⑤此时就可以在客户端节点查看变化了

关于puppet-dashboard、foreman、git的使用与配置请参考其他,此处不再做详解

PS:天热了,电脑冒汗了,码字真心慢!

puppet 深入讲解,布布扣,bubuko.com

时间: 2024-08-04 01:11:06

puppet 深入讲解的相关文章

SVN自助更新:运维利器Puppet实例讲解(一)(1)

Puppet是一种Linux.Unix平台的集中配置管理系统,使用自有的puppet描述语言,可管理配置文件.用户.cron任务.软件包.系统服务等.本文通过Puppet进行Apache Web服务器的配置同步,对于两台以上服务器的配置管理非常方便. 这个SVN自助更新系统的实现思路如下: 一.开发平台 apache+perl-cgi puppet 二.功能介绍 系统管理员/项目执行者/开发人员通过web的get对应的url,然后触发更新puppet-master中的一个文件,puppet-cl

一次puppet部署自动化的尝试

背景: 大约有20台的生产和测试主机(Centos5.3),有6个大模块,以前都是用手动安装的,费时费力,有时也会手动操作出错. 目标: 希望用puppet来实现部署的自动化 下面以其中的一个模块的自动化部署尝试来讲解如何实现用puppet的部署自动化. 前提: 在一台测试机上安装puppet master,一台装puppet agent.具体的安装和配置过程就不再讲述了,网上的资料一堆堆的. 现在着重讲述如何配置puppet的类. 创建一个模块,叫ppe/etc/puppet/modules/

puppet的配置

1时间问题 agent与master端务必要保持时间的一致性,最好使用ntp服务 检查ntp服务是否安装 [[email protected] ~]# rpm -qa|grep ntp ntpdate-4.2.6p5-10.el6.centos.1.x86_64 ntp-4.2.6p5-10.el6.centos.1.x86_64 由于我使用的阿里云的服务器,这个已经默认配置好了,如下 1 cat /etc/ntp.conf 2 3 # ntp.conf 4 5 driftfile /var/l

自动化运维工具puppet(二)

一.Puppet作域与变量 1.作用域 作域的作就是指定特定的代码与其他的代码进隔离. 变量与默认资源将接受这些限制, 资 源标题. 资源引将不接受这样的限制. 接受范围限制的有: 变量 默认资源 不接受范围限制的有: 资源标题 资源引 在任何给定作域内, 可访问在本域中定义的变量或资源默认值, 同时继承作域中的内容, 依 此类推. 因此, 任何局部作域都可访问顶级作域中的内容. 使的范围是从该节点作域内直到 全局作域, 如下图所. 从上图可以看到: 在全局作域内只能访问作域的变量及默认值. 节

puppet自动化搭建

一:基础讲解 Ntp,DNS需要 源码先安装ruby,facter,puppet Cd puppet-XXX Ruby install.rb 二:环境搭建 1.服务端master A.yum配置 环境自带源 rpm -ivh https://yum.puppetlabs.com/el/7/products/x86_64/puppetlabs-release-7-10.noarch.rpm yum install puppet-server -y B. hosts配置 vi /etc/hosts

Puppet核心配置文件详解

在学习了Puppet原理及版本差异后,我们需要掌握它的核心配置文件.Puppet所有的配置都围绕着Puppet.conf展开. puppet.conf 默认配置文件目录/etc/puppet/. 由于puppet.conf配置文件内容较多,下面笔者将列举核心配置.常用配置选项(不区分Master与Agent):[main] #通用配置选项    vardir = /var/lib/puppet    confdir = /etc/puppet    logdir = /var/log/puppe

运维工具Ansible浅谈playbook讲解以及YAML语法和JSON语法的互化

引言:运维发展到今天已经远远不是传统的运维做一些重复性的枯燥工作,面对海量爆发的访问量,传统的运维已经很吃力,比如让你装三五台机器的系统,这个so easy,那要是安装几百上千台呢,还easy吗.我要安装nginx服务,并提供好相应的端口转发机制以及location资源访问机制,但是有多发十几台这样的机制,并且每台机器转发机制都不相同,这个对我们来说是一个不小的挑战,因此运维进入了自动化时代,自动化运维就显得重要了.因此本文就是围绕自动化运维工具Ansible来展开的. 一,为什么要使用Ansi

puppet aix之自动化用户管理

一.    用户组的管理 (一)   Puppet组管理特性 1.   manages_aix_lam 用来管理AIX的LAM(Loadable Authentication Module)系统. 2.   manages_members 对于目录服务是组属性成员,而不是用户. 3.   system_groups 用来允许你创建比较小GID的系统组,一般小于500. (二)   Puppet组管理参数 allowdupe 是否允许重复的GIDS,默认是false. attributes 在一个

Puppet node节点的特性(十二)

前言: 生产机器很多通常会新建nodes.pp文件和site.pp文件平级,存放于/etc/puppet/manifests/nodes.pp文件,这种方法比较常用.当然也有其他办法直接写入site.pp文件. nodes.pp文件主机匹配,支持正则表达式和继承. //:正则匹配 "":精确匹配 inherits:继承 实例: 先正则匹配然后在精确匹配. node /sh-(proxy|web)\d+/ {   case $::hostname {     "sh-proxy