使用标签

标签(Tag),我们需要你!有时 Puppet 的一个类需要知道另一个类,或者至少要知道其是否已存在。 例如,一个管理防火墙的类或许需要知道一个节点是否是 web 服务器。

Puppet 的 tagged 函数会告诉你一个被命名的类或资源是否已经存在于这个节点的目录中。 你还可以对一个节点或类应用任何标签并检查这些标签是否存在。

操作步骤

  1. 为了帮你辨别你是否运行在一个指定的节点或一组节点,所有节点会根据节点名被自动打标签, 并从父节点那里继承名称。

    node bitfield_server {
        include bitfield
    }
    
    node cookbook inherits bitfield_server {
        if tagged("cookbook") {
            notify { "this will succeed": }
        }
        if tagged("bitfield_server") {
            notify { "so will this": }
        }
    }
    
  2. 为了告诉你一个节点是否包含一个指定的类, 所有的节点会用他们包含的所有类其父类的名字自动打标签:

    include apache::port8000
    
    if tagged("apache::port8000") {
        notify { "this will succeed": }
    }
    
    if tagged("apache") {
        notify { "so will this": }
    }
    
  3. 如果你想要在一个节点上设置指定的标签,则需使用 tag 函数:

    tag("old-slow-server")
    if tagged("old-slow-server") {
        notify { "this will succeed": }
    }
    
  4. 如果你想要对一个指定的资源设置标签,则需使用 tag 元参数metaparameter):

    file { "/etc/ssh/sshd_config":
        source => "puppet:///modules/admin/sshd_config",
        notify => Service["ssh"],
        tag    => "security",
    }
    
  5. 你也可以使用标签来确定哪一部分配置清单将被应用。 如果你在 Puppet 的命令行上使用 --tags 选项,仅仅被打上了指定标签的类或资源被应用。 例如,你只想要更新 exim 的配置而不想运行其他部分的配置清单,执行如下命令:

    # puppet agent --test --tags exim
    

更多用法

你可以使用标签创建一个资源的集合。例如,如果某服务需要依赖一大批文件片段, 你可以使用下面的配置:

class firewall::service {
    service { "firewall":
        …
    }

    File <| tag == "firewall-snippet" |> ~> Service["firewall"]
}

class myapp {
    file { "/etc/firewall.d/myapp.conf":
        tag => "firewall-snippet",
        …
    }
}

在此,我们指定如果更新了被标记为 firewall-snippet 的任何 file 资源, 就通知 firewall 服务。 我们所要做的全部工作就是为特定的应用程序或服务添加防火墙配置片段, 且应用程序或服务是打了 firewall-snippet 标签的, 剩下的工作交由 Puppet 完成。

虽然我们添加了 notify => Service["firewall"] 到每一个资源片段,但是如果 我们定义的 firewall 服务不断变化,就不得不捕获这些变化并据此更新所有的片段。 标签可以让我们把相应的代码进行逻辑封装,这样也使得将来的维护和重构会更加容易。