Puppet 命令依赖于另一个类

Puppet 命令依赖于另一个类

我不明白如何让 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,则标记不一定可见。此外,如果您使用节点继承并在不同级别包含sshssh_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
}

使用标记是可行的,但很难扩展依赖解析顺序的东西。最好将所有类放在同一个模块中,或者包含在需要它的模块中。还要记住,“包含”不需要是唯一的,你可以多次包含同一件事。

相关内容