——#
# (c) Jean-Marie RENOUARD <jmrenouard@gmail.com>
#
=head1 NAME
Rex::Group::Lookup::DBI - read hostnames and groups from a DBI source
=head1 DESCRIPTION
With this module you can define hostgroups out of an DBI source.
=head1 SYNOPSIS
use Rex::Group::Lookup::DBI;
groups_dbi "dsn", "user", "password", "SQL request";
=head1 EXPORTED FUNCTIONS
=cut
package
Rex::Group::Lookup::DBI;
use
v5.12.5;
use
warnings;
our
$VERSION
=
'1.16.0'
;
# VERSION
use
Rex -base;
use
Carp;
require
Exporter;
use
Rex::Helper::DBI;
@EXPORT
=
qw(groups_dbi)
;
=head2 groups_dbi($dsn, $user, $password, $sql)
With this function you can read groups from DBI source. Example:
groups_dbi( 'DBI:mysql:rex;host=db01',
user => 'username',
password => 'password',
sql => "SELECT * FROM HOST",
create_all_group => TRUE);
=head2 Database sample for MySQL
CREATE TABLE IF NOT EXISTS `HOST` (
`ID` int(11) NOT NULL,
`GROUP` varchar(255) DEFAULT NULL,
`HOST` varchar(255) NOT NULL,
PRIMARY KEY (`ID`)
);
=head2 Data sample for MySQL
INSERT INTO `HOST` (`ID`, `GROUP`, `HOST`) VALUES
(1, 'db', 'db01'),
(2, 'db', 'db02'),
(3, 'was', 'was01'),
(4, 'was', 'was02');
=cut
sub
groups_dbi {
my
(
$dsn
,
%option
) =
@_
;
# $user, $pass, $sql) = @_;
confess
"You have to define the sql."
if
( !
exists
$option
{sql} );
my
$user
=
$option
{user};
my
$pass
=
$option
{password};
my
$sql
=
$option
{sql};
my
$hash
= Rex::Helper::DBI::perform_request(
$dsn
,
$user
,
$pass
,
$sql
);
my
%group
;
my
%all_hosts
;
for
my
$k
(
keys
%{
$hash
} ) {
my
$add
= {};
my
$rex_host
=
Rex::Group::Entry::Server->new(
name
=>
$hash
->{
$k
}->{
'HOST'
}, %{
$add
} );
push
@{
$group
{
$hash
->{
$k
}->{
'GROUP'
} } },
$rex_host
;
$all_hosts
{
$hash
->{
$k
}->{
'HOST'
} } =
$rex_host
;
}
for
my
$g
(
keys
%group
) {
group(
"$g"
=> @{
$group
{
$g
} } );
}
if
(
exists
$option
{create_all_group} &&
$option
{create_all_group} ) {
group(
"all"
,
values
%all_hosts
);
}
}
1;