跳转至

7 Puppet - Function

1 Function

Puppet 支持任何其他编程语言的功能,因为 Puppet 的基本开发语言是 Ruby。它支持两种类型的函数,称为语句statement和rvalue

  • Statements代表,它们没有任何返回类型。它们用于执行独立任务,例如在新清单文件中导入其他 Puppet 模块。
  • Rvalue 返回值,并且只能在语句需要值时使用,例如赋值或 case 语句

Puppet 中函数执行的关键在于,它只在 Puppet master 上执行,它们不在客户端或 Puppet 代理上执行。

因此,他们只能访问 Puppet Master 上可用的命令和数据。已经存在不同类型的功能,甚至用户也有权根据需要创建自定义功能。下面列出了一些内置函数。

文件功能

文件资源的文件功能是在 Puppet 中加载一个模块,并以字符串的形式返回所需的输出。它查找的参数是 <module name>/<file> 引用,它有助于从 Puppet 模块的文件目录加载模块。

script/tesingscript.sh 会从 <module name>/script/files/testingscript.sh 加载文件。

函数具有读取和接受绝对路径的能力,这有助于从磁盘上的任何位置加载文件。

包含函数

在 Puppet 中,include 函数与任何其他编程语言中的 include 函数非常相似。它用于声明一个或多个类,从而评估这些类中存在的所有资源,最后将它们添加到目录中。它的工作方式是,include 函数接受类名、类列表或以逗号分隔的类名列表。

使用 include 语句时要记住的一件事是,它可以在一个类中多次使用,但有一个限制,即只能包含一个类。

如果包含的类接受参数,则包含函数将使用 <class name>::<parameter name> 作为查找键自动查找它们的值。

包含函数不会导致类在声明时包含在类中,因为我们需要使用包含函数。它甚至不会在声明的类和围绕它的类中创建依赖关系。

在 include 函数中,只允许使用类的全名,不允许使用相对名称。

定义函数

在 Puppet 中,定义的函数有助于确定给定类或资源类型的定义位置,并返回布尔值或不返回。还可以使用define 来确定是否定义了特定资源或定义的变量是否具有值。

使用定义函数时要记住的关键点是,该函数至少接受一个字符串参数,可以是类名、类型名、资源引用或“$name”形式的变量引用。

定义本机和已定义函数类型的函数检查,包括模块提供的类型。类型Type和类Class由它们的名称匹配。该函数通过使用资源引用匹配资源减速。

Define Function Matches

# Matching resource types 
defined("file") 
defined("customtype")  

# Matching defines and classes 
defined("testing") 
defined("testing::java")  

# Matching variables 
defined('$name')  

# Matching declared resources 
defined(File['/tmp/file']) 

2 自定义函数

函数为用户提供了开发自定义函数的特权。 Puppet 可以通过使用自定义函数来扩展其解释能力。自定义函数有助于增加和扩展 Puppet 模块和清单文件的功能。

编写自定义函数

在编写函数之前,有几件事情需要记住。

  • 在 Puppet 中,函数由编译器执行,这意味着所有函数都在 Puppet master 上运行,它们不需要处理任何 Puppet 客户端。功能只能与代理交互,提供的信息是事实的形式。
  • Puppet master 捕获自定义函数,这意味着如果对 Puppet 函数进行一些更改,则需要重新启动 Puppet master。
  • 函数将在服务器上执行,这意味着该函数需要的任何文件都应该存在于服务器上,如果该函数需要直接访问客户端计算机,则无法执行任何操作。
  • 完全有两种不同类型的函数可用,一种是返回值的 Rvalue 函数和不返回任何内容的语句函数。
  • 包含函数的文件名应与文件中的函数名相同。否则,它不会自动加载

放置自定义函数的位置

所有自定义函数都实现为单独的 .rb 文件并分布在模块之间。需要将自定义函数放在 lib/puppet/parser/function 中。可以从以下位置从 .rb 文件加载函数。

  • $libdir/puppet/parser/functions
  • puppet/parser/functions sub-directories in your Ruby $LOAD_PATH

创建新函数

使用 puppet::parser::Functions 模块中的 newfunction 方法创建或定义新函数。需要将函数名称作为符号传递给 newfunction 方法,并将代码作为块运行。以下示例是一个函数,用于将字符串写入 /user 目录内的文件。

module Puppet::Parser::Functions 
   newfunction(:write_line_to_file) do |args| 
      filename = args[0] 
      str = args[1] 
      File.open(filename, 'a') {|fd| fd.puts str } 
   end 
end

Once the user has the function declared, it can be used in the manifest file as shown below.

write_line_to_file('/user/vipin.txt, "Hello vipin!")