ansible-tools/etalon

216 lines
6.7 KiB
Perl
Executable File

#!/usr/bin/perl
use strict; use warnings; use utf8;
use FindBin;
use lib $FindBin::Bin;
use lib "$FindBin::Bin/../ansible-tools";
binmode STDOUT, ':utf8';
binmode STDERR, ':utf8';
use Getopt::Long qw(:config no_ignore_case bundling);
use siteconf;
my %site_conf = siteconf::read;
my %opts = (
tmpmask => 24,
tmpip_skip => 0,
nodeploy => 0,
netmask => 24,
noweb => 0,
nomysql => 0,
noreboot => 0
);
my $usage = <<EOT;
usage: $0 [OPTIONS..]
--site SITE vmware site (IP, DNS beállítások)
--clone-ip IP friss klón IP címe, default site_conf szerint
--tmpip IP ideiglenes IP cím az etalon készítés idejére
--tmpmask NNN ideiglenes címhez prefix hossz, default: 24
--tmpgw ideiglenes címhez default gw, default: .254
--tmpip-skip egyből az ideiglenes címet használja, nem állítja be
--nodeploy nincs hostnév és IP cím változtatás, vagy:
--hostname HH
--domain DOMAIN default site_conf szerint
--dns DNS[+DNS] default site_conf szerint
--ntp NTPSERVER default site_conf szerint
--ip IP
--netmask NNN lehet prefix-length is (default: 24)
--gw GW default: .254
--datasize NNN /data mérete (`lvcreate -L` kapja) default: 50%FREE
--noweb
--nomysql
--mysql-root PWD mysql root jelszó, default: random
--border PREFIX installálj BORDERt (web + db localhost)
--border-db PREFIX .. de csak az adatbázisát
--border-web PREFIX .. de csak a webes részét
--border-dbpasswd PWD BORDER db jelszó, default: random
--border-web-dbhost HH db szerver hostnév \\_ /etc/hosts-ba kerül
--border-web-dbip HH db szerver IP cím /
--noreboot
EOT
GetOptions(
"site=s" => \$opts{site},
"clone-ip=s" => \$opts{clone_ip},
"tmpip=s" => \$opts{tmpip},
"tmpmask=s" => \$opts{tmpmask},
"tmpgw=s" => \$opts{tmpgw},
"tmpip-skip" => \$opts{tmpip_skip},
"nodeploy" => \$opts{nodeploy},
"hostname=s" => \$opts{hostname},
"domain=s" => \$opts{domain},
"dns=s" => \$opts{dns},
"ntp=s" => \$opts{ntp},
"ip=s" => \$opts{ip},
"netmask=s" => \$opts{netmask},
"gw=s" => \$opts{gw},
"datasize=s" => \$opts{datasize},
"noweb" => \$opts{noweb},
"nomysql" => \$opts{nomysql},
"mysql-root=s" => \$opts{mysql_root},
"border=s" => \$opts{border},
"border-db=s" => \$opts{border_db},
"border-web=s" => \$opts{border_web},
"border-web-dbhost=s" => \$opts{border_web_dbhost},
"border-web-dbip=s" => \$opts{border_web_dbip},
"border-dbpasswd=s" => \$opts{border_dbpasswd},
"noreboot" => \$opts{noreboot},
"help|h" => sub {print $usage; exit 0}
) or die $usage;
if (!defined $opts{site}) {
die "Kell --site.\n";
}
if (!exists $site_conf{$opts{site}}) {
die "site not found: $opts{site}\n";
}
for my $o (qw(dns ntp domain clone_ip mgmt_ssh_key postfix_relayhost rhsm_user rhsm_passwd)) {
if (!defined $opts{$o}) {
$opts{$o} = $site_conf{$opts{site}}->{$o};
}
}
chdir("$FindBin::Bin/..") or die "chdir() failed.\n";
my @vars;
my @skip;
if ($site_conf{$opts{site}}->{aptproxy}) {
push @vars, "aptproxy=$site_conf{$opts{site}}->{aptproxy}";
}
my $border_opts = 0;
for my $x ($opts{border}, $opts{border_web}, $opts{border_db}) {
$border_opts++ if $x;
}
die "Csak egy --border... opciót lehet egyszerre megadni\n" if $border_opts > 1;
if ($opts{border}) {
if ($opts{noweb} or $opts{nomysql}) {
die "--border opcióhoz kell web és mysql.\n";
}
push @vars, "border_prefix=$opts{border}";
} elsif ($opts{border_web}) {
die "Kell web.\n" if $opts{noweb};
die "Kell --mysql-root.\n" if !defined $opts{mysql_root};
die "Kell dbhost.\n" if !defined $opts{border_web_dbhost};
die "Kell dbip.\n" if !defined $opts{border_web_dbip};
die "Kell dbpasswd.\n" if !defined $opts{border_dbpasswd};
push @vars, "border_prefix=$opts{border_web}";
push @vars, "border_install_webonly=1";
push @vars, "border_dbhost=$opts{border_web_dbhost}";
push @vars, "border_dbip=$opts{border_web_dbip}";
} elsif ($opts{border_db}) {
die "Kell mysql.\n" if $opts{nomysql};
die "Kell --mysql-root.\n" if !defined $opts{mysql_root};
die "Kell dbpasswd.\n" if !defined $opts{border_dbpasswd};
push @vars, "border_prefix=$opts{border_db}";
push @vars, "border_install_dbonly=1";
} else {
push @skip, 'border';
}
if (!$opts{nodeploy}) {
die "Missing --hostname.\n" if !defined $opts{hostname};
die "Missing --ip.\n" if !defined $opts{ip};
if (!defined $opts{gw}) {
$opts{gw} = $opts{ip};
$opts{gw} =~ s/\.\d+$/.254/;
}
for my $x (qw(hostname domain dns ntp ip netmask gw)) {
push @vars, "$x=$opts{$x}";
}
}
if ($opts{datasize}) {
push @vars, "datasize=$opts{datasize}";
}
if ($opts{mysql_root}) {
push @vars, "mysql_root=$opts{mysql_root}";
}
if ($opts{border_dbpasswd}) {
push @vars, "border_dbpasswd=$opts{border_dbpasswd}";
}
if ($opts{postfix_relayhost}) {
push @vars, "postfix_relayhost=$opts{postfix_relayhost}";
}
if ($opts{rhsm_user} and $opts{rhsm_passwd}) {
push @vars, "rhsm_user=$opts{rhsm_user}";
push @vars, "rhsm_passwd=$opts{rhsm_passwd}";
}
if ($opts{tmpip}) {
if (!$opts{tmpip_skip}) {
if (!defined $opts{tmpgw}) {
$opts{tmpgw} = $opts{tmpip};
$opts{tmpgw} =~ s/\.\d+$/.254/;
}
my $cmd = "ansible -i etalon, -e ansible_host=$opts{clone_ip} ".
"-u root -B 30 -P 0 -m shell -a '".
"sleep 3; DEV=\$(cd /sys/class/net; \\ls -1d e* | head -1);".
"ip a flu dev \$DEV; ".
"ip a add $opts{tmpip}/$opts{tmpmask} dev \$DEV; ".
"ip r add default via $opts{tmpgw}; ".
"ping -c 3 $opts{tmpgw}".
"' etalon";
print "$cmd\n";
system $cmd;
exit 1 if $? > 0;
print "New IP address: $opts{tmpip}.\n";
sleep 5;
}
push @vars, "ansible_host=$opts{tmpip}";
}
my $vars = '';
for my $v (@vars) {
if ($v =~ /[\s'"]/) {
die "invalid character: '$v'.\n";
}
$vars .= " -e '$v'";
}
if ($opts{mgmt_ssh_key}) {
# szokoz van benne: -e 'aaa="bb cc"'
$vars .= " -e 'mgmt_ssh_key=\"$opts{mgmt_ssh_key}\"'";
}
for my $x (qw(deploy web mysql reboot)) {
push @skip, $x if $opts{"no$x"};
}
my $skip = '';
if (scalar @skip) {
$skip = "--skip-tags=". join(',', @skip);
}
my $cmd = "ansible-playbook -i etalon, -e ansible_host=$opts{clone_ip} $skip $vars etalon.yml";
print "$cmd\n";
system $cmd;
exit 1 if $? > 0;
if (!$opts{nodeploy}) {
print "\nadd to inventory:\n\n".
"echo '$opts{hostname} $opts{ip}' >> inventory\n\n";
}
# vim: set tabstop=4 shiftwidth=4 expandtab smarttab: