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

[经验分享] 自动化管理工具puppet-GeminiYu

[复制链接]

尚未签到

发表于 2018-8-2 06:39:15 | 显示全部楼层 |阅读模式
Linux之puppet
puppet简介
  puppet是一套IT基础设施自动化管理工具,可以管理其整个生命周期,其官方网站:www.puppetlabs.org。其作者Luke Kanies成立了puppetLabs,于2005年发布0.2版本。puppet基于ruby语言研发,puppet有声明性、基于模型的配置语言,其也有自己的配置编程言。
puppet的优势

  •   基于master/agent的认证机制
  •   不依赖于客户端系统的管理权限
  •   可实现配置自动推送给客户端
puppet的版本

  •   0.2
  •   0.24.X
  •   0.25.X
  •   0.26.X
  •   2.7.X(目前比较流行的版本)
  •   3.0
  •   3.7

puppet的工作原理

  •   puppet是C/S架构
  •   puppet agent通常运行为一个服务进程,其默认每半个小时向master发出一次连接请求
  •   puppet agent并不直接访问任何manifest,而向master请求一个预编译的catalog文件
  •   puppet master会为发出请求的agent读取一个名为”site manifest”的特殊manifest文件,并基于此编译一个catalog后发送给请求者
  •   puppet agent在获取到catalog后,应用于本地文件
  因此,基于此种工作架构,仅在master端提供一个或少量几个Manifest即可实现管理大量的节点,并能提供更加安全的工作过程
DSC0000.jpg

  puppet的三个层次概念
  资源抽象层(resource abstraction layre)
  相似的资源被抽象成同一种资源“类型”,如程序包资源、用户资源及服务资源等
  将资源属性或状态的描述与其实现方式剥离开来,如仅说明安装一个程序包而不用关心其具体是通过yum、pkgadd、ports或是其它方式实现
  仅描述资源的目标状态,也即期望其实现的结果,而不是其具体过程,如“确定nginx运行起来”而不是具体描述为“运行nginx命令将其启动起来
  事务层(transaction layer)
  定义资源的依赖关系
  配置语言(configuration language)
  puppet的术语
  模块
  是一个完整的功能,包含清单和清单所依赖的文件
  站点清单
  针对一台客户端,它所需要的所有模块
  puppet程序的安装
  客户端
  yum install puppet facter
  服务端
  yum install puppet-server
  puppet命令
  用法格式:puppet <subcommand> [options] <action> [options]
  subcommand
  agent
  apply :在本地运行清单
  ca :管理本地CA
  catalog : 查看catalog文件
  config : 交互完成puppet配置
  describe : 用来显示资源类型的帮助
  获取所支持的所有资源类型
  puppet describe -l
  查看资源的使用帮助
  puppet describe Resource_Type
  定义资源常见语法
  type {"title":
  attribute => value,
  attribute => value,
  }
  注意:type必须小写, tile在同一类型下必须唯一
  puppet资源类型
  group资源类型
  allowdupe : 是否允许使用相同的GID号
  ensure
  present : 建立
  absent : 删除
  gid : 指定GID号
  name : 组名,namevar,不显示定义就使用title
  system : 是否为系统组
  true
  false
  members : 成员
  user资源类型
  comment : 描述信息
  ensure
  present
  absent
  expiry : 过期时间
  gid : 基本组ID
  groups : 附加组
  home : 家目录
  keys : 指明密钥
  name : namevar,不显示定义就使用title
  password : 密码
  salt : 密码的salt
  shell : 默认shell
  uid : UID
  system : 是否为系统用户
  true
  false
  1、puppet添加组及用户的示例:
  group {'hadoop':
  ensure => present,
  gid => 200,
  system => true,
  }
  user {'docker':
  ensure => present,
  uid => 5000,
  system => false,
  groups => hadoop,
  home => "/home/docker",
  password => "zhenping.com",
  salt => 3kkxxkjfk,
  shell => "/bin/bash",
  comment => "docker virtual teach",
  }
  file资源类型
  content : 直接给出文件内容,支持换行符和制表符
  source : 从指定位置下载文件,可以是本地文件路径,也可以是远程服务端的路径
  ensure
  file : 文件
  directory : 目录
  link :连接文件
  present
  absent
  force : 强行运行
  true
  false
  group : 属组
  owner : 属主
  mode : 权限,可以使用ugo=rw或可以使用0664
  replace  :覆盖
  path : 路径
  target : 当ensure为link时,target表示path指向的文件是一个符号连接文件,其目标为些target属性所指向的路径,此时content和source属性自动失效
  2、远程文件复制示例:
  file {"/etc/nfs.conf":
  source => [
  "puppet:///modules/nfs/conf.$host",
  "puppet:///modules/nfs/conf.$operatingsystem",
  "puppet:///modules/nfs/conf"
  ]
  }
  3、向文件中添加文本内容
  file {"/tmp/puppet.txt":
  ensure => file,
  content => "This is a puppet write content .",
  owner => docker,
  group => docker,
  mode => 700,
  replace => true,
  }
  4、创建文件示例
  file {"/tmp/test4.txt":
  ensure => present,
  }
  5、创建目录示例:
  file {"/tmp/test":
  ensure => director,
  }
  6、创建软连接
  file {"/tmp/fstab_test.link":
  ensure => link,
  target => "/etc/fstab",
  }
  将/tmp/fstab_test.link 连接至/etc/fstab
  exec资源类型
  使用特性
  命令本身具有幂等性
  资源有onlyif、unless、creates等属性以实现命令的条件式运行
  资源有refreshonly属性,以实现只有订阅的资源发生变化时才执行
  常用属性
  command : 运行的命令,namevar ,也可以在title上直接定义
  creates : 此属性指定的文件不存在时才执行命令
  cwd : 在此属性指定的路径下运行命令
  environment : 命令运行的环境变量,可以直接定义一个path
  group : 以指定的组运行命令
  user : 以指定的用户身份运行命令
  onlyif : 仅在此命令执行成功(返回状态码为0)时,才运行command指定的命令
  unless : 仅在此命令执行失败(返回状态码非0)时,才运行command指定的命令
  refresh: 默认是执行command中定义的命令,当接受到其它资源发来的Notify时,即会执行refresh后面指定的命令
  refreshonly : 仅在订阅的资源运行成功后,才运行此资源
  true
  false
  returns : 期望的状态返回值,返回非此值时表示命令执行失败
  timeout : 命令执行超时时长
  tries : 尝试执行的次数,默认为1次
  path : 指明命令搜索路径,其功能类似path环境变量,不定义此属性,则必须给定命令的绝对路径
  7、判断ext4模块是否被装载,如果未装载执行装载操作
  exec {"modprobe ext4":
  path => ["/usr/lib64/qt-3.3/bin","/usr/local/sbin","/usr/local/bin","/usr/sbin","/usr/bin:/root/bin"],   #导出PATH环境变量
  unless => "lsmod | grep ext4",  #当此操作发现未找到ext4模块,返回代码非零,才执行装载操作
  }
  8、判断ext4模块是否在,如果存在才被装载
  exec {"modprobe ext4":
  path => ["/usr/lib64/qt-3.3/bin","/usr/local/sbin","/usr/local/bin","/usr/sbin","/usr/bin","/root/bin"],
  onlyif => "modinfo ext4",  #此命令返回状态码为0时,才执行Modprobe的命令
  }
  9 当用户创建成功时,才生成weizi.notify的文件
  group {"weizi":
  ensure => present,
  gid => 10000,
  notify => User["weizi"],
  }
  user {"weizi":
  ensure => present,
  uid => 10000,
  #   notify => Exec["/bin/echo hello > /tmp/weizi.notify"],
  }
  exec {"/bin/echo hello > /tmp/weizi.notify":
  subscribe => User["weizi"],
  refreshonly => true,
  }
  exec {‘/bin/echo hello > /tmp/hello.txt’:
  user => root,
  group => root,
  creates => ‘/tmp/hello.txt’,
  }
  exec {‘/bin/echo hello > /tmp/hello2.txt’:
  user => root,
  group => root,
  unless => ‘/usr/bin/test -e /tmp/hello2.txt’,
  }
  notify资源类型
  显示通知信息
  nofify {"hello world":}
  cron资源类型
  管理计划任务
  常用选项
  command : 要运行的job
  ensure
  present
  absent
  user : 运行任务的用户
  name : 任务计划的名称
  target
  hour : 小时
  minute : 分钟
  month    : 月
  monthday : 每月的第几天
  weekday : 每周几
  environment : 运行时的环境变量
  10、建立系统时间同步任务
  cron {"sync time":
  command => "/usr/sbin/ntpdate 172.16.0.1 &> /dev/null",
  hour => "18",
  minute => "28",
  }
  [root@Centos7 manifests]# crontab -l
  # Puppet Name: sync time
  28 18 * * * /usr/sbin/ntpdate 172.16.0.1
  package资源类型
  管理程序包的安装、卸载、升级等
  常用选项
  ensure
  installed
  present
  absent
  purged
  held
  discription : 描述信息
  configfiles : 配置文件
  keep
  replace
  install_options : 安装选项
  name : 程序包名称
  status : 状态
  source : 程序包的来源,可以本地文件路径或URL
  provider : 使用什么方式安装,如安装rpm命令来安装
  rpm
  vim test7.pp
  package {‘zsh’:
  ensure => latest,
  }
  package {‘jdk’:
  ensure => installed,
  source => ‘/usr/local/src/jdk-8u25-linux-x64.rpm’,
  provider => rpm,
  }
  service资源类型
  实现服务管理
  常用选项
  binary : 二进制程序文件路径
  enable : 是否开机自动启动
  true
  false
  manual
  ensure
  stopped
  running
  hasrestart : 服务脚本是否支持restart参数
  true
  false
  hasstatus : 服务脚本是否支持status参数
  true
  false
  name : 服务的名称,namevar
  path : 服务脚本的搜索路径
  pattern : 用于搜索此服务相关进程的模式,通过匹配进程名称确定服务是否正常运行
  restart : 用于执行重启的命令
  start : 用于执行开始的命令
  status
  stop
  11、安装Nginx软件包,且定义配置文件及服务启动设置
  package {"nginx":
  ensure => latest,
  } ->
  file {"/etc/nginx/nginx.conf":
  source => "/tmp/nginx.conf",
  owner => "nginx",
  group => "nginx",
  notify => Service["nginx"],
  }
  service {"nginx":
  ensure => running,        #定义服务运行状态
  enable => true,    #定义是否开机自启
  hasrestart => true,    #nginx支持restart参数
  hasstatus => true,
  path => "/usr/lib/systemd/system",    #服务脚本搜索路径

  restart => "systemctl>  }
  三种特殊属性之metaparameters
  定义依赖关系
  被依赖的资源中使用before
  依赖其它的资源中使用require
  定义链式依赖->
  定义通知关系
  被依赖的资源中使用notify
  监听其它资源使用notify
  定义链式通知使用->
  资源引用
  Type["tiele"]   : type首字母一定要大写,如User["zhenping"]
  12、定义资源的依赖关系
  group {"linux":
  gid => 2001,
  ensure => present,
  before => User["linux"],
  }
  user {"linux":
  ensure => present,
  uid => 2001,
  gid => 2001,
  shell => "/bin/bash",
  home => "/home/linux",
  system => false,
  password => "zhenping.com”,
  salt => "zhenping",
  require => Group["linux"],
  }
  13、定义通知关系和依赖关系
  package {"nginx":
  ensure => latest,
  allow_virtual => false,
  before => File["/etc/nginx/nginx.conf"],
  }
  file {"/etc/nginx/nginx.conf":
  source => "/tmp/nginx.conf",
  owner => nginx,
  group => nginx,
  require => Package["nginx"],
  notify => Service["nginx"],
  ensure => file,
  }
  service {"nginx":
  ensure => running,
  enable => true,
  hasrestart => true,
  hasstatus => true,

  restart => "systemctl>  path => "/usr/lib/systemd/system",
  require => [Package["nginx"],File["/etc/nginx/nginx.conf"]],
  subscribe => File["/etc/nginx/nginx.conf"],
  }
  14、定义链式依赖关系:
  package {"nginx":
  ensure => latest,
  allow_virtual => false,
  before => File["/etc/nginx/nginx.conf"],
  } ->
  file {"/etc/nginx/nginx.conf":
  source => "/tmp/nginx.conf",
  owner => nginx,
  group => nginx,
  ensure => file,
  } ->
  service {"nginx":
  ensure => running,
  enable => true,
  hasrestart => true,
  hasstatus => true,

  restart => "systemctl>  path => "/usr/lib/systemd/system",
  }
  示例二、
  $webserver = $operatingsystem ? {
  /^(?i-mx:ubuntu|debian)/ => "apache2",
  /^(?i-mx:centos|redhat)/ => "httpd",
  }
  package {$webserver:
  ensure => latest,
  allow_virtual => false,
  }
  file {"/etc/httpd/conf/httpd.conf":
  source => "/tmp/httpd.conf",
  ensure => file,
  }
  service {$webserver:
  ensure => running,
  enable => true,
  restart => "systemctl restart httpd",
  path => "/usr/lib/systemd/system",
  subscribe => File["/etc/httpd/conf/httpd.conf"],
  }
  puppet变量及作用域
  变量
  puppet变量名称必须以$开头,赋值操作符为"=",任何非正则表达式类型的数据均可赋值变量,puppet的每个变量都有两个名字,简短名称和长格式完全限定名称
  作用域
  定义代码的生效范围,以实现代码单隔离
  仅能隔离: 变量,资源的默认属性
  不能隔离: 资源的名称,及引用
  每个变量两种引用路径
  相对路径 :$name
  绝对路径 :$::scope::scope:variable
  变量的赋值符号
  =
  +=
  变量中的种类
  自定义变量
  facter变量 : 可直接引用,可以使用facter -p命令查看
  内置变量
  客户端内置
  $clientcert
  $clientversion
  服务端内置
  $servername
  $serverip
  $serverversion
  $module_name
  变量的使用示例
  $webserver=nginx
  package {$webserver:
  ensure => latest,
  }
  puppet支持的数据类型
  字符型
  可以不用引用,支持单引号(强引用,不做变量替换),双引号(弱引用 )
  布尔型
  其值为true,false
  undef
  未声明的变量,直接定义使用的
  数值型
  整数和浮点数
  数组
  元素可为任意可用数据类型,包括数据和hash,索引从0开始,还可以使用负数,表示方式为`[item1,item2,...]
  hash
  键为字符串,而值可以是任意数据类型,表示方式为{key => value,key => value,...}
  正则表达式
  非标准数据类型,不能赋值给变量,其语法格式表示如下:
  (?<ENABLE-OPTION>:<SUBPATTERN>)
  (?-<ENABLE-OPTION>:<SUBPATTERN>)
  OPTIONS
  i : 忽略字符大小写
  m : 把 . 当换行符
  x : 忽略模式中的空白和注释
  puppet表达式
  比较操作符
  ==
  !=
  <
  <=
  >
  >=
  !~
  =~
  in
  逻辑操作符
  and
  or
  !
  算术操作符
  +
  -
  *
  /
  >> (左移位)
  << (右移位)
  puppet条件判断语句
  if判断语句
  使用格式:
  单分支:
  if CONDITION {
  ....
  }
  双分支:
  if CONDITION {
  ....
  } else {
  ....
  }
  多分支:
  if CONDITION {
  ....
  } elsif CONDITION {
  ....
  } else {
  ....
  }
  配置示例
  if $operatingsystem =~ /^(?i-mx:(redhat|centos))/ {
  package {"nginx":
  ensure => latest,
  allow_virtual => false,
  }
  service {"nginx":
  ensure => running,
  enable => true,
  hasrestart => true,
  hasstatus => true,

  restart => "systemctl>  path => "/usr/lib/systemd/system/",
  }
  }
  if $processorcount >1 {
  notice (“SMP Host.”)
  } else {
  notice (“pool Guy.”)
  }
  if $operatingsystem =~ /^(?i-mx:(redhat|centos|fedora))/ {
  notice("welcom to $1 distribution linux.")
  }
  注意:此处的$1表示后向引用 ,引用括号中匹配到的内容
  case判断语句
  语句格式:
  case CONTROL_EXPRESSION {
  case1, case2: { statement }
  case3, case4: { statement }
  default:      { statement }
  }
  CONTROL_EXPRESSION可以是以下格式:
  1、表达式
  2、变量
  3、函数(有返回值)
  case可以是:
  1、字符串
  2、变量
  3、正则表达式
  4、函数(有返回值)
  5、default
  selector语句
  语句格式:
  CONTROL_VARIABLE ? {
  case1 => value1
  case2 => value2
  ...
  }
  注意:selector不能用于一个已经嵌套于selector的case中,也不能用于一个已经嵌套于case的case语句中
  类似于case,但分支的作用不在于执行代码片段,而是返回一个直接值
  配置示例
  $webserver = $operatingsystem ? {
  /^(?i-mx:ubuntu|debian)/ => "apache2",
  /^(?i-mx:centos|redhat)/ => "httpd",
  }
  puppet类(class)
  用于公共目的的一组资源,是命名的代码块,创建后可在puppet全局进行调用
  类的特性
  类可以被继承
  类的名称只能包含小写字母、数字、下划线且必须以小写字母开头
  每个类都会引入一个新的变量scope,需要访问类的变量时,都得使用完全限定名称
  在本地scope可以重新为top scope中的变量赋予一个新值
  类的声明方式
  定义好的类需要声明后才会被执行
  类的声明方式一

  include>  示例:
  class webserver {
  $webserver = $operatingsystem ? {
  /^(?i-mx:ubuntu|debian)/ => "apache2",
  /^(?i-mx:centos|redhat)/ => "httpd",
  }
  package {$webserver:
  ensure => latest,
  allow_virtual => false,
  }
  file {"/etc/httpd/conf/httpd.conf":
  source => "/tmp/httpd.conf",
  ensure => file,
  }
  service {$webserver:
  ensure => running,
  enable => true,
  restart => "systemctl restart httpd.service",
  path => "/usr/lib/systemd/system/",
  subscribe => File["/etc/httpd/conf/httpd.conf"],
  }
  }
  include webserver  #直接调用webserver类
  类的声明方式二
  class {'base::linux'} : 此声明为一个子类,或者如下申明方式(给类传递参数):
  class {"class_name":
  variable => value,
  }
  示例
  class httpd($webserver='nginx') {   #此处的变量定义为默认值,当未在声明中设定变量值,就使用默认的变量值
  package {$webserver:
  ensure => latest,
  allow_virtual => false,
  }
  file {"/etc/httpd/conf/httpd.conf":
  source => "/tmp/httpd.conf",
  ensure => file,
  }
  service {$webserver:
  ensure => running,
  enable => true,
  subscribe => File["/etc/httpd/conf/httpd.conf"],
  }
  }
  class {"httpd":
  webserver => "httpd", #在类声明的时候,给类传递一个参数
  }
  类的继承
  声明子类时,其基类会被自动首先声明
  基类成为子类的父作用域,基类中的变量和属性默认值会被子类复制一份
  子类可以覆盖父类中同一资源的相同属性的值
  通常将公共功能定义为基类,需要增加的功能定义为子类,其继承一个已有的类,并实现覆盖资源属性,或向资源属性追加额外值
  使用如下定义符:
  => : 定义新的值
  +> : 添加值

  >  service {'apache':
  require => Package['httpd'],
  }
  }

  >  Service['apache'] {
  require +> [ File['httpd.pem'], File['httpd.conf'] ],
  }
  }
  继承类的定义方式
  class base_class {
  ....puppet code....
  }
  class base_class::class_name inherits base_class {
  ....puppet code....
  }
  使用示例
  class nginx {
  package {"nginx":
  ensure => latest,
  allow_virtual => false,
  }
  }
  class nginx::webserver inherits nginx {
  file {"/etc/nginx/nginx.conf":
  source => "/tmp/nginx.conf",
  owner => nginx,
  group => nginx,
  mode => 0644,
  ensure => file,
  require => Package["nginx"],
  }
  service {"nginx":
  ensure => running,
  enable => true,

  restart => "systemctl>  path => "/usr/lib/systemd/system/",
  hasstatus => true,
  hasrestart => false,
  subscribe => File["/etc/nginx/nginx.conf"],
  }
  }
  class nginx::proxy inherits nginx {
  file {"/etc/nginx/nginx.conf":
  source => "/tmp/proxy/nginx.conf",
  owner => nginx,
  group => nginx,
  ensure => file,
  mode => 0644,
  require => Package["nginx"],
  }
  service {"nginx":
  ensure => running,
  enable => true,

  restart => "systemctl>  path => "/usr/lib/systemd/system",
  hasstatus => true,
  hasrestart => false,
  subscribe => File["/etc/nginx/nginx.conf"],
  }
  }
  include nginx::webserver
  puppet模板
  基于ERB(扩展ruby语言)模板语言,在静态文件中使用变量等编程元素生成适用于多种不同环境的文本文件(配置文件),主要用于实现在文本文件中嵌入ruby代码,原来的文件信息不会被改变,但ruby代码会被执行,执行结果将直接替换原来代码
  模板代码的添加方式
  <%= ruby expression %> : 替换为表达式的值
  <% ruby expression %> : 仅执行代码,而不替换
  <%# comment %> : 文本注释
  <%% :做转义,输出为<%
  %%> :做转义,输出为%>
  <%- rubycode %> : 忽略空白字符
  <% rubycode -%> : 忽略空白行
  在模板中可以使用变量,包括puppet的任意可用变量,但变量名需以@字符开头
  模板中的条件判断
  单分支判断语句
  <% if CONDITION -%>
  some text
  <% end %>
  多分支判断语句
  <% if CONDITION -%>
  some text
  <% else %>
  some other text
  <% end %>
  模板中的迭代实现
  模板的中的迭代是为了实现某配置文件中批量添加生成配置信息,如配置nginx中的Location时,当有多个Location段需要添加,可以将location赋值给一个数组,利用迭代将值引用到配置文件中。
  定义格式
  <% @ArrayName.echo do | Variable_name | -%>
  some text with <%= Variable_name %>
  <% end %>
  模板文件的定义示例:
  1、配置模板配置文件
  vim /tmp/nginx.conf
  worker_processes <%= @processorcount %>;  #此处变量为facter中的变量,可以直接引用
  2、puppet脚本配置语言
  vim nginx.pp
  class nginx {
  package {"nginx":
  ensure => latest,
  allow_virtual => false,
  }
  }
  class nginx::webserver inherits nginx {
  file {"/etc/nginx/nginx.conf":
  #如果定义好的配置文件,使用了ERB的配置语法,此处文件复制不能使用source,而是需要使用content参数,利用template函数生成对应的配置文件,此为固定格式用法(将使用template函数生成文本内容,再导入至/etc/nginx/nginx.conf文件中)
  content => template("/tmp/nginx.conf"),
  owner => nginx,
  group => nginx,
  mode => 0644,
  ensure => file,
  require => Package["nginx"],
  }
  service {"nginx":
  ensure => running,
  enable => true,

  restart => "systemctl>  path => "/usr/lib/systemd/system/",
  hasstatus => true,
  hasrestart => false,
  subscribe => File["/etc/nginx/nginx.conf"],
  }
  }
  include nginx::webserver
  puppet模块
  在puppet中,模块本身用一个目录来表示,其需要存放于puppet的modulepath参数所定义的目录中,如/etc/puppet/modules。在manifests/init.pp需定义一个与模块名相同的类名,以完成自包含、自装载、自识别
  模块目录组成格式
  /etc/puppet/modules/ : 模块存放的默认路径,在此目录下建立相应的模块目录即可
  module_name/ : 模块名称
  manifests/ : 资源清单目录
  init.pp : 默认的资源定义文件,此文件必须存在
  files : 静态配置文件存放路径
  templates : ERB模块配置文件存放路径,其文件结束后缀为.erb
  lib : 插件目录
  tests:当前模块的使用帮助文件及示例文件
  spec :  类似于tests目录,存储lib目录下定义的插件的使用帮助和示例文件
  ```
  示例:
  [root@Centos7 manifests]# tree /etc/puppet/modules/
  /etc/puppet/modules/
  `-- nginx
  |-- files
  |   `-- nginx.conf
  |-- lib
  |-- manifests
  |   `-- init.pp
  |-- spec
  |-- templates
  |   `-- nginx.conf.erb
  `-- tests
  [root@Centos7 manifests]# cat init.pp

  >  package {"nginx":
  ensure => latest,
  allow_virtual => false,
  }
  }

  >  file {"/etc/nginx/nginx.conf":
  content => template("nginx/nginx.conf.erb"),  #模板文件定义的路径为“模块名/erb文件”
  owner => nginx,
  group => nginx,
  mode => 0644,
  ensure => file,
  require => Package["nginx"],
  }
  service {"nginx":
  ensure => running,
  enable => true,

  restart => "systemctl>  path => "/usr/lib/systemd/system/",
  hasstatus => true,
  hasrestart => false,
  subscribe => File["/etc/nginx/nginx.conf"],
  }
  }

  >  file {"/etc/nginx/nginx.conf":
  source => "puppet:///modules/nginx/nginx.conf", #配置文件路径路径为"协议:///modules/模块名/静态配置文件"
  owner => nginx,
  group => nginx,
  ensure => file,
  mode => 0644,
  require => Package["nginx"],
  }
  service {"nginx":
  ensure => running,
  enable => true,

  restart => "systemctl>  path => "/usr/lib/systemd/system",
  hasstatus => true,
  hasrestart => false,
  subscribe => File["/etc/nginx/nginx.conf"],
  }
  }
  ```
  模块管理工具
  puppet module 命令
  puppet help module :获取puppet module的帮助信息
  Usage : puppet module <action> [--environment production ] [--modulepath $basemodulepath ]
  <action>
  install : 到puppet forge中心安装模块
  list : 查看已安装的模块
  search : 到forge中心搜索模块
  uninsall : 卸载模块
  upgrade : 更新模块
  puppet Master/Agent模式
  master/agent工作原理
  master/agent强依赖于DNS服务(证书签署是对FQDN做证书颁发的),由master端定义好功能模块,再到/etc/puppet/manifests/定义site.pp文件,定义站点所需要的资源。master端通过自建CA并签发证书给各站点,使用证书验证客户端的身份,当站点发出请求时Master端将查找site.pp文件中定义的资源,编译成catalog,发送给客户端。 agent默认每隔30分钟向Master发送node_name和facts,并请求catalog,在本地执行catalog代码。master与agent二者之间基于https协议通信,其远程过程调用方式为xmlrpc机制。
  master/agent程序安装
  master端
  yum install puppet puppet-server facter (如果master端不需要对自己管理时,可以不需要安装puppet)
  agent端
  yum install puppet facter
  master/agent监听端口
  master : 8140/tcp
  agent : 8139/tcp
  /etc/puppet/puppet.conf配置文件
  [main] : 应用于server端和agent端,都会生效
  [agent] : 应用于agent端生效
  显示或配置参数
  puppet config print : 打印puppet的配置选项(对master/agent都生效)
  puppet config set key=value : 设置puppet的配置选项(对mster/agent都生效)
  注意:此些值的修改是对/etc/puppet/puppet.conf文件生效
  手动生成配置文件
  master端
  puppet master —genconfig > /etc/puppet_default.conf
  mv /etc/puppet/puppet.conf /etc/puppet/puppet.conf.bak
  mv /etc/puppet_default.conf /etc/puppet.conf
  agent端
  puppet agent —genconfig >> /etc/puppet.conf (可以追加,在agent端使用覆盖)
  生成配置文件的注意事项
  1、生成新的配置之前不能删除或移动原有的puppet.conf
  2、生成的配置中,有的参数已经被废弃,与现有puppet版本可能不兼容
  3、有的参数的默认值与现在的版本所支持值可能不相兼容
  4、配置信息可以不使用此工具生成,可以直接在配置文件中添加
  Master/agent服务管理
  master端
  systemctl start puppet-server.service
  agent端
  systemctl start puppet.service
  (puppet cert命令)证书管理工具
  Usage: puppet cert <action> [-h | --help]
  action
  clean node_name : 清除node_name节点的证书
  list : 查看未签署的证书请求
  list -all : 查看所有证书
  sign "node_name" : 对node_name签署证书
  sign -all : 签署所有证书请求
  verify : 检验
  site.pp定义站点调用的模块
  以主机名直接给出其相关定义
  node 'node_name' {
  ....puppet code....
  include nginx::webserver
  }
  把功能相近的主机名给出其相关定义
  node /^web\d+\.magedu\.com/ {
  ....puppet code...
  include nginx::webserver
  }
  节点的继承
  node "basenode" {
  include ntp
  }
  node "web.zhenping.com" inherits basenode {
  include nginx::proxy
  }
  对节点配置分段管理
  /etc/puppet/manifests/
  vim site.pp
  import "webserver/*.pp"
  webservers/
  unicom.pp
  telecom.pp
  cacheservers/
  appservers/
  master/agent配置示例
  1、配置master端
  # puppet master --no-daemonize -v #首次以前台模式启动,确认无误再运行为后端
  # systemctl start puppetserver.service
  # systemctl enable puppetserver.service
  # ss -tnlp : 8140/tcp
  2、定义站点配置文件
  # cd /etc/puppet/manifests/
  # vim site.pp  #必须先为站点定义好站点文件,不然agent端启动时会报错
  node /^centos7.pc\d+/ {
  include nginx::webserver
  }
  3、配置agent端(发送证书签署请求给Master)
  # puppet agent --server=master_hostname --no-daemonize --noop --test -v #建议首次启动时以前台模式运行,确认OK后,再将运行为后端
  4、在master端为客户端签署证书
  # puppet cert list #首先查看未签署的证书列表
  # puppet cert sign node_name
  或者
  # puppet cert sing -all
  5、以守护进程方式启动agent
  # systemctl start puppet
  ####必要是清除客户端请求
  #puppet cert list -all : 查看已经签署的客户端证书
  # puppet cert clean node_name : 清除一个Node的签署证书
  # rm -rf /var/lib/puppet/ssl : 移除agent端的ssl证书
  master/agent的多环境支持
  puppet的多环境支持:
  master端环境配置段:为不同的主机配置不同的配置
  [master]
  enviroment = production, testing, development   #声明master支持那些环境配置
  [production](生产环境)
  manifest = /etc/puppet/environments/production/manifests/site.pp
  modulepath = /etc/puppet/enviroments/production/modules/
  fileserverconfig = /etc/puppet/fileserver.conf
  [testing]
  manifest = /etc/puppet/environments/testing/manifests/site.pp
  modulepath = /etc/puppet/enviroments/testing/modules/
  fileserverconfig = /etc/puppet/fileserver.conf
  [development]
  manifest = /etc/puppet/environments/development/manifests/site.pp
  modulepath = /etc/puppet/enviroments/development/modules/
  fileserverconfig = /etc/puppet/fileserver.conf
  agent端配置文件:
  [agent]
  enviroment = testing

运维网声明 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-544970-1-1.html 上篇帖子: RHEL6.5配置安装puppet-server和puppet(二) 下篇帖子: puppet安装部署,实例JDK和tomcat-12020680
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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