如何确保«if»语句在给定资源/类之前被parsing?

有时包之间会有复杂的交互。 为了避免带有无数看起来不相关的参数的类接口,我关于使用标签, defined(<resource>)函数让资源根据configuration的其余部分(而不是事实)稍微改变它们的行为。

不幸的是,我无法想出让Puppet首先parsing可以生成条件的类的方法,然后才能通过隐式地(通过标签)来parsing类的行为取决于第一个类的执行方式。

假设这里是一个class级,pipe理一个地方,一个特定的用户存储他敏感的个人数据。 这个类可以创build分区(可能是encryption的),或者只是维护一个外部文件夹(比如/ mnt / user)。 或者它可以保持文件夹在默认位置,即在/ home / user(spurcetype =>'none')中

 class userdocs ( $sourcetype) { case $sourcetype { 'cryptpartition' : { tag 'dedicated_user_docs_partition' ... } 'partition' : { tag 'dedicated_user_docs_partition' ... } 'none' : { ... } } ... } 

除了相当标准的文件夹集,用户可能要转发到他的分区,有文件夹的存在取决于特定的软件运行,如thunderbird或virtualbox。 如果满足两个条件,创build链接(而不是文件夹),例如virtualbox应该只做:a)用户pipe理单独的分区( tagged('dedicated_user_docs_partition')用户安装VirtualBox。

必须有一个地方,我可以放置额外的代码,检查这两个条件。 我可以把它放到课堂上,pipe理virtualbox:

 class vbox { if tagged('dedicated_user_docs_partition') { file { "${userhome}/.VirtualBox": ensure=>link, require=>Class['userdocs'] ... } } else { file { "${userhome}/.VirtualBox": ensure=>directory, require=>Class['userdocs'] ... } } ... } 

问题是,尽pipe我明确要求在userdocs之前执行file资源,但file资源之后被评估,并且puppet错误地假定该用户没有dedicated_user_docs_partition并执行if语句的错误分支。

有什么办法可以解决这个问题吗?


我在ask.puppetlabs.com上发表了这个问题。

lavaman认为,这是一个使用虚拟资源的答案。

我不喜欢这样的事实,它迫使我把“VirtualBox”的代码放到这个类中,我认为它应该在逻辑上独立于它。 但我认为这可以使用委托类(如userdocs :: virtualbox,完全在其他地方定义)。

 class userdocs ( $sourcetype) { case $sourcetype { 'cryptpartition' : { @file { "${userhome}/.VirtualBox": ensure=>link, ... } ... } 'partition' : { @file { "${userhome}/.VirtualBox": ensure=>link, ... } ... } 'none' : { @file { "${userhome}/.VirtualBox": ensure=>directory, ... } ... } } ... } 

 class vbox { realize File["${userhome}/.VirtualBox"] ... 

}

对于这个答案,信贷转到lavaman上的用户lavaman:

假设你用puppet来pipe理软件(这看起来就是你的示例代码),我会在处理坐骑的模块收集的软件模块中使用虚拟资源。

http://docs.puppetlabs.com/puppet/latest/reference/lang_virtual.html