@ -62,7 +62,7 @@ options:
state :
description :
- If set to C ( present ) , then the DRS rule is created if not present .
- If set to C ( present ) , then the DRS rule is deleted and created if present already .
- If set to C ( present ) , then the DRS rule is already present , it updates to the given configurations .
- If set to C ( absent ) , then the DRS rule is deleted if present .
required : False
default : present
@ -94,11 +94,11 @@ EXAMPLES = r'''
password : " {{ esxi_password }} "
cluster_name : " {{ cluster_name }} "
validate_certs : no
enabled : True
vms :
- vm1
- vm2
drs_rule_name : vm1 - vm2 - affinity - rule - 001
enabled : True
mandatory : True
affinity_rule : False
delegate_to : localhost
@ -169,7 +169,7 @@ class VmwareDrs(PyVmomi):
# Getter
def get_all_vms_info ( self , vms_list = None ) :
"""
Function to g et all VM objects using name from given cluster
G et all VM objects using name from given cluster
Args :
vms_list : List of VM names
@ -192,7 +192,7 @@ class VmwareDrs(PyVmomi):
def get_rule_key_by_name ( self , cluster_obj = None , rule_name = None ) :
"""
Function to g et a specific DRS rule key by name
G et a specific DRS rule key by name
Args :
rule_name : Name of rule
cluster_obj : Cluster managed object
@ -213,7 +213,7 @@ class VmwareDrs(PyVmomi):
@staticmethod
def normalize_rule_spec ( rule_obj = None ) :
"""
Function to r eturn human readable rule spec
R eturn human readable rule spec
Args :
rule_obj : Rule managed object
@ -234,29 +234,26 @@ class VmwareDrs(PyVmomi):
# Create
def create ( self ) :
"""
Function to c reate a DRS rule if rule does not exist
C reate a DRS rule if rule does not exist
"""
rule_obj = self . get_rule_key_by_name ( rule_name = self . rule_name )
if rule_obj is not None :
# Rule already exists, remove and create again
# Cluster does not allow editing existing rule
existing_rule = self . normalize_rule_spec ( rule_obj = rule_obj )
if ( ( sorted ( existing_rule [ ' rule_vms ' ] ) == sorted ( self . vm_list ) ) and
( existing_rule [ ' rule_enabled ' ] == self . enabled ) and
( existing_rule [ ' rule_mandatory ' ] == self . mandatory ) and
( existing_rule [ ' rule_affinity ' ] == self . affinity_rule ) ) :
# Rule is same as existing rule, evacuate
self . module . exit_json ( changed = False , result = existing_rule )
# Delete existing rule as we cannot edit it
changed , result = self . delete ( rule_name = self . rule_name )
if not changed :
self . module . fail_json ( msg = " Failed to delete while updating rule %s due to %s " % ( self . rule_name , result ) )
changed , result = self . create_rule_spec ( )
return changed , result
self . module . exit_json ( changed = False , result = existing_rule , msg = " Rule already exists with the same configuration " )
else :
changed , result = self . update_rule_spec ( rule_obj )
return changed , result
else :
changed , result = self . create_rule_spec ( )
return changed , result
def create_rule_spec ( self ) :
"""
Function to c reate DRS rule
C reate DRS rule
"""
changed = False
if self . affinity_rule :
@ -286,10 +283,41 @@ class VmwareDrs(PyVmomi):
return changed , result
def update_rule_spec ( self , rule_obj = None ) :
"""
Update DRS rule
"""
changed = False
rule_obj . vm = self . vm_obj_list
if ( rule_obj . mandatory != self . mandatory ) :
rule_obj . mandatory = self . mandatory
if ( rule_obj . enabled != self . enabled ) :
rule_obj . enabled = self . enabled
rule_spec = vim . cluster . RuleSpec ( info = rule_obj , operation = ' edit ' )
config_spec = vim . cluster . ConfigSpec ( rulesSpec = [ rule_spec ] )
try :
task = self . cluster_obj . ReconfigureCluster_Task ( config_spec , modify = True )
changed , result = wait_for_task ( task )
except vmodl . fault . InvalidRequest as e :
result = to_native ( e . msg )
except Exception as e :
result = to_native ( e )
if changed :
rule_obj = self . get_rule_key_by_name ( rule_name = self . rule_name )
result = self . normalize_rule_spec ( rule_obj )
return changed , result
# Delete
def delete ( self , rule_name = None ) :
"""
Function to delete DRS rule using name
D elete DRS rule using name
"""
changed = False
if rule_name is None :
@ -326,7 +354,7 @@ def main():
)
required_if = [
[ ' state ' , ' present ' , [ ' vms ' ] ] ,
[ ' state ' , ' present ' , [ ' vms ' ] ]
]
module = AnsibleModule ( argument_spec = argument_spec ,
required_if = required_if ,
@ -347,7 +375,6 @@ def main():
else :
results [ ' failed ' ] = True
results [ ' msg ' ] = " Failed to create DRS rule %s " % vm_drs . rule_name
results [ ' result ' ] = result
elif state == ' absent ' :
# Delete Rule