puppet:有什么方法可以修改资源类型的实例名称?

时间:2014-05-23 18:13:24

标签: ruby puppet

我正在实现一个木偶提供者,我发现从原始的cli设计中,如果实例组不同,它可以具有多个相同的实例名称。 它看起来如下:

NAME GROUP   PARAM
AA   DEFAULT ...
BB   DEFAULT ...
CC   DEFAULT ...
AA   TEST    ...      # can have the same name since the group is different

在这种情况下,您不能将每个实例的名称设置为namevar,因为它不保证唯一性。由于puppet不支持联合键值,我决定使用group和name的组合作为实例的键。

foo_provider{'DEFAULT/AA':
   ensure     => 'present',
   properties => { .... },
}
foo_provider{'DEFAULT/BB':
   ensure     => 'present',
   properties => { .... },
}
...
foo_provider{'TEST/AA':
   ensure     => 'present',
   properties => { .... },
}

通过这种方式,可以使用每个唯一键值存储所有实例。到目前为止看起来还不错。

但是在显式调用每个实例时会出现问题。

# puppet resource foo bar

,其中bar是实例的名称。

正如原始cli支持的那样,我想仅支持实例名称作为默认值,这意味着,

# puppet resource foo DEFAULT/AA  -> this works without any issue
# puppet resource foo TEST/AA     -> group name must be defined explicitly unless
                                     the instance is in DEFAULT group
# puppet resource foo AA          -> this should be equivalent to DEFAULT/AA as
                                     undefined group name indicates DEFAULT value

前两个方案工作正常,没有任何调整,但我想支持默认组名的隐式自动完成,以方便用户。像,

def verify_input_val()
    default_group = "DEFAULT"
    usrstr = @resource[:name].split("/")
    if usrstr.length == 1
        return default_tenant, usrstr[0]
    elsif  usrstr.length == 2
        return usrstr[0], usrstr[1]
    else
        raise Puppet::Error, "Invalid instance name"
    end
end

def exist?
    group_name, inst_name = verify_input_val()
    full_name = group_name + "/" + inst_name
    @resource[:name] = full_name        # This doesn't seem effective
    # This thus will just look only for "inst_name" not 'full_name'.
    @property_hash[:ensure] == :present 
end

我发现实例名称可以通过@resource[:name]访问,但遗憾的是我只能获取值,而不能反向设置,例如@resource[:name] = "blah"

有没有办法可以在puppet provider中修改用户输入实例值?

1 个答案:

答案 0 :(得分:0)

嗯,Puppet 支持支持复合键,但该代码存在问题。

您应该能够声明多个namevar。那么它们就变成了key attributes

不过,你的里程可能会有所不同,有龙。