我有一个问题,只有在安装了其他模块/类的情况下,我才能使puppet运行命令。 我读定义函数可以做到这一点,但我不明白这一点。 示例我正在尝试做什么:
比方说,我有一个模块/类的SSH和模块/类的SSH密钥 ,然后我想只在SSH模块/类在节点中定义的SSH密钥运行命令。
我正在为NagiOS做这件事,以确保NagiOS只监视那些安装了它想要监视的模块的服务器。
PS:对不起,如果我解释得不好。
一种可能是使用标签。 当你包含一个类的时候,Puppet会自动用类名来标记节点。 例如:
node myhost { include ssh # This node is now tagged with 'ssh' tag include ssh_keys }
请注意,包含的顺序非常重要。 如果ssh_keys包含在ssh类之前,那么标记不一定是可见的。 另外,如果你正在使用节点inheritance,并且在不同级别上包括ssh和ssh_keys ,那么ssh标签的结束位置并不是很清楚。 如果需要,您可以手动标记, tag(ssh) ,但这不是很好维护。
您可以使用tagged函数来检查标记是否存在:
# modules/ssh_keys/manifests/init.pp class ssh_keys { if tagged(ssh) { exec {"SSH specific command": command => "/usr/bin/run_when_ssh_is_included", } } }
这种方法也可以用于如下情况:
你也可以在ssh类中包含ssh_keys。
node myhost { include ssh } class ssh { include ssh_keys }
使用标记的作品,但很难扩大依赖parsing顺序的东西。 最好让所有的类都在同一个模块中,或者包含在需要的模块中。 另外请记住,'包括'不需要是唯一的,你可以多次包含相同的东西。