forked from saratov/infra
159 lines
4.9 KiB
Python
159 lines
4.9 KiB
Python
#!/usr/bin/python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
# (c) 2018, Sergey Bubnov (@homgbebebe) <omg at altlinux.org>
|
|
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
|
|
from __future__ import absolute_import, division, print_function
|
|
__metaclass__ = type
|
|
|
|
|
|
ANSIBLE_METADATA = {'metadata_version': '1.1',
|
|
'status': ['preview'],
|
|
'supported_by': 'community'}
|
|
|
|
|
|
DOCUMENTATION = r'''
|
|
---
|
|
module: proxmox_qemu_agent
|
|
short_description: Execute qemu-agent commands on Qemu(KVM) Virtual Machines in Proxmox VE cluster.
|
|
description:
|
|
- Allows you to execute qemu-agent command on virtual machines
|
|
version_added: "2.6"
|
|
author: "Sergey Bubnov (@homgbebebe) <omg at altlinux.org>"
|
|
options:
|
|
api_host:
|
|
description:
|
|
- Specify the target host of the Proxmox VE cluster.
|
|
required: true
|
|
api_user:
|
|
description:
|
|
- Specify the user to authenticate with.
|
|
required: true
|
|
api_password:
|
|
description:
|
|
- Specify the password to authenticate with.
|
|
- You can use C(PROXMOX_PASSWORD) environment variable.
|
|
name:
|
|
description:
|
|
- Specifies the VM name.
|
|
validate_certs:
|
|
description:
|
|
- If C(no), SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates.
|
|
type: bool
|
|
default: 'no'
|
|
vmid:
|
|
description:
|
|
- Specifies the VM ID. Instead use I(name) parameter.
|
|
requirements: [ "proxmoxer", "requests" ]
|
|
'''
|
|
|
|
EXAMPLES = '''
|
|
# Ping VM via agent interface
|
|
- proxmox_qemu_agent:
|
|
api_user : root@pam
|
|
api_password: secret
|
|
api_host : helldorado
|
|
name : vm1
|
|
commnad : ping
|
|
'''
|
|
|
|
RETURN = '''
|
|
'''
|
|
|
|
import os
|
|
import re
|
|
import time
|
|
import traceback
|
|
|
|
try:
|
|
from proxmoxer import ProxmoxAPI
|
|
HAS_PROXMOXER = True
|
|
except ImportError:
|
|
HAS_PROXMOXER = False
|
|
|
|
from ansible.module_utils.basic import AnsibleModule
|
|
from ansible.module_utils._text import to_native
|
|
|
|
|
|
VZ_TYPE = 'qemu'
|
|
|
|
|
|
def get_vmid(proxmox, name):
|
|
return [vm['vmid'] for vm in proxmox.cluster.resources.get(type='vm') if vm['name'] == name]
|
|
|
|
|
|
def get_vm(proxmox, vmid):
|
|
return [vm for vm in proxmox.cluster.resources.get(type='vm') if vm['vmid'] == int(vmid)]
|
|
|
|
|
|
def agent_command(module, proxmox, vm, vmid, command):
|
|
try:
|
|
r = getattr(proxmox.nodes(vm[0]['node']), VZ_TYPE)(vmid).agent.post(command=command)
|
|
module.exit_json(changed=False, results=r['result'])
|
|
except Exception as e:
|
|
module.fail_json(msg='qemu-agent request failed withexception: %s' % e)
|
|
|
|
|
|
def main():
|
|
module = AnsibleModule(
|
|
argument_spec=dict(
|
|
api_host=dict(required=True),
|
|
api_user=dict(required=True),
|
|
api_password=dict(no_log=True),
|
|
name=dict(type='str'),
|
|
command=dict(default=None, choices=
|
|
['ping', 'get-time', 'info', 'fsfreeze-status', 'fsfreeze-freeze', 'fsfreeze-thaw', 'fstrim'
|
|
,'network-get-interfaces', 'get-vcpus', 'get-fsinfo', 'get-memory-blocks', 'get-memory-block-info'
|
|
,'suspend-hybrid', 'suspend-ram', 'suspend-disk', 'shutdown'
|
|
]),
|
|
validate_certs=dict(type='bool', default='no'),
|
|
vmid=dict(type='int', default=None),
|
|
),
|
|
required_one_of=[('name', 'vmid',)],
|
|
)
|
|
|
|
if not HAS_PROXMOXER:
|
|
module.fail_json(msg='proxmoxer required for this module')
|
|
|
|
api_user = module.params['api_user']
|
|
api_host = module.params['api_host']
|
|
api_password = module.params['api_password']
|
|
command = module.params['command']
|
|
name = module.params['name']
|
|
vmid = module.params['vmid']
|
|
validate_certs = module.params['validate_certs']
|
|
|
|
# If password not set get it from PROXMOX_PASSWORD env
|
|
if not api_password:
|
|
try:
|
|
api_password = os.environ['PROXMOX_PASSWORD']
|
|
except KeyError as e:
|
|
module.fail_json(msg='You should set api_password param or use PROXMOX_PASSWORD environment variable')
|
|
|
|
try:
|
|
proxmox = ProxmoxAPI(api_host, user=api_user, password=api_password, verify_ssl=validate_certs)
|
|
global VZ_TYPE
|
|
global PVE_MAJOR_VERSION
|
|
pve_version = re.sub(r'-\d$', '', proxmox.version.get()['version'])
|
|
PVE_MAJOR_VERSION = 3 if float(pve_version) < 4.0 else int(pve_version.split('.')[0])
|
|
except Exception as e:
|
|
module.fail_json(msg='authorization on proxmox cluster failed with exception: %s' % e)
|
|
|
|
# If vm name is set get the VM id from ProxmoxAPI
|
|
if not vmid:
|
|
try:
|
|
vmid = get_vmid(proxmox, name)[0]
|
|
if vmid:
|
|
vm = get_vm(proxmox, vmid)
|
|
if not vm:
|
|
module.fail_json(msg='VM with vmid = %s does not exist in cluster' % vmid)
|
|
except Exception as e:
|
|
module.fail_json(msg="VM {} does not exist in cluster.".format(clone))
|
|
|
|
agent_command(module, proxmox, vm, vmid, command)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|