From Code to Community: Sponsoring The Perl and Raku Conference 2025 Learn more

#!/usr/bin/env perl
use strict; use warnings;
our $VERSION='0.3';
use Getopt::Long 'GetOptionsFromArray';
use Mojo::Util qw/dumper spurt/;
use Mojo::JSON qw/decode_json/;
use Cwd qw(cwd);
use File::Spec::Functions qw(catdir);
sub _args {
my $args
= Getopt::Long::Configure(qw/no_auto_abbrev no_ignore_case pass_through auto_version auto_help/);
GetOptionsFromArray shift,
'h|help' => \$ENV{ANSIBLE_HELP},
'a|args=s' => \$ENV{ANSIBLE_ARGS},
'p|pack' => \$ENV{ANSIBLE_PACK},
'm|module_path=s' => \$ENV{ANSIBLE_MODULE},
'c|check' => \$ENV{ANSIBLE_CHECK_MODE};
Getopt::Long::Configure($args);
}
BEGIN { _args([@ARGV]) };
exit print Mojolicious::Command->extract_usage() if $ENV{ANSIBLE_HELP} || ! $ENV{ANSIBLE_MODULE};
if($ENV{ANSIBLE_PACK}) {
my $fp=App::FatPacker->new;
my @modules = split /\r?\n/, $fp->trace(args => [$ENV{ANSIBLE_MODULE}]);
push @modules,'AnsibleModule.pm';
my @packlists = $fp->packlists_containing(\@modules);
my $base = catdir(cwd, 'fatlib');
$fp->packlists_to_tree($base, \@packlists);
my $code=$fp->fatpack_file($ENV{ANSIBLE_MODULE});
$ENV{ANSIBLE_MODULE}=$ENV{ANSIBLE_MODULE}.'.packed';
spurt $code, $ENV{ANSIBLE_MODULE};
chmod 0755, $ENV{ANSIBLE_MODULE};
print "Wrote $ENV{ANSIBLE_MODULE}\n";
exit 0;
}
$ENV{ANSIBLE_ARGS} ||="{}";
my $t=Test::AnsibleModule->new;
my $res=$t->exec_module($ENV{ANSIBLE_MODULE},decode_json($ENV{ANSIBLE_ARGS}));
print "Output from $ENV{ANSIBLE_MODULE}: ". dumper($t->last_response);
print "Response code: $res\n";
=encoding utf8
=head1 NAME
test_ansible_module - Test ansible modules on the command line
=head1 SYNOPSIS
Usage: test_ansible_module -m module_path -a arguments
test_ansible_module -m echo -a hello=world
Options:
-h, Show this help text
-m, --module_path <path> Full path to module to run
-a --args <args> Arguments to pass to module
-c, --check Run module in check mode
-p, --pack Run fatpacker on module
--version Show version information
=head1 SEE ALSO
L<AnsibleModule>
=cut