From 831cb45d1a29e49d195f1a209c62f89a5f9b5390 Mon Sep 17 00:00:00 2001 From: Rottler Tamas Date: Sat, 22 Mar 2025 14:02:54 +0100 Subject: [PATCH] Etalon atnevezes, snapshot create/remove --- etalon | 12 +++-- vmw_snapshot_create | 103 +++++++++++++++++++++++++++++++++++++++ vmw_snapshot_remove | 114 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 225 insertions(+), 4 deletions(-) create mode 100755 vmw_snapshot_create create mode 100755 vmw_snapshot_remove diff --git a/etalon b/etalon index b69cdea..7307881 100755 --- a/etalon +++ b/etalon @@ -83,7 +83,7 @@ if (!defined $opts{site}) { 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)) { +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}; } @@ -152,6 +152,10 @@ if ($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}) { @@ -159,14 +163,14 @@ if ($opts{tmpip}) { $opts{tmpgw} = $opts{tmpip}; $opts{tmpgw} =~ s/\.\d+$/.254/; } - my $cmd = "ansible -i etalon-debian, -e ansible_host=$opts{clone_ip} ". + 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-debian"; + "' etalon"; print "$cmd\n"; system $cmd; exit 1 if $? > 0; @@ -197,7 +201,7 @@ 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"; +my $cmd = "ansible-playbook -i etalon, -e ansible_host=$opts{clone_ip} $skip $vars etalon.yml"; print "$cmd\n"; system $cmd; diff --git a/vmw_snapshot_create b/vmw_snapshot_create new file mode 100755 index 0000000..3b60fad --- /dev/null +++ b/vmw_snapshot_create @@ -0,0 +1,103 @@ +#!/usr/bin/env python3 +from pyVmomi import vim +import pyVim.connect +import atexit +import argparse +from pprint import pprint +import sys +import siteconf + +site_conf = siteconf.read() + + +def get_args(): + parser = argparse.ArgumentParser( + description='Creates a vm snapshot.') + + parser.add_argument('-s', '--site', + required=True, + action='store', + help='name of the site to connect to') + + parser.add_argument('-v', '--vm', + required=True, + action='store', + help='vm to create snapshot of') + + parser.add_argument('-n', '--snapshotname', + required=True, + action='store', + help='snapshot name') + + args = parser.parse_args() + return args + +def get_obj(content, vimtype, name): + """ + Return an object by name, if name is None the + first found object is returned + """ + obj = None + container = content.viewManager.CreateContainerView( + content.rootFolder, vimtype, True) + for c in container.view: + if name: + if c.name == name: + obj = c + break + else: + obj = c + break + return obj + + +def wait_for_task(task): + """ wait for a vCenter task to finish """ + task_done = False + while not task_done: + if task.info.state == 'success': + return task.info.result + + if task.info.state == 'error': + print("there was an error") + task_done = True + + +def main(): + args = get_args() + + if not args.site in site_conf: + print(f"site not found: {args.site}") + exit(1) + host = site_conf[args.site]['vcenter'] + user = site_conf[args.site]['vcenter_user'] + passwd = site_conf[args.site]['vcenter_passwd'] + + + si = pyVim.connect.SmartConnect( + host = host, + user = user, + pwd = passwd, + disableSslCertValidation = True + ) + atexit.register(pyVim.connect.Disconnect, si) + content = si.RetrieveContent() + + vm = get_obj(content, [vim.VirtualMachine], args.vm) + if not vm: + print("vm not found") + exit(1) + + description = 'vmw_snapshot_create' + dump_memory = True + quiesce = False + + wait_for_task(vm.CreateSnapshot( + args.snapshotname, description, dump_memory, quiesce + )) + + +if __name__ == "__main__": + main() + +# vim: set tabstop=4 shiftwidth=4 expandtab smarttab: diff --git a/vmw_snapshot_remove b/vmw_snapshot_remove new file mode 100755 index 0000000..d67d421 --- /dev/null +++ b/vmw_snapshot_remove @@ -0,0 +1,114 @@ +#!/usr/bin/env python3 +from pyVmomi import vim +import pyVim.connect +import atexit +import argparse +from pprint import pprint +import sys +import siteconf + +site_conf = siteconf.read() + + +def get_args(): + parser = argparse.ArgumentParser( + description='Deletes a vm snapshot.') + + parser.add_argument('-s', '--site', + required=True, + action='store', + help='name of the site to connect to') + + parser.add_argument('-v', '--vm', + required=True, + action='store', + help='vm to delete snapshot from') + + parser.add_argument('-n', '--snapshotname', + required=True, + action='store', + help='snapshot name') + + args = parser.parse_args() + return args + +def get_obj(content, vimtype, name): + """ + Return an object by name, if name is None the + first found object is returned + """ + obj = None + container = content.viewManager.CreateContainerView( + content.rootFolder, vimtype, True) + for c in container.view: + if name: + if c.name == name: + obj = c + break + else: + obj = c + break + return obj + + +def wait_for_task(task): + """ wait for a vCenter task to finish """ + task_done = False + while not task_done: + if task.info.state == 'success': + return task.info.result + + if task.info.state == 'error': + print("there was an error") + task_done = True + + +def find_snapshots(snapshots, name): + snap_obj = [] + for snapshot in snapshots: + if snapshot.name == name: + snap_obj.append(snapshot) + snap_obj = snap_obj + find_snapshots( + snapshot.childSnapshotList, name) + return snap_obj + + +def main(): + args = get_args() + + if not args.site in site_conf: + print(f"site not found: {args.site}") + exit(1) + host = site_conf[args.site]['vcenter'] + user = site_conf[args.site]['vcenter_user'] + passwd = site_conf[args.site]['vcenter_passwd'] + + + si = pyVim.connect.SmartConnect( + host = host, + user = user, + pwd = passwd, + disableSslCertValidation = True + ) + atexit.register(pyVim.connect.Disconnect, si) + content = si.RetrieveContent() + + vm = get_obj(content, [vim.VirtualMachine], args.vm) + if vm == None: + print("vm not found: "+ args.vm) + exit(1) + if vm.snapshot is None: + print("vm has no snapshots: "+ args.vm) + exit(1) + snaplist = find_snapshots(vm.snapshot.rootSnapshotList, args.snapshotname) + for s in snaplist: + print(f"removing {args.vm} snapshot {s.name} ({s.createTime})") + remove_children = False + consolidate = True + wait_for_task(s.snapshot.RemoveSnapshot_Task(remove_children, consolidate)) + + +if __name__ == "__main__": + main() + +# vim: set tabstop=4 shiftwidth=4 expandtab smarttab: