b39aed8736
Much like we currently have *setup* register the variable `module_setup`, we would like other facts-modules register their own namespace. This means that: - *network_facts* registers `module_network` - *hpilo_facts* registers `module_hw` - *vsphere_facts* registers `module_hw` In retrospect, it would have made more sense to have `setup` register `module_ansible` instead as the setup module uses the `ansible_` namesepace. Having the `module_` namespace allows us to check whether a certain namespace has already been loaded so we can avoid running the facts module a second time using only_if. ```yaml - action: network_facts host=${ansible_hostname_short} only_if: is_unset('$module_network') ```
139 lines
4.5 KiB
Python
Executable file
139 lines
4.5 KiB
Python
Executable file
#!/usr/bin/python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
# Copyright 2012 Dag Wieers <dag@wieers.com>
|
|
#
|
|
# This file is part of Ansible
|
|
#
|
|
# Ansible is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# Ansible is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
DOCUMENTATION = '''
|
|
---
|
|
author: Dag Wieers
|
|
module: vsphere_facts
|
|
short_description: Gather facts for a guest on VMWare vSphere
|
|
description:
|
|
- This module gathers facts for a specific guest on VMWare vSphere.
|
|
These facts include hardware and network related information useful
|
|
for provisioning (e.g. macaddress, uuid).
|
|
- This module requires the pysphere python module.
|
|
version_added: "0.8"
|
|
options:
|
|
host:
|
|
description:
|
|
- The vSphere server from the cluster the virtual server is located on.
|
|
required: true
|
|
login:
|
|
description:
|
|
- The login name to authenticate on the vSphere cluster.
|
|
required: true
|
|
password:
|
|
description:
|
|
- The password to authenticate on the vSphere cluster.
|
|
required: true
|
|
guest:
|
|
description:
|
|
- The virtual server to gather facts for on the vSphere cluster.
|
|
required: true
|
|
examples:
|
|
- code: |
|
|
local_action: vsphere_facts host=$esxserver login=$esxlogin password=$esxpassword guest=$inventory_hostname_short
|
|
only_if: "'$cmdb_hwmodel'.startswith('VMWare ')
|
|
description: Task to gather facts from a vSphere cluster only if the system is a VMWare guest
|
|
- code:
|
|
- hw_eth0:
|
|
- addresstype: "assigned"
|
|
label: "Network adapter 1"
|
|
macaddress: "00:11:22:33:44:55"
|
|
macaddress_dash: "00-11-22-33-44-55"
|
|
summary: "VLAN-321"
|
|
hw_guest_full_name: "Red Hat Enterprise Linux 6 (64-bit)"
|
|
hw_guest_id: "rhel6_64Guest"
|
|
hw_memtotal_mb: 2048
|
|
hw_name: "centos6"
|
|
hw_processor_count: 1
|
|
hw_product_uuid: "ef50bac8-2845-40ff-81d9-675315501dac"
|
|
description: Typical output of a vsphere_facts run on a guest
|
|
notes:
|
|
- This module ought to be run from a system that can access vSphere directly.
|
|
Either by using C(local_action), or C(using delegate)_to.
|
|
'''
|
|
|
|
import sys
|
|
try:
|
|
import pysphere
|
|
except ImportError:
|
|
print "failed=True msg='pysphere python module unavailable'"
|
|
sys.exit(1)
|
|
|
|
def main():
|
|
|
|
module = AnsibleModule(
|
|
argument_spec = dict(
|
|
host = dict(required=True),
|
|
login = dict(required=True),
|
|
password = dict(required=True),
|
|
guest = dict(required=True, aliases=['name']),
|
|
)
|
|
)
|
|
|
|
host = module.params['host']
|
|
login = module.params['login']
|
|
password = module.params['password']
|
|
guest = module.params['guest']
|
|
|
|
server = pysphere.VIServer()
|
|
try:
|
|
# server.connect(host, login, password, trace_file='debug.txt')
|
|
server.connect(host, login, password)
|
|
except Exception, e:
|
|
module.fail_json(rc=1, msg='Failed to connect to %s: %s' % (host, e))
|
|
|
|
try:
|
|
vm = server.get_vm_by_name(guest)
|
|
except pysphere.resources.vi_exception.VIException, e:
|
|
module.fail_json(rc=2, msg=e.message)
|
|
|
|
data = vm.get_properties()
|
|
facts = {
|
|
'module_hw': True,
|
|
'hw_name': vm.properties.name,
|
|
'hw_guest_full_name': vm.properties.config.guestFullName,
|
|
'hw_guest_id': vm.properties.config.guestId,
|
|
'hw_product_uuid': vm.properties.config.uuid,
|
|
'hw_processor_count': vm.properties.config.hardware.numCPU,
|
|
'hw_memtotal_mb': vm.properties.config.hardware.memoryMB,
|
|
}
|
|
|
|
ifidx = 0
|
|
for entry in vm.properties.config.hardware.device:
|
|
|
|
if not hasattr(entry, 'macAddress'): continue
|
|
|
|
factname = 'hw_eth' + str(ifidx)
|
|
facts[factname] = {
|
|
'addresstype': entry.addressType,
|
|
'label': entry.deviceInfo.label,
|
|
'macaddress': entry.macAddress,
|
|
'macaddress_dash': entry.macAddress.replace(':', '-'),
|
|
'summary': entry.deviceInfo.summary,
|
|
}
|
|
|
|
ifidx += 1
|
|
|
|
module.exit_json(ansible_facts=facts)
|
|
|
|
# this is magic, see lib/ansible/module_common.py
|
|
#<<INCLUDE_ANSIBLE_MODULE_COMMON>>
|
|
main()
|