You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Puppet 3.6中编写自定义函数?(仅限该版本)

解决Puppet 3.6中非法字符检查的语法问题

你遇到的报错核心原因是Puppet 3.6不支持在defineclass内部使用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及以后版本,函数也不能嵌套在defineclass内部,必须在全局或模块的functions目录下定义,所以原来的写法在任何版本里都是不符合语法的。

内容的提问来源于stack exchange,提问作者John

火山引擎 最新活动