The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Puppet::Classify - Connects to the Puppet Classifier API (PE Console groups)

VERSION

version 0.003

SYNOPSIS

This module interacts with the Puppet Classifier API (i.e. Puppet Enterprise Console Classification groups)

    use Puppet::Classify;

    # Create a Puppet classification object
    my $classify = Puppet::Classify->new( 
                                          cert_name       => $config->{puppet_classify_cert},
                                          server_name     => $config->{puppet_classify_host},
                                          server_port     => $config->{puppet_classify_port},
                                          puppet_ssl_path => $config->{puppet_ssl_path},
                                          puppet_db       => $puppet_db,
                                        );
    # Get a group's rule
    my $rule = $classify->get_group_rule( $group_name );

    # Convert the rule for use with the PuppetDB
    $rule = $classify->convert_rule_for_puppetdb( $rule );

It requires the Puppet::DB module.

METHODS

new

Create the Puppet::Classify object. The following can be set at creation time (defaults shown):

    my $puppet_db = Puppet::DB->new;
    my $classify = Puppet::Classify->new( 
                                          server_name     => 'localhost',
                                          server_port     => 4433,
                                          puppet_ssl_path => '/etc/puppetlabs/puppet/ssl',
                                          puppet_db       => $puppet_db,
                                        );

otherwise to create the object:

    my $puppet_db = Puppet::DB->new;
    my $classify = Puppet::Classify->new;
    my $classify = Puppet::Classify->new( 'puppet.example.com' );
    my $classify = Puppet::Classify->new( puppet_db => $puppet_db);

server_name

The puppet master that is running the classifier API. Connects to localhost by default.

    $classify->server_name('puppet.example.com');

server_port

Connect to the Puppet Classifier server on port 4433 by default - this can be overidden when consumed.

    $classify->server_port(8754);

access_token

Use an access_token instead of a certificate to connect to the API. This loads the authentication token saved in your home, but it can be set manually if it is not stored there.

    say $classify->access_token;

environment

The environment to use for the classification - this can be overidden when consumed. Defaults to 'dev'.

    $classify->environment('test');

cert_name

the basename of the certificate to be used for authentication. This is a certificate that has been generated on the Puppet Master and added to the whitelist. This can be used instead of using an auth token.

    $classify->cert_name('api_access');

puppet_ssl_path

Set the path to the Puppet SSL certs, it uses the Puppet enterprise path by default.

    $classify->server_name('puppet.example.com');

timeout

The connection timeout. Defaults to 360 seconds.

    $classify->timeout(30);

puppet_db

The puppet DB object used to interact with the Puppet DB.

    $classify->puppet_db(Puppet::DB->new);

update_classes

Updates the class cache.

    $classify->update_classes;

get_classes

Gets a list of all the class information.

    my $classes = $classify->get_classes( $group );

get_group_rule

Returns the rule as a Perl data structure given the group name.

    my $group_name = "Production";
    my $group_rule = $classify->get_group_rule( $group_name );

get_group_id

Returns the group ID given the group name.

    my $group_name = "Production environment";
    my $group_id = $classify->get_group_id( $group_name );

get_groups_match

Returns an array ref of a list of group data structures where their names match the given string

    my $groups = $classify->get_groups_match( "Roles" );
    say Dumper( $groups );

get_groups

Returns an array ref of all the group data structures

    my $groups = $classify->get_groups;
    say Dumper( $groups );

get_group_children

Returns an array ref of all the group data structures according to the specified parent group ID

    my $parent = "Production environment";
    my $parent_gid = $classify->get_group_id( $parent );
    my $children = $classify->get_group_children( $parent_gid );
    say Dumper( $children );

add_group_safe

Creates a new group, but checks if one already exists by the same name. If it does, the force option can be specified to remove it first - thus redefining it.

The example data structure is the minimum. See https://puppet.com/docs/pe/latest/groups_endpoint.html#post-v1-groups for more info on the fields.

    my $parent = "Production environment";
    my $parent_gid = $classify->get_group_id( $parent );
    my $name = 'A group';
    my $force = 1;
    my $group = { 
                  name   => $name,
                  parent => $parent_id,
                };
    $classify->add_group_safe( $name, $group, $force );

create_group

Use with caution. It is preferable to use add_group_safe

Creates a new group (or overwrites another). The example data structure is the minimum. See https://puppet.com/docs/pe/latest/groups_endpoint.html#post-v1-groups for more info on the fields.

    my $parent = "Production environment";
    my $parent_gid = $classify->get_group_id( $parent );
    my $group = { 
                  name   => 'A group',
                  parent => $parent_id,
                };
    $classify->create_group( $group );

update_group_rule

Replaces a groups rule with a new one. The group is specified by its group ID.

    $classify->update_group_rule( $gid, $rule );

update_group_environment

Sets the environment for a group. The group is specified by its group ID.

    $classify->update_group_environment( $gid, $environment );

update_group

Updates a groups info according to the specified hash. Only the elements specified in the hash are updated (replaced).

    my $config = { 
                  environment => $environment,
                  parent => $parent_id,
                };
    $classify->update_group( $gid, $config );

remove_group_safe

Removes a group unless it has pinned nodes. It can still be deleted if it has pinned nodes if a force option is turned on.

    my $force = 1;
    $classify->create_group( $group_name, $force );

try_remove_group

This will remove a group, but first check if it has children (it which case it will just log an error rather than doing anything)

    $classify->create_group( $group_name );

It is preferable to call remove_group_safe.

delete_group

Deletes a group. This will work ever if nodes are pinned to the group, but it cannot delete groups that have children groups (the children must be removed first).

    $classify->delete_group( $id );

It is preferable to call remove_group_safe.

convert_rule_for_puppetdb

Converts a classifier node matching rule into a form that is compatible with the PuppetDB

    my $rule2 = $classify->convert_rule_for_puppetdb( $rule1 );

get_nodes_matching_group

Returns an array ref list of nodes matching a group.

    my $nodes = $classify->get_nodes_matching_group( $group_name );

This can take some time to run as it needs to connect to the PuppetDB to find out the nodes.

get_hosts_from_pinned_rule

Returns an array ref list of nodes pinned to a group (you need to pass the rule of the group).

    my $group_rule = $classify->get_group_rule( $group_name );
    my $nodes = $classify->get_hosts_from_pinned_rule( $group_rule );

list_nodes_pinned_in_group

This lists the nodes in a group to STDOUT.

    $classify->list_nodes_pinned_in_group( $group_name );

purge_old_nodes

This will purge all the pinned nodes from the children of the specified group if those nodes cannot be found in the Puppet DB anymore.

    $classify->purge_old_nodes( $parent_id );

list_membership_of_nodes

For a list of nodes and a parent group, maps which child group each node is pinned to. If no nodes are specified, it will be assumed to be all the nodes matching the parent.

    my $nodes = [ qw( node1 node2 ) ];
    $classify->list_membership_of_nodes( $parent_name, $nodes );

or

    $classify->list_membership_of_nodes( $parent_name );

remove_nodes_from_all_groups

Removes all the specified nodes from all the child groups of the specified parent group.

    my $parent = "Production environment";
    my $parent_gid = $classify->get_group_id( $parent );
    my $nodes = [ qw( node1 node2 ) ];
    $classify->remove_nodes_from_all_groups( $parent_gid, $nodes );

empty_group_of_pinned_nodes

Remove all pinned nodes from a group leaving other rules in place

    $classify->empty_group_of_pinned_nodes( $group_name );

remove_pinned_node_from_group

Remove specified pinned nodes from a group leaving other rules in place

    my $nodes = [ qw( node1 node2 ) ];
    $classify->remove_pinned_node_from_group( $group_name, $nodes );

pin_nodes_to_group

Pin nodes to the specified group

    my $nodes = [ qw( node1 node2 ) ];
    $classify->pin_nodes_to_group( $group_name $nodes );

AUTHOR

Matthew Mallard <mqtech@cpan.org>

COPYRIGHT AND LICENSE

This software is copyright (c) 2019 by Matthew Mallard.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.