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.