Rex-CMDB-YAMLwithRoles
view release on metacpan or search on metacpan
lib/Rex/CMDB/YAMLwithRoles.pm view on Meta::CPAN
$self->{use_roles} = 0;
}
# set the default role path ro 'cmdb/roles'
if ( !defined( $self->{roles_path} ) ) {
$self->{roles_path} = File::Spec->join( $self->{path}, 'roles' );
}
# if parsing failure should be fatal
# default true
if ( !defined( $self->{parse_error_fatal} ) ) {
$self->{parse_error_fatal} = 1;
}
# die if the role does not exist
# default true
if ( !defined( $self->{missing_role_fatal} ) ) {
$self->{missing_role_fatal} = 1;
}
# default to false, config overwrites role settings
if ( !defined( $self->{roles_merge_after} ) ) {
$self->{roles_merge_after} = 0;
}
return $self;
} ## end sub new
sub get {
my ( $self, $item, $server ) = @_;
$server = $self->__get_hostname_for($server);
my $result = {};
# keep this out here so generated when the files are loaded
# keep it around later for role processing
my %template_vars;
if ( $self->__cache->valid( $self->__cache_key() ) ) {
$result = $self->__cache->get( $self->__cache_key() );
} else {
my @files = $self->_get_cmdb_files( $item, $server );
Rex::Logger::debug( Dumper( \@files ) );
# configuration variables
my $config_values = Rex::Config->get_all;
for my $key ( keys %{$config_values} ) {
if ( !exists $template_vars{$key} ) {
$template_vars{$key} = $config_values->{$key};
}
}
$template_vars{environment} = Rex::Commands::environment();
for my $file (@files) {
Rex::Logger::debug("CMDB - Opening $file");
if ( -f $file ) {
my $content = eval { local ( @ARGV, $/ ) = ($file); <>; };
my $t = Rex::Config->get_template_function();
$content .= "\n"; # for safety
$content = $t->( $content, \%template_vars );
my $ref;
my $parse_error;
eval { $ref = Load($content); };
if ($@) {
$parse_error = $@;
}
# only merge it if we have a actual result
if ( !defined($parse_error) ) {
$result = $self->{merger}->merge( $result, $ref );
} else {
my $error = 'Failed to parse YAML config file "' . $file . '" with error... ' . $parse_error;
if ( $self->{parse_error_fatal} ) {
die($error);
} else {
warn($error);
}
}
} ## end if ( -f $file )
} ## end for my $file (@files)
} ## end else [ if ( $self->__cache->valid( $self->__cache_key...))]
# if use_roles is true, process the roles variablesif set
# the item has roles and that the roles is a array
if ( $self->{use_roles}
&& ( defined( $result->{roles} ) )
&& ( ref( $result->{roles} ) eq 'ARRAY' ) )
{
Rex::Logger::debug("CMDB - Starting role processing");
# load each role
foreach my $role ( @{ $result->{roles} } ) {
Rex::Logger::debug( "CMDB - Processing role '" . $role . "'" );
my $role_file = File::Spec->join( $self->{roles_path}, $role . '.yaml' );
# if the file exists, load it
if ( -f $role_file ) {
my $content = eval { local ( @ARGV, $/ ) = ($role_file); <>; };
my $t = Rex::Config->get_template_function();
$content .= "\n"; # for safety
$content = $t->( $content, \%template_vars );
my $ref;
my $parse_error;
eval { $ref = Load($content); };
if ($@) {
$parse_error = $@;
}
# only merge it if we have a actual result
# undef causes the merge feature to wipe it all out
# that and it did error... so we need to handle the error
if ( !defined($parse_error) ) {
# don't let host variables override the role if
# roles_merge_after is true
if ( $self->{roles_merge_after} ) {
$result = $self->{merger}->merge( $ref, $result );
} else {
$result = $self->{merger}->merge( $result, $ref );
}
} else {
my $error = 'Failed to parse YAML role file "' . $role_file . '" with error... ' . $parse_error;
if ( $self->{parse_error_fatal} ) {
die($error);
} else {
warn($error);
}
}
} else {
my $error = "The role '" . $role . "' is specified by the file '" . $role_file . "' does not eixst";
if ( $self->{missing_role_fatal} ) {
die($error);
} else {
warn($error);
}
}
} ## end foreach my $role ( @{ $result->{roles} } )
} ## end if ( $self->{use_roles} && ( defined( $result...)))
if ( defined $item ) {
return $result->{$item};
}
return $result;
} ## end sub get
sub _get_cmdb_files {
my ( $self, $item, $server ) = @_;
$server = $self->__get_hostname_for($server);
my @files;
if ( !ref $self->{path} ) {
my $env = Rex::Commands::environment();
my $server_file = "$server.yaml";
my $default_file = 'default.yaml';
@files = (
( run in 1.657 second using v1.01-cache-2.11-cpan-54e63673c56 )