我不明白如何让 puppet 仅在安装了另一个模块/类时运行命令。我读到定义函数可以做到这一点,但我不明白。例如,我正在尝试做什么:
假设我有一个模块/类SSH和模块/类SSH 密钥然后我想运行一个命令SSH 密钥除非SSH模块/类在节点中定义。
我为 NagiOS 执行此操作,以确保 NagiOS 只监控那些安装了它想要监控的模块的服务器。
附言:如果我解释得不好,请见谅。
答案1
一种可能性是使用标签。当您包含一个类时,Puppet 会自动用类名标记节点。例如:
node myhost {
include ssh
# This node is now tagged with 'ssh' tag
include ssh_keys
}
请注意,包含的顺序很重要。如果在类ssh_keys
之前包含ssh
,则标记不一定可见。此外,如果您使用节点继承并在不同级别包含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",
}
}
}
此方法还可用于以下情况:
- 仅当包含防火墙类时才指定防火墙规则
- 如果包含 monit,则添加 monit 的配置
答案2
您还可以在 ssh 类本身中包含 ssh_keys。
node myhost {
include ssh
}
class ssh {
include ssh_keys
}
使用标记是可行的,但很难扩展依赖解析顺序的东西。最好将所有类放在同一个模块中,或者包含在需要它的模块中。还要记住,“包含”不需要是唯一的,你可以多次包含同一件事。