212 lines
6.6 KiB
Perl
Executable File
212 lines
6.6 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)) {
|
|
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{tmpip}) {
|
|
if (!$opts{tmpip_skip}) {
|
|
if (!defined $opts{tmpgw}) {
|
|
$opts{tmpgw} = $opts{tmpip};
|
|
$opts{tmpgw} =~ s/\.\d+$/.254/;
|
|
}
|
|
my $cmd = "ansible -i etalon-debian, -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-debian";
|
|
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-debian, -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:
|