Add snapshot support for vultr_server (#52781)
This commit is contained in:
parent
3c39fe5871
commit
7bca6a56c9
1 changed files with 33 additions and 5 deletions
|
@ -32,7 +32,11 @@ options:
|
||||||
os:
|
os:
|
||||||
description:
|
description:
|
||||||
- The operating system.
|
- The operating system.
|
||||||
- Required if the server does not yet exist.
|
- Required if the server does not yet exist and is not restoring from a snapshot.
|
||||||
|
snapshot:
|
||||||
|
version_added: "2.8"
|
||||||
|
description:
|
||||||
|
- Name of snapshot to restore server from.
|
||||||
firewall_group:
|
firewall_group:
|
||||||
description:
|
description:
|
||||||
- The firewall group to assign this server to.
|
- The firewall group to assign this server to.
|
||||||
|
@ -379,13 +383,26 @@ class AnsibleVultrServer(Vultr):
|
||||||
)
|
)
|
||||||
|
|
||||||
def get_os(self):
|
def get_os(self):
|
||||||
|
if self.module.params.get('snapshot'):
|
||||||
|
os_name = 'Snapshot'
|
||||||
|
else:
|
||||||
|
os_name = self.module.params.get('os')
|
||||||
|
|
||||||
return self.query_resource_by_key(
|
return self.query_resource_by_key(
|
||||||
key='name',
|
key='name',
|
||||||
value=self.module.params.get('os'),
|
value=os_name,
|
||||||
resource='os',
|
resource='os',
|
||||||
use_cache=True
|
use_cache=True
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def get_snapshot(self):
|
||||||
|
return self.query_resource_by_key(
|
||||||
|
key='description',
|
||||||
|
value=self.module.params.get('snapshot'),
|
||||||
|
resource='snapshot',
|
||||||
|
use_cache=True
|
||||||
|
)
|
||||||
|
|
||||||
def get_ssh_keys(self):
|
def get_ssh_keys(self):
|
||||||
ssh_key_names = self.module.params.get('ssh_keys')
|
ssh_key_names = self.module.params.get('ssh_keys')
|
||||||
if not ssh_key_names:
|
if not ssh_key_names:
|
||||||
|
@ -490,6 +507,11 @@ class AnsibleVultrServer(Vultr):
|
||||||
'plan',
|
'plan',
|
||||||
'region',
|
'region',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
snapshot_restore = self.module.params.get('snapshot') is not None
|
||||||
|
if snapshot_restore:
|
||||||
|
required_params.remove('os')
|
||||||
|
|
||||||
self.module.fail_on_missing_params(required_params=required_params)
|
self.module.fail_on_missing_params(required_params=required_params)
|
||||||
|
|
||||||
self.result['changed'] = True
|
self.result['changed'] = True
|
||||||
|
@ -499,6 +521,7 @@ class AnsibleVultrServer(Vultr):
|
||||||
'VPSPLANID': self.get_plan().get('VPSPLANID'),
|
'VPSPLANID': self.get_plan().get('VPSPLANID'),
|
||||||
'FIREWALLGROUPID': self.get_firewall_group().get('FIREWALLGROUPID'),
|
'FIREWALLGROUPID': self.get_firewall_group().get('FIREWALLGROUPID'),
|
||||||
'OSID': self.get_os().get('OSID'),
|
'OSID': self.get_os().get('OSID'),
|
||||||
|
'SNAPSHOTID': self.get_snapshot().get('SNAPSHOTID'),
|
||||||
'label': self.module.params.get('name'),
|
'label': self.module.params.get('name'),
|
||||||
'hostname': self.module.params.get('hostname'),
|
'hostname': self.module.params.get('hostname'),
|
||||||
'SSHKEYID': ','.join([ssh_key['SSHKEYID'] for ssh_key in self.get_ssh_keys()]),
|
'SSHKEYID': ','.join([ssh_key['SSHKEYID'] for ssh_key in self.get_ssh_keys()]),
|
||||||
|
@ -517,7 +540,7 @@ class AnsibleVultrServer(Vultr):
|
||||||
data=data
|
data=data
|
||||||
)
|
)
|
||||||
server = self._wait_for_state(key='status', state='active')
|
server = self._wait_for_state(key='status', state='active')
|
||||||
server = self._wait_for_state(state='running')
|
server = self._wait_for_state(state='running', timeout=3600 if snapshot_restore else 60)
|
||||||
return server
|
return server
|
||||||
|
|
||||||
def _update_auto_backups_setting(self, server, start_server):
|
def _update_auto_backups_setting(self, server, start_server):
|
||||||
|
@ -640,6 +663,10 @@ class AnsibleVultrServer(Vultr):
|
||||||
return server, warned
|
return server, warned
|
||||||
|
|
||||||
def _update_server(self, server=None, start_server=True):
|
def _update_server(self, server=None, start_server=True):
|
||||||
|
# Wait for server to unlock if restoring
|
||||||
|
if server.get('os').strip() == 'Snapshot':
|
||||||
|
server = self._wait_for_state(key='server_status', state='ok', timeout=3600)
|
||||||
|
|
||||||
# Update auto backups settings, stops server
|
# Update auto backups settings, stops server
|
||||||
server = self._update_auto_backups_setting(server=server, start_server=start_server)
|
server = self._update_auto_backups_setting(server=server, start_server=start_server)
|
||||||
|
|
||||||
|
@ -770,10 +797,10 @@ class AnsibleVultrServer(Vultr):
|
||||||
server = self._wait_for_state(state='running')
|
server = self._wait_for_state(state='running')
|
||||||
return server
|
return server
|
||||||
|
|
||||||
def _wait_for_state(self, key='power_status', state=None):
|
def _wait_for_state(self, key='power_status', state=None, timeout=60):
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
server = self.get_server(refresh=True)
|
server = self.get_server(refresh=True)
|
||||||
for s in range(0, 60):
|
for s in range(0, timeout):
|
||||||
# Check for Truely if wanted state is None
|
# Check for Truely if wanted state is None
|
||||||
if state is None and server.get(key):
|
if state is None and server.get(key):
|
||||||
break
|
break
|
||||||
|
@ -840,6 +867,7 @@ def main():
|
||||||
name=dict(required=True, aliases=['label']),
|
name=dict(required=True, aliases=['label']),
|
||||||
hostname=dict(),
|
hostname=dict(),
|
||||||
os=dict(),
|
os=dict(),
|
||||||
|
snapshot=dict(),
|
||||||
plan=dict(),
|
plan=dict(),
|
||||||
force=dict(type='bool', default=False),
|
force=dict(type='bool', default=False),
|
||||||
notify_activate=dict(type='bool', default=False),
|
notify_activate=dict(type='bool', default=False),
|
||||||
|
|
Loading…
Reference in a new issue