设为首页 收藏本站
查看: 1072|回复: 0

[经验分享] puppet 深入讲解

[复制链接]

尚未签到

发表于 2018-8-2 11:50:09 | 显示全部楼层 |阅读模式
  一、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>  ...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

  >  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>  }
  应用子类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>  }
  
}
  应用测试子类 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>  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>  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发出请求,查看适用于自己的清单是否发生改变;
DSC0000.jpg

  注意事项:
  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:天热了,电脑冒汗了,码字真心慢!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-545331-1-1.html 上篇帖子: puppet 安装及核心资源注解 下篇帖子: puppet的认识
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表