puppet语法-type

Table of Contents

  1. [Custom Source](#Custom Source)
  2. 基本技能要求
  3. Types简介
  4. Type-Documentation
  5. Type-Properties
  6. Type-Parameters
  7. [Automatic Relationships](#Automatic Relationships)
  8. [Agent-side Pre-Run Resource](#Agent-side Pre-Run Resource)

Custom Source

Custom Source可以理解为自定义的资源类型,必须使用ruby语言进行书写,Custom Source主要包含两个模块:type和provider。

type和provider是需要配合使用的,type定义了能做什么,provider定义了怎么做,type和provider是相互依赖的关系。

注:学习开发type和provider最好的方法是阅读现有的type和provider,最好是puppet核心代码块。

假如你是初次接触type和provider的开发,建议阅读和参考Package和User资源,而不要使用File资源。

基本技能

阅读本文之前你应该掌握的基本技能:

  • 有一定Linux运维经验,熟悉Linux常用命令行
  • 对ruby的语法有一定了解
  • 有使用puppet部署集群的经验

types简介

当创建一个type资源时候,应该关注于这个资源能做什么,而不是如何去做

通常创建type是通过调用Puppet::Type的newtype方法,示例如下:

  1. # lib/puppet/type/database.rb
  2. Puppet::Type.newtype(:database) do
  3. @doc = "Create a new database."
  4. # ... the code ...
  5. end

或者开头使用module Puppet

  1. # lib/puppet/type/package.rb
  2. module Puppet
  3. Type.newtype(:package) do
  4. @doc = "Manage a Package."
  5. # ... the code ...
  6. end
  • 创建一个新的type只需调用newtype方法即可
  • type的名字必须遵从于ruby语法,并且要和文件名称相同
  • 调用newtype方法时后面需要接代码块,可以通过do ... end或者( { ... } )包含代码块里的所有propertys和providers。

notice: 当创建type时,可以在名字后面指定参数,并且只有一个参数是可用的:

:self_refresh => true --- 会造成这个资源类型的刷新(类似于这个资源类型通过nogify/subscribe等关联资源方法收到了刷新的指令),这个最常用的是用在mount类型上

Type-Documentation

在代码块里创建property和provider之前,通常会对这个资源类型有一个说明,通过@doc方法。字符串使用markdown格式,示例如下:

  1. Puppet::Type.newtype(:database) do
  2. @doc = %q{Creates a new database. Depending
  3. on the provider, this may create relational
  4. databases or NoSQL document stores.
  5. Example:
  6. database {'mydatabase':
  7. ensure => present,
  8. owner => root
  9. }
  10. }
  11. end

Type-Properties

前面我们说道一个新的type名称后面是代码块,一个代码块里的主要内容就是properties和parameters,它们都能生成资源的属性。

Properties和Parameters又是怎样的区别呢?它们的区别很微妙而且很重要

  • Properties会直接管理目标系统里这个属性的参数,例如一个用户的UID或者GID,因为GID和UID是可能会被更改,所以要使用Properties去定义。
  • Parameters指定puppet如何管理这个资源,而不是设置特定属性,例如user类型的managehome属性就要使用Parameter定义,这个属性会影响puppet做什么。

那么property是怎么工作的呢?

假如你定义了一个owner的property,首先property会调用provider的方法去检测并获取当前owner的状态,当当前资源状态与我们设置的不一致时,property或调用类似于owner=methon的方法将资源状态改变为我们所期望的。

ensurable

通常我们定义property是通过"def xxx { ... }"方式定义的,但是有一个特殊的property,因为是比较常用的,所以有了简化的写法,那就是ensure property。它可以简单定义为ensurable,示例如下:

  1. Puppet::Type.newtype(:database) do
  2. ensurable
  3. ...
  4. end

这个property会调用provider的三个方法:create, destroy, and exists? . 顾名思义,create就是创建(更改)当前的资源状态,destory就是删除当前资源,exists?是检测当前资源是否存在。如果ensure属性定义为“不要求同步”,那么其他的properties将都不会执行。

其他property定义方式采用“newproperty(:xxx)do ... end”的形式,示例如下:

  1. Puppet::Type.newtype(:database) do
  2. ensurable
  3. newproperty(:owner) do
  4. desc "The owner of the database."
  5. ...
  6. end
  7. end

其中desc是描述这个property的作用,类似于type类型的@doc方法。

values

puppet最开始发展时候,properties里面会有很多代码,然而经过优化与规范,properties里面只需要定义可用的参数或者设置validation和munging(后面的parameters讲解会说到这两个方法),如果你定义了一些参数,那么puppet只会接受这些你定义的参数。通常来讲,只需要定义允许的参数,但是这些参数对其他的property也是生效的。

  1. newproperty(:enable) do
  2. newvalue(:true)
  3. newvalue(:false)
  4. end

validate

validate方法可以对property设置的参数进行处理,例如,当需要参数是字符串时,可以这样写:

  1. newproperty(:owner) do
  2. validate do |value|
  3. unless value =~ /^\w+/
  4. raise ArgumentError, "%s is not a valid user name" % value
  5. end
  6. end
  7. end

执行顺序

puppet根据property定义顺序执行,所以对一个目标系统资源进行检查和修复的顺序也是根据我们定义property的顺序执行的。

日志输出

日志输出是必不可少的,通过puppet日志你可以看到目标系统资源都进行了怎样的变化,通过如下三个方法可以实现日志输出功能:

  1. is_to_s:日志内容描述目标资源当前参数。
  2. should_to_s: 日志内容描述目标资源应该是什么参数,但不做更改。
  3. change_to_s:日志内容描述目标资源被改成了什么参数。

示例:

  1. def should_to_s(newvalue)
  2. if provider.respond_to?(:package_settings_should_to_s)
  3. provider.package_settings_should_to_s(should, newvalue)
  4. else
  5. super(newvalue)
  6. end
  7. end
  8. def is_to_s(currentvalue)
  9. if provider.respond_to?(:package_settings_is_to_s)
  10. provider.package_settings_is_to_s(should, currentvalue)
  11. else
  12. super(currentvalue)
  13. end
  14. end
  15. def change_to_s(currentvalue, newvalue)
  16. if provider.respond_to?(:package_settings_change_to_s)
  17. provider.package_settings_change_to_s(currentvalue, newvalue)
  18. else
  19. super(currentvalue,newvalue)
  20. end
  21. end

property参数传递与使用

当创建一个资源时候,我们指定的参数会被存储在每一个property的@should方法中,我们可以在资源中使用如下方式去调用这些参数:

  1. myval = should(:color)

当然有时候也会调用parameters里的参数,parameters里的参数不能使用should方法了,而应该使用value方法。所以当你不确定你调用的参数是properties里的还是parameters里的时候,使用value方法肯定是没错的:

  1. myvalue = value(:color)

Type-Parameters

parameters方法的使用和property大体上是相同的,唯一的不同是parameters不会调用providers的方法。

定义一个新的parameter使用newparam方法,后面的语法和property方法一样。示例如下:

  1. newparam(:name) do
  2. desc "The name of the database."
  3. end

Namevar

每个type都应该有至少一个必有的parameter:namevar。这个parameter是该资源的唯一标识,例如:磁盘上的路径,用户名称,包的名称等等。

如果声明的资源里不指定namevar方法,那么这个资源的title将会是namevar的默认值。

有三个方法声明namevar:

  1. 创建名称为:name的parameter会被认为是namevar
  1. newparam(:name) do
  2. desc "The name of the database."
  3. end
  1. 设置:namevar => true参数指定namevar:
  1. newparam(:path, :namevar => true) do
  2. ...
  3. end
  1. 直接调用isnamevar方法,不用指定任何参数:
  1. newparam(:path) do
  2. isnamevar
  3. ...
  4. end

当没有namevar的定义时候会报错,puppet2.7和puppet3的报错信息如下:

puppet 2.7:

  1. $ puppet apply -e "testing { h: }"
  2. Error: undefined method `merge' for []:Array

Puppet 3:

  1. $ puppet apply -e "testing { h: }"
  2. Error: No set of title patterns matched the title "h".

Values

一次声明多个变量的方法:

  1. newparam(:color) do
  2. newvalues(:red, :green, :blue, :purple)
  3. end

声明变量也可以使用正则表达式的形式:

  1. newparam(:color) do
  2. desc "Your color, and stuff."
  3. newvalues(:blue, :red, /.+/)
  4. end

Validation和Munging方法

一些parameters是没必要定义参数列表的,或者想要对传进来的参数进行一些处理,那么我们可以使用validate和munge方法:

  1. newparam(:color) do
  2. desc "Your color, and stuff."
  3. newvalues(:blue, :red, /.+/)
  4. validate do |value|
  5. if value == "green"
  6. raise ArgumentError,
  7. "Everyone knows green databases don't have enough RAM"
  8. else
  9. super
  10. end
  11. end
  12. munge do |value|
  13. case value
  14. when :mauve, :violet # are these colors really any different?
  15. :purple
  16. else
  17. super
  18. end
  19. end
  20. end

validate和munge的区别:

validate只会处理使用newvalues定义过的参数,然而munge方法会处理所有传进来的参数,包括newvalues定义过的和其他被指定的参数。假如传递进来的参数都没有经过处理,那么必须使用调用super方法(也就是说else后面必须使用super方法),否则传进来的数值就因被丢失而失效。super方法的使用可以参考我的另一篇博客ruby语法-super用法

一般来讲,参数总是先经过validate方法再经过munged方法。

最后要说明的一点:validate和munge方法只会处理传进来的参数(该参数已经是确定我们期望的值了),而不会处理方法里预定义的参数。

布尔类型参数

因为声明布尔类型的参数是很常见的,所以为了定义的方便,可以使用下面的方式:

  1. require 'puppet/parameter/boolean'
  2. # ...
  3. newparam(:force, :boolean => true, :parent => Puppet::Parameter::Boolean)

其中:parent => Puppet::Parameter::Boolean会配置parameter接受许多的名称(变量等),并判断其真假,返回true或false。:boolean => true部分会创建一个布尔方法并返回parameter的最终参数,在上面的例子中,等同于:boolean => true创建了一个force?的方法。

Automatic Relationships

一个type资源可以指定要自动关联的资源,通过使用autorequire,autobefore,autonotify和autosubscribe方法,这些方法需要一个资源类型的名字作为参数,并且会返回一个资源列表,这个资源列表可能会与你定义的type方法有某些关联。示例:

  1. autorequire(:user) do
  2. self[:user]
  3. end

需要注意的一点:当使用这四个方法时,即使调用的资源名称(例如上例中的user)并不是一个有效的资源,也不会报错。

Agent-side Pre-Run Resource

这是一个发生在agent端的事情,在agent端有时我们需要设置一些先决条件,当先决条件不被满足时,就会跳出部署catalog。这个先决条件的定义就是pre_run_check方法了。

如果type资源里面定义了pre_run_check方法,在Puppet agent或puppet apply部署catalog之前,首先会运行所有资源里的pre_run_check方法,一旦有错误产生,就会将错误信息打印出来告知使用者并停止部署catalog。

参考文档:

https://puppet.com/docs/puppet/4.7/custom_types.html

puppet-type的更多相关文章

  1. Learning Puppet — Resources and the RAL

    Learning Puppet — Resources and the RAL Welcome to Learning Puppet! This series covers the basics of ...

  2. 企业级自动化运维工具---puppet详解

    本文收录在Linux运维企业架构实战系列 1.认识puppet 1.1 引入 puppet是什么,咱们先不用专业的名词解释它,咱们先描述一些工作场景,看明白这些工作场景,自然会知道puppet是什么. ...

  3. puppet笔记

    简介: puppet是一种Linux.Unix平台的集中配置管理系统,使用ruby语言,可管理配置文件.用户.cron任务.软件包.系统服务等.puppet把这些系统实体称之为资源,puppet的设计 ...

  4. 项目10.2-企业级自动化运维工具---puppet详解

    1.认识puppet 1.1 引入 puppet是什么,咱们先不用专业的名词解释它,咱们先描述一些工作场景,看明白这些工作场景,自然会知道puppet是什么. (1)场景一: 管理员想要在100台服务 ...

  5. Puppet单机实战之Nginx代理Tomcat

    author:JevonWei 版权声明:原创作品 blog:http://119.23.52.191/ --- 构建实战之Nginx代理Tomcat [root@node1 modules]# mk ...

  6. 自动化运维工具之Puppet常用资源(一)

    前文我们聊到了puppet的架构,单机模型和master/agent模型的工作流程以及puppet的基础使用,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14 ...

  7. 自动化运维工具之Puppet常用资源(二)

    前文我们了解了部分puppet的资源的使用,以及资源和资源的依赖关系的定义,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14071459.html:今天我们继 ...

  8. 自动化运维工具之Puppet变量、正则表达式、流程控制、类和模板

    前文我们了解了puppet的file.exec.cron.notify这四种核心资源类型的使用以及资源见定义通知/订阅关系,回顾请参考https://www.cnblogs.com/qiuhom-18 ...

  9. 自动化运维工具之Puppet模块

    前文我们了解来puppet的变量.流程控制.正则表达式.类和模板的相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14079208.html:今天我们来 ...

  10. 自动化运维工具之Puppet master/agent模型、站点清单和puppet多环境设定

    前文我们了解了puppe中模块的使用,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14086315.html:今天我来了解下puppet的master/age ...

随机推荐

  1. sonar之阿里巴巴java规则(p3c)

    今天为了打包生成sonar-p3c-pdm插件,折腾了半天.sonar版本v6.7.6,p3c源码地址https://gitee.com/jasonlong10/sonar-p3c-pmd-plugi ...

  2. windows server 2016安装

    slmgr /skms kms.03k.org slmgr /ato slmgr /ipk WC2BQ-8NRM3-FDDYY-2BFGV-KHKQY kms服务器: https://03k.org/ ...

  3. docker--centos镜像安装tomcat jdk1.8 mysql部署java web项目

    一.下载centos7标准镜像及安装mysql5.7 在centos安装mysql5.7 二.安装jdk 1.查询可用jdk版本 yum search java|grep jdk 2.根据搜索到的jd ...

  4. Python-docx 读取word.docx内容

    第一次写博客,也不知道要写点儿什么好,所以就把我在学习Python的过程中遇到的问题记录下来,以便之后查看,本人小白,写的不好,如有错误,还请大家批评指正! 中文编码问题总是让人头疼,想要用Pytho ...

  5. Mac使用笔记大全

    1.mac中,怎么直接在当前文件夹打开终端? 步骤:(1)在键盘-快捷键-服务,勾选“新建位于文件夹位置的终端窗口”.(2)然后在需要打开终端的文件夹上,右键,“新建位于文件夹位置的终端窗口”即可. ...

  6. 通过PRINT过程制作报表

    通过PRINT过程制作报表 PRINT过程是SAS中用于输出数据集内容的最简单常用的过程,它可将选择的观测和字段以简单的矩形表格形式输出. 1.1 制作简单报表 使用PRINT过程最简单的语法形式如下 ...

  7. 每日一练ACM 2019.04.13

    2019.04.13 第1002题:A+B Proble Ⅱ Problem DescriptionI have a very simple problem for you. Given two in ...

  8. Linux 第十六天

    十六.服务管理 1.服务分类 1)RPM包默认安装的服务:包括独立的服务.基于xinetd的服务 2)源码包安装的服务 3)RPM安装服务和源码包安装服务的区别就是安装位置的不同 >源码包安装在 ...

  9. linux五种I/O模型

    1.基本概念 1.1同步和异步 同步和异步关注的是消息通信机制 1.1.1同步 所谓同步,就是在发出一个调用时,在没有得到结果之前,调用就不返回,一直在等,但是一旦调用返回,就能得到返回值. 1.1. ...

  10. 用chrome模拟微信浏览器访问页面

    有的网页通过限制 user agent  来达到禁止在微信浏览器以外的地方访问,我们通过chrome修改user agent即可破解. CHROME浏览器,进入开发者模式 切换到手机浏览模板 打开 N ...