如何在Puppet 3.6中编写自定义函数?(仅限该版本)
解决Puppet 3.6中非法字符检查的语法问题
你遇到的报错核心原因是Puppet 3.6不支持在define或class内部使用function关键字定义Puppet DSL函数——这种写法是Puppet 4及以后版本才引入的特性,老版本的解析器根本识别不了这个语法,直接抛出了语法错误。
而且受限于工具要求所有功能必须在单个manifest里,我们没法用Puppet 3传统的Ruby自定义函数(需要放在模块的lib目录下),所以得换一种方式实现非法字符检查:
方案1:直接在define内写重复检查逻辑(最简单直观)
把检查逻辑直接写在my_module::my_manifest内部,针对每个参数做正则匹配和错误抛出:
define my_module::my_manifest($param1, $param2) { # 定义非法字符正则 $illegal_chars = '[&|;]' # 检查param1 if $param1 =~ $illegal_chars { fail("Illegal char(s) detected in '${param1}', cannot contain any of '${illegal_chars}'") } # 检查param2 if $param2 =~ $illegal_chars { fail("Illegal char(s) detected in '${param2}', cannot contain any of '${illegal_chars}'") } # rest of my_manifest... }
方案2:用内部辅助define复用检查逻辑
如果需要检查多个参数,不想重复写正则和判断,可以在同一个manifest里定义一个辅助define来封装检查逻辑:
# 辅助define:封装非法字符检查逻辑 define my_module::check_illegal_chars($target_string) { $illegal_chars = '[&|;]' if $target_string =~ $illegal_chars { fail("Illegal char(s) detected in '${target_string}', cannot contain any of '${illegal_chars}'") } } define my_module::my_manifest($param1, $param2) { # 调用辅助检查逻辑 my_module::check_illegal_chars { 'validate-param1': target_string => $param1, } my_module::check_illegal_chars { 'validate-param2': target_string => $param2, } # rest of my_manifest... }
为什么原来的代码不行?
再强调一下关键差异:
- Puppet 3.6没有内置的Puppet DSL函数定义能力(
function关键字是Puppet 4+的特性),所有自定义函数必须用Ruby编写并放在模块的lib/puppet/parser/functions目录下,但你的工具限制了只能用单个manifest,所以这种方式不可行。 - 就算是Puppet 4及以后版本,函数也不能嵌套在
define或class内部,必须在全局或模块的functions目录下定义,所以原来的写法在任何版本里都是不符合语法的。
内容的提问来源于stack exchange,提问作者John




