#!/usr/bin/perl use strict; use warnings; use utf8; use FindBin; use lib $FindBin::Bin; 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, nouzem => 0, noweb => 0, nomysql => 0, noreboot => 0 ); my $usage = < \$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}, "nouzem" => \$opts{nouzem}, "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 uzem 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: