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

[经验分享] 自动化运维工具Puppet(一)

[复制链接]

尚未签到

发表于 2018-8-2 08:56:43 | 显示全部楼层 |阅读模式
  一、Puppet简介
  1、Puppet是什么?
  “Puppet”这个词实际上包括了两层含义:它既代表编写这种代码的语言,也代表对基础设施进行管理的平台。
  2、Puppet语言
  Puppet是一种简单的建模语言,使用它编写的代码能够对基础设施的管理实现自动化。Puppet允许对整个系统(我们称之为节点)所希望达到的最终状态进行简单地描述。这与过程式的脚本有明显的不同:编写过程式的脚本需要你清楚地知道如何将某个特定的系统转变至某种特定的状态,并且正确地编写所有这些步骤。而使用Puppet时,你不需要了解或指定达到最终状态的步骤,你也无需担心因为错误的步骤顺序,或是细微的脚本错误而造成错误的结果。
  与过程式的脚本的另一点不同在于,Puppet的语言能够跨平台运行。Puppet将状态进行了抽象,而不依赖于具体实现,因此你就可以专注在你所关心的那一部分系统,而将实现的细节,例如命令的名称、参数及文件格式等等交给Puppet自己负责。举例来说,你可以通过Puppet对所有的用户以相同的方式进行管理,无论该用户是用NetInfo或是/etc/passwd方式进行存储的。
  这种抽象的概念正是Puppet功能的关键所在,它允许使用者自由选择最适合他本人的代码对系统进行管理。这意味着团队之间能够更好地进行协作,团队成员也能够对他们所不了解的资源进行管理,这种方式促进了团队共同承担责任的意识。
  Puppet这门建模语言的另一个优势在于:它是可重复的。通常来说,要继续执行脚本文件,必须对系统进行变更。但Puppet可以被不断地重复执行,如果系统已经达到了目标状态,Puppet就会确保停留在该状态上。
  3、资源
  Puppet语言的基础在于对资源的声明。每个资源都定义了系统的一个组件,例如某个必须运行的服务,或是某个必须被安装的包。以下是一些其它类型资源的示例:

  •   某个用户帐号
  •   某个特定的文件
  •   某个文件夹
  •   某个软件包
  •   某个运行中的服务
  可以将资源想象为构建块,他们将结合在一起,对你所管理的系统的目标状态进行建模。 接下来,我们将接触到Puppet中更深入核心的定义,这些定义允许你以一种经济的方式将资源进行结合,而经济正是Puppet的关键特色之一。
  4、类型与提供者
  Puppet将类似的资源以类型的方式进行组织。举例来说,用户是一种类型,文件是另一种类型,而服务又是一种类型。当你正确地对某个资源的类型进行描述之后,接下来只需描述该资源所期望的状态即可。比起传统的写法:“运行这个命令,以启动XYZ服务”,你只需简单地表示:“保证XYZ处于运行状态”就可以了。
  提供者则在一种特定的系统中,使用该系统本身的工具实现各种资源类型。由于类型与提供者的定义被区分开来,因此某个单一的资源类型(例如“包”)就能够管理多种不同的系统中所定义的包。举例来说,你的“包”资源能够管理Red Hat系统下的yum、基于Debian的系统下的dpkg和apt,以及BSD系统中的端口。
  管理员通常来说不大有机会对提供者进行定义,除非管理员打算改变系统的默认值。Puppet中已经精确的写入了提供者,因此你无需了解如何对运行在基础设施中的各种操作系统或平台进行管理。再次声明,由于Puppet将细节进行了抽象,因此你无需担心各种细节问题。如果你确实需要编写提供者,那也通常能够找到一些简单的Ruby代码,其中封装了各种shell命令,因此通常非常简短,同时也便于创建。
  类型和提供者使得Puppet能够运行在各种主流平台上,并且允许Puppet不断成长与进化,以支持运算服务器之外的各种平台,例如网络与存储设备。
  下面的一个示例将为你展现Puppet语言的便捷性,它首先演示了如何用shell脚本添加一个新用户以及一个新的组,这与Puppet中始终一致的操作形成鲜明对比。而在使用Puppet的示例中,“用户”和“组”都是类型,Puppet能够自动找到适用于你的平台的提供者。相比之下,特定于平台的过程式脚本无论是编写还是理解都要困难得多。
  5、类、清单与模块
  Puppet语言中的其它元素的主要作用是为资源的声明提供更多的灵活性和便捷性。类在Puppet中的作用是切分代码块,将资源组织成较大的配置单元。举例来说,一个类能够包括所有安装和配置NTP时必须的Puppet代码。类的创建与调用可以在不同的地方完成。
  不同的类集合可以应用在扮演不同角色的节点上。我们将其称之为“节点分类”,这是一项非常强大的能力,它允许你根据节点的能力,而不是根据节点的名称对他们进行管理。这种“别把家畜当宠物”的机器管理方式,得到了许多快速发展的组织的偏爱。
  Puppet语言文件被称为清单,最简单的Puppet部署方式就是一个单独的清单文件加上一些资源。如果我们为以上示例中的基础Puppet代码命名为“user-present.pp”文件,那它就成为了一个清单。
  模块是一系列类、资源类型、文件和模板的结合,他们以一某个特定的目的,并按照某种特定的、可预测的结构组织在一起。模块可以为了各种目的而创建,可以是对Apache实例进行完整的配置以搭建一套Rails应用程序,也可以为各种其它目的进行创建。通过将各种复杂特性的实现封装在模块中,管理员就能够使用更小、可读性更好的清单文件对模块进行调用。
  Puppet模块的一个巨大优势在于模块的重用性。你可以自由使用他人编写的模块,并且Puppet有一个参与者数量巨大的活跃社区,除了Puppet Labs的员工所提编写的模块之外,社区成员们也会免费地分享他们所编写的模块。你能够在Puppet Forge上找到超过3000个可以免费下载的模块,其中有许多模块是系统管理员的工作中最常见的一些任务,因此这些模块能够节约你大量的时间。比方说,你可以使用模块进行各种管理任务,包括简单的服务器构建块(NTP、SSH)管理,乃至复杂方案(SQL Server或F5)的管理。
  类、清单和模块都是纯粹的代码,与组织中所需要的其它任何在代码一样,它们能够、也应该被签入到版本控制系统当中,稍后我们将对这一点展开讨论。
  6、Puppet平台
  完整的Puppet解决方案不仅仅是指这门语言。使用者需要在不同的基础设施中部署Puppet代码、时不时地对代码及配置进行更新、纠正不恰当的变更、并且时时对系统进行检查,以保证每个环节的正常运行。为了满足这些需求,大多数使用者会在某个主机-代理结构中运行Puppet解决方案,由一系列组件所组成。根据不同的需求,使用者可以选择运行一个或多个主机。每个节点上都会安装一个代理,通过一个经过签名的安全连接与主机进行通信。
  采取主机-代理这一结构的目的是为了将Puppet代码部署在节点上,并长期维护这些节点的配置信息。在对节点进行配置之前,Puppet会将清单编译为一个目录(catalog),目录是一种静态文档,在其中对系统资源及资源间的关系进行定义。根据节点的工作任务,以及任务的上下文不同,每个目录将对应一个单独的节点。目录定义了节点将如何工作,Puppet将根据目录的内容对节点进行检查,判断该节点的配置是否正确,并且在需要时应用新的配置。
  在常规Puppet运行期间,每个基于节点的代理会定期与某个主机进行检查工作,Puppet会根据不同结果进行以下各种操作:

  •   对于产生了偏差的配置进行纠正
  •   仅报告节点的状态,而不进行任何改动
  •   使用Puppet的操作工具进行必需的配置改动
  •   收集节点与事件的相关数据,并加以保存,以便重试
  Puppet Lab还提供了一个商用版本的解决方案,名为Puppet Enterprise,其中包括了客户支持服务,并提供了一系列高级且重要的功能:

  •   节点管理高级功能
  •   基于角色的访问控制
  •   运维性指标,以及一个报表控制台
  二、Puppet常用术语
  1、 manifest(清单)
  puppet的程序文件称作“manifest(清单)”,以.pp作为文件名后缀;
  如前所述,puppet语言的核心是“资源定义”,而定义一个资源的核心就在于描述其目标状态,而nanifest文件就是用来定义resource资源的
  “puppet apply”子命令能够将一个manifest中描述的目标状态强制实现,因此它通常以manifest文件作为参数
  2、catalog(伪代码)
  puppet通过manifest同步资源时,不会直接应用manifest文件,而是要经过预先的编译过程,这是因为manifest文件中可能会包含条件判断、变量、函数以及其他的程序逻辑,实际执行中,有可能会基于层次及包含关系存在多个manifest文件,这些文件会被编译仅同一个称作“catalog”的文件,编译完成后的catalog文件仅包含各个资源以及它们同步时的次序;
  3、resource (资源)
  如果把OS的所有配置,如用户账户、特定的文件、文件所属的目录、运行的服务、程序包以及cron任务等,看作是许多独立原子单元的集合的化,这些所谓的“单元”就是“资源”;不过这些资源在其大小、复杂程度以及生命周期的跨度上等多个维度上可能会各不相同
  通常来说,类属于同一种资源的属性是相近的,如文件都有其属主和属组,而用户帐号则由用户名、UID、GID等组成;不过即便是同一种资源,其在不同OS 上的实现方式却又可能各不相同,例如在windows上和linux上启动和停止服务的方式相去甚远,,因此puppet必须对资源进行某种程度的抽象;
  资源抽象:puppet在以下三个维度来对资源完成抽象

  •   相似的资源被抽象成同一种资源“类型”,如程序包资源、用户资源及服务资源等;
  •   将资源属性或状态的描述与其实现方式玻璃开来,如仅说明安装一个程序包而不用关心其具体是通过yum、pkgadd、prots或是其他方式实现;
  •   仅描述资源的目标状态,也即期望其实现的结果,而不是其具体过程,如“确定nginx运行起来”而不是具体描述为“运行nginx命令将其启动起来”;
  这三个也被称作puppet的资源抽象层(RAL),RAL由type(类型)和provider(提供者,即不同OS上特定实现)组成。
  4、resource declaration (资源申报)
  在为puppet定义一个资源时,需要为其指定所述的类型和资源标题,并同时配置一系列的属性和对应的值。puppet通过特有的语言来描述和管理资源
  这种语法被成为“资源申报(resource declaration)”,它是puppet语言的核心组成部分,在定义中,仅描述了资源的目标状态而没有提到为达到目标所需要采取的任何步骤
     type { 'title':  
         attribute => value,
  
      }
  puppet有许多内置的资源类型,而通过安装插件还可以继续新增额外的类型 ,可以通过官网参考页面http://docs.puppetlabs.com/references/latest.html获取详情,也可以使用“puppet describe”命令来获取puppet当前所能支持的类型列表及每种类型的详细信息;
  三、Puppet资源应用举例
  1、安装Puppet
  这里是下载官网的rpm包安装的,版本2.7,下载地址:https://yum.puppetlabs.com/el/6.5/products/x86_64/。下面就是使用puppet的单机安装用来测试学习。
[root@example.com ~]# ls  
facter-1.7.6-1.el6.x86_64.rpm
  
puppet-2.7.26-1.el6.noarch.rpm
  
[root@example.com ~]# yum localinstall -y *.rpm
  注意:在安装facter时一定要和Puppet的版本匹配,同时在安装时会解决Puppet的依赖关系会安装ruby,此包也要和Puppet的版本相匹配。
  2、图解核心资源
DSC0000.jpg

  3、puppet资源解构
  在为puppet定义一个资源时,需要为其指定所属的类型和资源标题,并同时配置一系列的属性和对应的值。puppet通过其特有的语言来描述和管理资源,如下面所示的资源定义。
    user { 'example':  
      ensure     => present,
  
      uid        => '601',
  
      gid        => '601',
  
      shell      => '/bin/bash',
  
      home       => '/home/magedu',
  
      managehome => true,
  
    }
  这种语法被称作“资源申报(resource declaration)”,它是puppet语言的核心组成部分。上述的定义中,仅描述了资源的目标状态而没有提到为达成目标所需要采取的任何步骤。而资源定义的核心也可以抽象为type、title、attribute和value四个部分。
  puppet有许多内置的资源类型,而通过安装插件还可以继续新增额外的类型。可以通过puppet官方的类型参考页面(http://docs.puppetlabs.com/references/latest/type.html)获取详细的信息。也可以使用“puppet describe”命令来获取puppet当前所支持的类型列表及每种类型的详细信息,下面给出了一个简要的使用说明。

  •   puppet describe -l:例如puppet支持的所有资源类型及其描述信息;
  •   puppet describe -s <TYPE>:列出指定资源的简要说明;
  •   puppet describe <TYPE>:显示指定资源的详细说明;
  4、定义资源
  如前所述,资源是puppet用于模型化系统配置的基础单元,每个资源都都从某个角度描述了系统属性,如某程序包必须安装或某用户必须移除等。在puppet,用于完成此类功能的代码也即“资源申报”。
    type {'title':  
      attribute => value,
  
    }
  在定义时,资源类型必须使用小写字符;而资源名称仅是一个字符串,但要求在同一个类型中其必须惟一,这意味着,可以同时有名为nginx的“service”资源和“package”资源,但在“package”类型的资源中只能有一个名为“nginx”。
  Puppet的资源常的丰富, 常资源即核资源, 包括notify、 file、 package、 service、 exec、 cron、 user和group。
  注意在定义使用资源时要注意:

  •   资源类型必须是小写字符。
  •   资源名称仅是一个字符串,但要求在同一资源类型中名称必须是唯一。
  •   “puppet resources”命令可以用于交互式查找及修改puppet资源。
  5、package 资源
  package资源管理系统的软件包安装,支持使用的软件包管理器:yum,rpm,apt,ports,gem,msi,dpkg,pkg.....
  常用属性:

  •   ensure:程序包的目标状态,其中installed 表示要安装该软件,也可以写成present; absent 表示反安装该软件,pureged 表示干净的移除该软件,latest 表示安装软件包的最新版本;
  •   name:资源的名称,即软件包的名称;
  •   provider:软件包管理器;
  •   source:指定程序包文件路径;
  •   install_option:安装选项,最常用的是通过IINSTALLDIR来指定安装目录,通常使用在windows上;
  练习:
  安装nginx:
[root@example.com tmp]# rpm -q nginx  
package nginx is not installed
  
[root@example.com tmp]# cat test1.pp
  
package {'nginx':
  
ensure  => present,
  
name=> nginx,
  
}
  
[root@example.com tmp]# puppet apply test1.pp
  
notice: /Stage[main]//Package[nginx]/ensure: created
  
notice: Finished catalog run in 25.36 seconds
  
[root@example.com tmp]# rpm -q nginx
  
nginx-1.0.15-12.el6.x86_64
  卸载nginx:
[root@example.com tmp]# vim test1.pp  
package {'nginx':
  
ensure  => absent,
  
name=> nginx,
  
}
  
[root@example.com tmp]# puppet apply test1.pp
  
notice: /Stage[main]//Package[nginx]/ensure: removed
  
notice: Finished catalog run in 0.42 seconds
  
[root@example.com tmp]# rpm -q nginx
  
package nginx is not installed
  6、service资源
  顾名思义, service资源主要于服务的管理, 在Redhat和Debian系列及相应的衍操作系统 中, Puppet默认采/etc/init.d/下的脚本进服务的管理, 如果是定义的脚本, 只需要加该录, 并且在脚本中定义chkconfig即可。 可监控的状态有启动( start) 、 停( stop) 、 状态( status) 、 重启 ( restart) 、 定义等多元化。 在Puppet 2.7以上的版本中Puppet都希望通过init脚本来管理, 如果没有 init脚本, 这个时候需要设置hasstatus为false, 并指定个定义状态属性的命令。 通常service资源会在其他资源变动时触发重启, 默认会使初始化脚本的restart命令, 当然我们也 可以明确指定其他的命令。
  常用属性:

  •   ensure: 服务的目标状态,true和false;
  •   enable: 是否开机自动启动,true和false;
  •   name: 服务名称;
  •   path: 服务脚本路径;
  •   start: 启动命令 ,此四项主要用于一些通过命令来启动的服务;
  •   stop: 停止命令;
  •   restart: 重启命令;
  •   status:状态信息获取命令;
  举例:
  安装nginx并设置其为开机自动启动。
[root@example.com tmp]# vim test2.pp  
package {'nginx':
  
        ensure  => present,
  
        name    => nginx,
  
}
  
service {'nginx':
  
        ensure  => true,
  
        name    => nginx,
  
        enable  => true,
  
}
  
[root@example.com tmp]# rpm -q nginx
  
package nginx is not installed
  
[root@example.com tmp]# ss -tnl |grep 80   //必须保证80端口没被占用
  
[root@example.com tmp]# puppet apply test2.pp
  
notice: /Stage[main]//Package[nginx]/ensure: created
  
notice: /Stage[main]//Service[nginx]/ensure: ensure changed 'stopped' to 'running'
  
notice: Finished catalog run in 13.13 seconds
  
[root@example.com tmp]# ss -tnl |grep 80
  
LISTEN     0      128                       *:80                       *:*
  
[root@example.com tmp]# chkconfig --list nginx
  
nginx          0:关闭1:关闭2:启用3:启用4:启用5:启用6:关闭
  7、file资源
  file资源在puppet里面用的挺多,功能有管理文件、目录、软链接;生成文件内容;管理文件权限属性;也可以通过source属性到指定位置下载文件;通过recurse属性来获取目录。
  常用属性:

  •   ensure:目标状态,present, absent, file, directory
  •   backup: 通过filebucket资源来备份文件;值通常为filebucket资源的名称;
  •   content: 文件内容;生成方式有三种(content, source, target),三种彼此互斥;
  •   source: 通过指定的url下载文件至本地;获取方式通常为puppet url, 格式:puppet:///modules/MODULE_NAME/file_names;
  •   target: 为符号链接指定目标;
  •   links: 文件为符号链接;{follow|manage}
  •   path: 文件路径,必须使用双引号;
  •   mode: 定义权限;
  •   owner: 属主
  •   group: 属组
  •   force: 强制执行删除文件、链接或目录;仅用于ensure为absent时;
  •   purge: 清空指定目录中存在的,但未在资源中定义的文件;
  •   recurse: 目录递归,值true, false, inf, remote
  •   replace: 替换;本地存在的文件与资源中指定的文件内容不同时是否执行替换,默认为否。
  •   mtime:时间戳。
  举例:
[root@example.com tmp]# vim test3.pp  
file {'bols.txt':
  
        ensure  => present,
  
        content => 'bols.',
  
        path    => "/tmp/bols.txt",
  
}
  
file {'issua.symbolic':
  
        ensure  => present,
  
        target  => "/etc/issue",
  
        path    => "/tmp/issue.symoblic",
  
        links   => follow,
  
}
  
[root@example.com tmp]# ls
  
mysql.sock  test1.pp  test2.pp  test3.pp
  
[root@example.com tmp]# puppet apply test3.pp
  
notice: /Stage[main]//File[issua.symbolic]/target: target changed 'notlink' to '/etc/issue'
  
notice: Finished catalog run in 0.03 seconds
  
[root@example.com tmp]# ll
  
总用量 16
  
-rw-r--r-- 1 root  root    5 9月  22 22:54 bols.txt
  
lrwxrwxrwx 1 root  root   10 9月  22 22:56 issue.symoblic -> /etc/issue
  
srwxrwxrwx 1 mysql mysql   0 8月  29 11:10 mysql.sock
  
-rw-r--r-- 1 root  root   56 9月  22 22:11 test1.pp
  
-rw-r--r-- 1 root  root  128 9月  22 22:31 test2.pp
  
-rw-r--r-- 1 root  root  211 9月  22 22:56 test3.pp
  
[root@example.com tmp]# cat issue.symoblic
  
CentOS release 6.6 (Final)
  
Kernel \r on an \m
  8、exec资源
  执外部命令, 通常建议少使或者尽量避免使exec资源, Puppetlabs也不建议使。 创建exec 资源是为了完成些Puppet法完成的事。 尽量少使exec资源, 同时在使exec资源时尽量使refreshonly和creates属性, 少onlyif和 unless属性。 即使要使exec资源也要简单的命令, 因为每次Puppet执时所编译的Catalog中的命令都会执, 这样会带来量的系统开销与不必要的资源浪费。
  常用属性:

  •   command: 要执行的命令,通常为命令文件的完整路径;
  •   path: 命令搜索路径;
  •   group:  属组
  •   user: 属主
  •   onlyif: 0,表示仅在命令的状态返回值为0时才执行此命令;
  •   refresh: 接收到其它资源的通知时,重新执行此命令;
  •   refreshonly: 仅当被依赖的资源发生改变时才被触发;
  •   tries: 尝试的次数,默认为1;
  •   try_sleep:多次尝试之间的时间间隔;
  举例:
[root@example.com tmp]# vim test4.pp  
exec {'echo command':
  
        command  => 'mktemp /tmp/tmp.XXXXX',
  
        path     => '/bin:/sbin:/usr/sbin:/use/bin',
  
}
  
[root@example.com tmp]# ls
  
bols.txt        mysql.sock  test2.pp  test4.pp
  
issue.symoblic  test1.pp    test3.pp
  
[root@example.com tmp]# puppet apply test4.pp
  
notice: /Stage[main]//Exec[echo command]/returns: executed successfully
  
notice: Finished catalog run in 0.09 seconds
  
[root@example.com tmp]# ls
  
bols.txt        mysql.sock  test2.pp  test4.pp
  
issue.symoblic  test1.pp    test3.pp  tmp.UhGyy
  9、资源的依赖
  Puppet把系统的实体( 件、 服务等) 称为资源, 系统的实体之间必定存在着相互依赖的关系。  如SSH的启动依赖于sshd软件包的安装与sshd_conf配置件的定义等。 Puppet提供11个元参数来处理资源关系, 其中处理资源之间的依赖关系的元参数为如两个:

  •   require: 引个或多个依赖的对象, 保证该资源在被依赖的对象执成功之后被应, 即 require引的对象执之后该资源才被应。
  •   before: 与require相反, 引个或多个依赖的对象, 保证该资源在被依赖的对象执之前被应, 即本资源执成功后, before引的对象才被应。
  元参数require与before不具备触发功能, 只是表依赖关系, 那么当件"sshd_config"更新后又如 何通知sshd服务进重启呢? 这个时候需要利Puppet的另外两个元参数notify与subscribe进触发更新动作。

  •   subscribe: 类似require, 引个或多个依赖的对象, 当引的对象资源发改变时, 执相应的动作。
  •   notify: 类似before, 引个或多个依赖的对象, 当该资源对象发改变时, 通知某个资源进更新。
  应用举例:

  •   require:
                package {'nginx':  
                    ensure  =>  present,
  
                }
  
                service {'nginx':
  
                    ensure  => true,
  
                    enable  => true,
  
                    require => Package['nginx'],
  
                }

  •   before :
                package {'nginx':  
                    ensure  =>  present,
  
                    before  =>  Service['nginx'],
  
                }
  
                service {'nginx':
  
                    ensure  => true,
  
                    enable  => true,
  
                }

  •   notify和subscribe:
                package {'nginx':  
                    ensure  =>  present,
  
                } ->
  
                service {'nginx':
  
                    ensure  => true,
  
                    enable  => true,
  
                    restart => '/etc/rc.d/init.d/nginx reload'
  
                }
  实际使用:
[root@example.com tmp]# vim test5.pp  
file {'/tmp/bols.txt':
  
        ensure   => file,
  
        content  => "hello puppet!\n",
  
        notify   => Exec['monitor'],
  
}
  
exec {'monitor':
  
        command  => 'echo -e "/tmp/bols.txt changed!" >> /tmp/monitor.txt',
  
        refreshonly=> true,
  
        subscribe=> File['/tmp/bols.txt'],
  
        path     => '/bin:/sbin:/usr/bin:usr/sbin',
  
}
  
[root@example.com tmp]# puppet apply test5.pp
  
notice: /Stage[main]//File[/tmp/bols.txt]/ensure: defined content as '{md5}3b86c21199bbebc245d75814526575bf'
  
notice: /Stage[main]//Exec[monitor]: Triggered 'refresh' from 2 events
  
notice: Finished catalog run in 0.11 seconds
  
[root@example.com tmp]# cat bols.txt
  
hello puppet!
  
[root@example.com tmp]# cat monitor.txt
  
/tmp/bols.txt changed!
  
[root@example.com tmp]# puppet apply test5.pp
  
notice: Finished catalog run in 0.02 seconds
  
[root@example.com tmp]# cat bols.txt
  
hello puppet!
  
[root@example.com tmp]# cat monitor.txt
  
/tmp/bols.txt changed!
  
[root@example.com tmp]# !vim
  
vim test5.pp
  实际应用中各资源间是有次序关系的,即在安装使用nginx时,首先是安装,然后是根据应用场景不同给nginx提供配置文件,最后再试载入配置文件并启动,前面我们可以使用require、before、subscribe和notify来定义资源间的次序关系,同时也可以使用->或者~>来指定次序关系,而“->”用于定义次序链子,“~>“用来定义通知链。实际使用中此两者还可以用在资源申报。
  举例:Package['nginx'] -> File[''/etc/nginx/nginx.conf] ~> Service['nginx']
  上面的等同与:
            package{'nginx': } ->  
            file {'/etc/nginx/nginx.conf':} ~>
  
            service {'nginx':}
  10、group资源
  常用属性:

  •   ensure: 默认属性, 创建present、 删除absent。
  •   name: 组名
  •   gid: GID ,如果不指定系统动匹配的gid将于500。
  •   system: 多数系统平台创建的是uid为0~500的系统户, 默认为false。
  11、user资源
  常用属性:

  •   ensure: 默认属性, 指定户是否存在, 创建户使present、 删除户使absent。
  •   name:  用户名
  •   uid: 如果不指定则会动选择, 进会导致同户在不同系统上使不同uid的情况, 建议 统指定。 在Windows上只能返回户安全标识符SID。
  •   system: 默认为false, 多数系统平台创建uid于或等于的系统户。
  •   home: 户的家录。
  •   shell: 登录时指定Shell。 Shell是必须存在且可执的, 不持Windows。
  •   gid:  该户的户组gid, 可以是数字或组名字。
  •   password: 多数系统平台采SHA1哈希算法成。 Mac与Windows有所差异。
  使用举例:
[root@example.com ~]# openssl passwd -1 -salt `openssl rand -hex 4`  
Password:
  
$1$eae90963$Rv3PQVNDGi0Mmk92xI9fp.
  
[root@example.com tmp]# vim test6.pp
  
group {'testgrp':
  
        ensure   => present,
  
        gid      => 10001,
  
}
  
user {'testuser':
  
        name     => test,
  
        ensure   => present,
  
        gid      => 10001,
  
        uid      => 10001,
  
        home     => '/home/test',
  
        shell    => '/bin/tcsh',
  
        password => '$1$eae90963$Rv3PQVNDGi0Mmk92xI9fp.',
  
}
  
[root@example.com tmp]# puppet apply test6.pp
  
notice: /Stage[main]//Group[testgrp]/ensure: created
  
notice: /Stage[main]//User[testuser]/ensure: created
  
notice: Finished catalog run in 0.48 seconds
  
[root@example.com tmp]# tail -1 /etc/passwd
  
test:x:10001:10001::/home/test:/bin/tcsh
  
[root@example.com tmp]# tail -1 /etc/shadow
  
test:$1$eae90963$Rv3PQVNDGi0Mmk92xI9fp.:16700:0:99999:7:::
  
[root@example.com tmp]# tail -1 /etc/group
  
testgrp:x:10001:
  
[root@example.com tmp]# vim test6.pp
  
[root@example.com tmp]# ls /home/
  
cangls  longls  lost+found  test
  12、cron资源
  定时脚本于安装和管理系统cron作业。 每个cron的资源要有命令和少个周期的属性( hour 时, minute分钟, month, monthday的1天, special特殊) 。 定义脚本的这些属性都由Puppet存储与检索。
  Puppet会将任务写/var/spool/cron录中与户对应的件中, /etc/crontab中原有的任务不会 变。 如果Puppet指定的任务与现有任务完全致, Puppet不会对它有任何修改。 建议cron完全由Puppet来管理, 不然可能会出现些难以预料的情况, 其中特别要注意的是会出现定义了不同的任务任务 的完全致的情况。
  常用属性:

  •   ensure: 基本属性, 可配置为present或absent。
  •   command: 需要执的命令, 通常使双引号引起来。
  •   environment: 运的环境变量配置, 例如PATH=/bin: /usr/bin: /usr/sbin。
  •   hour :时, 可选, 必须是0~23。
  •   minute :分钟, 可选, 必须是0~59。
  •   month :, 可选, 必须是1~12。
  •   monthday :中的天, 必须是1~31。
  •   weekday :周中的天, 可选, 必须是0~7。
  •   name :名称, 仅于参考。
  •   user:指定运的户, 默认为root。
  举例:
cron {'ntpdate':  
                    ensure  => present,
  
                    command => '/usr/sbin/ntpdate 202.120.2.101 &> /dev/null',
  
                    miniute => '*/3',
  
                }
  13、调试与输出
  Puppet在编译时输出notify定义的信息, 提管理员正在执的动作。
  notify资源可使的参数有:

  •   message: 将信息发送到log。
  •   name: 信息的名称。
  •   withpath: 显完整的对象路径, 默认为false。

运维网声明 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-545091-1-1.html 上篇帖子: 使用docker部署一个直接可用的puppet服务端 下篇帖子: 自动化运维工具puppet(二)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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