%PDF- %PDF-
Direktori : /proc/self/root/opt/webdir/bin/ |
Current File : //proc/self/root/opt/webdir/bin/wrapper_ansible_conf |
#!/usr/bin/perl # manage configuration for bitrix pool of servers # create new, add hosts and soo on. Try use -h|--help for detail help message use strict; use warnings; # WebDir methods live here use lib "/opt/webdir/lib"; use Pool; use Host; use SSHAuthUser; use Output; # additional modules use Data::Dumper; use Getopt::Long; use File::Basename qw( dirname basename ); # program options my $prog_name = basename $0; my $prog_dir = dirname $0; # command line options my $o_format = 'plain'; # format of stdout message my $o_help = undef; # print help message my $o_verbose = 0; # enable verbose mode my $o_hostname = undef; # hostname for add|del|view action my $o_ipaddres = undef; # ip address for add|del|viw action my $o_group = undef; # group name for add action on host my $o_action = 'view'; # type of action that script must do. # add - add host to configuration # view - view current config for all host or defined # create - create empty default configuration for father use # key - get /path/to/ssh/key for ssh connections to hosts in pool # pw - password change on remote host for user root # copy - copy sshkey to remote host # timezone- change timezone for servers in the pool # monitor-(enable|disable|status) - enable|disable and get status for monitoring my $o_login = 'root'; # login for ssh connect my $o_oldpass = undef; # current password for user $l_login my $o_newpass = undef; # new password for user $l_login ( usage when password will be change) my $o_sshkey = undef; # ssh key my $o_int = undef; my $o_tz_php = 0; # update timezone for php or not my $o_tz_name = 'Europe/Moscow'; # timezone name my $o_host_id = undef; # host_id, used while updated network settings my $o_update_log = undef; # update log path my $o_bitrix_type = 'general'; my $o_new_hostname = undef; # debug my $cmd_options = join( ' ', @ARGV ); my $cmd_output = Output->new( error => 0, logfile => '/opt/webdir/logs/wrapper.log', ); $cmd_output->log_data("start script with options: $cmd_options"); # get command line options Getopt::Long::Configure("bundling"); my $result_option = GetOptions( 'v' => \$o_verbose, 'verbose' => \$o_verbose, 'h' => \$o_help, 'help' => \$o_help, 'o:s' => \$o_format, 'ouput:s' => \$o_format, 'H:s' => \$o_hostname, 'host:s' => \$o_hostname, 'i:s' => \$o_ipaddres, 'ip:s' => \$o_ipaddres, 'g:s' => \$o_group, 'group:s' => \$o_group, "a:s" => \$o_action, 'action:s' => \$o_action, "u:s" => \$o_login, 'user:s' => \$o_login, "p:s" => \$o_oldpass, 'pass:s' => \$o_oldpass, 'P:s' => \$o_newpass, 'new:s' => \$o_newpass, 'k:s' => \$o_sshkey, 'key:s' => \$o_sshkey, 'I:s' => \$o_int, 'interface:s' => \$o_int, 't:s' => \$o_tz_name, 'timezone:s' => \$o_tz_name, 'php' => \$o_tz_php, 'host_id:s' => \$o_host_id, 'update_log:s' => \$o_update_log, 'bitrix_type:s' => \$o_bitrix_type, 'hostname:s' => \$o_new_hostname, ) or unknown_arg(); # help message if ($o_help) { print_help( $prog_name, 0 ) } # formt output if ( $o_format !~ /^(json|plain|te?xt)$/ ) { print_help( $prog_name, 1 ) } if ( $o_format =~ /^te?xt$/ ) { $o_format = "plain" } # process request ########################## pool configuration my $p = Pool->new( debug => $o_verbose, bitrix_type => $o_bitrix_type, ); my $output; # Pool operations if ( $o_action =~ /^(view|status)$/i ) { $output = $p->get_ansible_data( ($o_hostname) ? $o_hostname : $o_ipaddres ); } elsif ( $o_action eq 'create' ) { $output = $p->create_new_pool( $o_hostname, $o_int, $o_ipaddres ); } elsif ( $o_action eq 'delete_pool' ) { $output = $p->delete_pool(); } elsif ( $o_action eq 'forget_host' ) { $output = $p->forget_host($o_hostname); } elsif ( $o_action eq 'change_hostname' ) { $output = $p->change_hostname( $o_hostname, $o_new_hostname ); } elsif ( $o_action eq 'change_ip' ) { $output = $p->update_network( $o_hostname, $o_ipaddres ); } elsif ( $o_action eq 'update_network' ) { $output = $p->UpdateHostNetwork( $o_host_id, $o_ipaddres ); } elsif ( $o_action eq 'check_network' ) { $output = $p->TestHostNetwork($o_update_log); } elsif ( $o_action eq 'enable_beta_version' ){ $output = $p->beta_version('enable'); } elsif ( $o_action eq 'disable_beta_version' ){ $output = $p->beta_version('disable'); } elsif ( $o_action =~ /^(bx_update|bx_upgrade)$/ ) { $output = $p->update_pool( $o_hostname, $1 ); } elsif ( $o_action =~ /^bx_passwd$/ ) { $output = $p->password_on_server( $o_hostname, $o_login, $o_newpass ); } elsif ( $o_action =~ /^bx_reboot$/ ) { $output = $p->reboot_server($o_hostname); } elsif ( $o_action =~ /^timezone$/ ) { $output = $p->timezone_in_the_pool( $o_tz_name, $o_tz_php ); } elsif ( $o_action =~ /^(sshkey|key)$/ ) { $output = $p->get_ssh_key(); } # Inventory operations elsif ( $o_action =~ /^(bx_php_upgrade|bx_php_upgrade_php56|bx_php_rollback_php7[012]?|bx_php_upgrade_php7[012]?)$/ ) { use bxInventory; my $inventory = bxInventory->new( debug => $o_verbose ); $output = $inventory->update_php($o_action); } elsif ( $o_action =~ /^(bx_upgrade_mysql57)$/ ) { use bxInventory; my $inventory = bxInventory->new( debug => $o_verbose ); $output = $inventory->update_mysql($o_action); # Host operations } elsif ( $o_action eq 'add' ) { # the parameter corresponds to the identifier in the inventory # my $get_host_ident = $self->get_inventory_hostname($host); # return $get_host_ident if ( $get_host_ident->is_error ); # $host_ident = $get_host_ident->data->[1]; my $h = Host->new( host => $o_hostname, ip => $o_ipaddres ); if ( not defined $o_group ) { $output = $h->createHost(); } else { $output = $h->add_to_group($o_group); } } elsif ( $o_action eq 'del' ) { my $get_hi = $p->get_inventory_hostname($o_hostname); if ( $get_hi->is_error ) { $output = $get_hi; } else { my $h = Host->new( host => $get_hi->data->[1] ); if ( not defined $o_group ) { $output = $h->removeHostFromPool(); } else { $output = $h->del_from_group($o_group); } } } elsif ( $o_action eq 'bx_info' ) { my $get_hi = $p->get_inventory_hostname($o_hostname); if ( $get_hi->is_error ) { $output = $get_hi; } else { my $h = Host->new( host => $get_hi->data->[1] ); $output = $h->get_bx_info(); } } elsif ( $o_action eq 'dbs_list' ) { my $get_hi = $p->get_inventory_hostname($o_hostname); if ( $get_hi->is_error ) { $output = $get_hi; } else { my $h = Host->new( host => $get_hi->data->[1] ); $output = $h->get_bx_dbs(); } # SSH options } elsif ( $o_action eq 'copy' ) { if ( !( $o_sshkey && $o_ipaddres && $o_oldpass ) ) { $output = Output->new( error => 1, message => "Mandatory option is missing." ); } else { my $sshAuth = SSHAuthUser->new( sship => $o_ipaddres, sshkey => $o_sshkey, oldpass => $o_oldpass, ); $output = $sshAuth->copy_ssh_key(); } } elsif ( $o_action =~ /^pw$/ ) { if ( !( $o_ipaddres && $o_oldpass && $o_newpass ) ) { $output = Output->new( error => 1, message => "Mandatory option is missing." ); } else { my $sshAuth = SSHAuthUser->new( sship => $o_ipaddres, newpass => $o_newpass, oldpass => $o_oldpass, ); $output = $sshAuth->change_user_pass(); } } else { $output = Output->new( error => 1, message => "Unknown action option. PLease use -h for help message.", ); } $output->print($o_format); exit; # print usage sub print_usage { my $prog = shift; print "Usage: $prog [-vh] [-a add|create|view|copy|pw|monitor] [-i|-ip host_ip -H|--hostname hostname -g|--group group] [ -k path/to/ssh/key ] \n"; } # help message sub print_help { my $prog = shift; my $exit = shift; print_usage($prog); print <<EOT; Options: -h|--help - show this message -v|--verbose - enable verbose mode. -o|--output - define output format, plain or json (default: plain) -i|--ip - add description of host ( group settting by --group option) -H|--host - hostname for human usage ( default: host_ip ) -g|--group - group name ( default: hosts ) -a|--action - add|create|copy|pw|bx_info|bx_update|bx_reboot|dbs_list configuration in for ansible -u|--user - user for ssh connection ( default: root ) -p|--pass - password for ssh connection ( used only for key installation ) -P|--new - new password ( password can|must be changed if password policy demand it) -k|--key - key file for installation -t|--timezone - timezone name (default: Europe/Moscow) --php - update php settings (default: not updated) --host_id - host ID, used when update network settings Ex. * list of hosts and groups in the ansible hosts file $prog -o json * add host vm1 with ip address 192.168.1.125 to config file $prog -a add -i 192.168.1.125 -H vm1 * create default configuration with manager on local host $prog -a create * install ssh key on the server $prog -a copy -i 192.168.1.125 -k /etc/ansible/.ssh/lBNltMqvWJ.bxkey.pub -p password * change password for user on remote host $prog -a pw -i 192.168.1.125 -p oldpassword -P newpassword -o json * update all hosts in the pool $prog -a bx_update -o json * update one host in the pool $prog -a bx_update -H vm1 -o json * status for monitoring in the pool $prog -a monitor-status * reboot server $prog -a bx_reboot -H vm1 -o json * change bitrix password $prog -a bx_passwd -u bitrix -H vm1 -P newpassword -o json * list existen db on host $prog -a dbs_list -H vm1 -o json * server info $prog -a bx_info -H vm1 -o json * set timezone settings for the pool $prog -a timezone -o json --timezone=Europe/Lisbon --php * update host settings by new IP address $prog -a update_network --host_id 1401866581_XXXXXXXX -i 172.17.0.14 * check the log and update the network settings if necessary (this action added to crontab) $prog -a check_network --update_log /opt/webdir/logs/update_pool.log EOT exit; }