@ -49,101 +49,95 @@ options:
description :
description :
- BIG - IP username
- BIG - IP username
required : true
required : true
default : null
choices : [ ]
aliases : [ ]
password :
password :
description :
description :
- BIG - IP password
- BIG - IP password
required : true
required : true
default : null
choices : [ ]
aliases : [ ]
validate_certs :
validate_certs :
description :
description :
- If C ( no ) , SSL certificates will not be validated . This should only be used
- If C ( no ) , SSL certificates will not be validated . This should only be used
on personally controlled sites using self - signed certificates .
on personally controlled sites using self - signed certificates .
required : false
required : false
default : ' yes '
default : ' yes '
choices : [ ' yes ' , ' no ' ]
choices :
version_added : 2.0
- yes
- no
state :
state :
description :
description :
- Virtual Server state
- Virtual Server state
- Absent , delete the VS if present
- Absent , delete the VS if present
- present ( and its synonym enabled ) , create if needed the VS and set state to enabled
- C ( present ) ( and its synonym enabled ) , create if needed the VS and set
- disabled , create if needed the VS and set state to disabled
state to enabled
- C ( disabled ) , create if needed the VS and set state to disabled
required : false
required : false
default : present
default : present
choices : [ ' present ' , ' absent ' , ' enabled ' , ' disabled ' ]
choices :
- present
- absent
- enabled
- disabled
aliases : [ ]
aliases : [ ]
partition :
partition :
description :
description :
- Partition
- Partition
required : false
required : false
default : ' Common '
default : ' Common '
choices : [ ]
aliases : [ ]
name :
name :
description :
description :
- " Virtual server name. "
- Virtual server name
required : true
required : true
aliases : [ ' vs ' ]
aliases :
- vs
destination :
destination :
description :
description :
- " Destination IP of the virtual server (only host is currently supported) . Required when state=present and vs does not exist. "
- Destination IP of the virtual server ( only host is currently supported ) .
Required when state = present and vs does not exist .
required : true
required : true
default : null
aliases :
choices : [ ]
- address
aliases : [ ' address ' , ' ip ' ]
- ip
port :
port :
description :
description :
- " Port of the virtual server . Required when state=present and vs does not exist "
- Port of the virtual server . Required when state = present and vs does not exist
required : false
required : false
default : None
default : None
all_profiles :
all_profiles :
description :
description :
- " List of all Profiles (HTTP,ClientSSL,ServerSSL,etc) that must be used by the virtual server "
- List of all Profiles ( HTTP , ClientSSL , ServerSSL , etc ) that must be used
by the virtual server
required : false
required : false
default : None
default : None
all_rules :
all_rules :
version_added : " 2.2 "
version_added : " 2.2 "
description :
description :
- " List of rules to be applied in priority order "
- List of rules to be applied in priority order
required : false
required : false
default : None
default : None
pool :
pool :
description :
description :
- " Default pool for the virtual server "
- Default pool for the virtual server
required : false
required : false
default : None
default : None
snat :
snat :
description :
description :
- " Source network address policy "
- Source network address policy
required : false
required : false
default : None
default : None
default_persistence_profile :
default_persistence_profile :
description :
description :
- " Default Profile which manages the session persistence "
- Default Profile which manages the session persistence
required : false
required : false
default : None
default : None
description :
description :
description :
description :
- " Virtual server description. "
- Virtual server description
required : false
required : false
default : None
default : None
'''
'''
EXAMPLES = '''
EXAMPLES = '''
- name : Add virtual server
## playbook task examples:
bigip_virtual_server :
- - -
# file bigip-test.yml
# ...
- name : Add VS
local_action :
module : bigip_virtual_server
server : lb . mydomain . net
server : lb . mydomain . net
user : admin
user : admin
password : secret
password : secret
@ -158,10 +152,10 @@ EXAMPLES = '''
all_profiles :
all_profiles :
- http
- http
- clientssl
- clientssl
delegate_to : localhost
- name : Modify Port of the Virtual Server
- name : Modify Port of the Virtual Server
local_action :
bigip_virtual_server :
module : bigip_virtual_server
server : lb . mydomain . net
server : lb . mydomain . net
user : admin
user : admin
password : secret
password : secret
@ -169,37 +163,41 @@ EXAMPLES = '''
partition : MyPartition
partition : MyPartition
name : myvirtualserver
name : myvirtualserver
port : 8080
port : 8080
delegate_to : localhost
- name : Delete virtual server
- name : Delete virtual server
local_action :
bigip_virtual_server :
module : bigip_virtual_server
server : lb . mydomain . net
server : lb . mydomain . net
user : admin
user : admin
password : secret
password : secret
state : absent
state : absent
partition : MyPartition
partition : MyPartition
name : myvirtualserver
name : myvirtualserver
delegate_to : localhost
'''
'''
RETURN = '''
RETURN = '''
- - -
- - -
deleted :
deleted :
description : Name of a virtual server that was deleted
description : Name of a virtual server that was deleted
returned : virtual server was successfully deleted on state = absent
returned : changed
type : string
type : string
sample : " my-virtual-server "
'''
'''
# ==========================
# bigip_virtual_server module specific
#
# map of state values
# map of state values
STATES = { ' enabled ' : ' STATE_ENABLED ' ,
STATES = {
' disabled ' : ' STATE_DISABLED ' }
' enabled ' : ' STATE_ENABLED ' ,
STATUSES = { ' enabled ' : ' SESSION_STATUS_ENABLED ' ,
' disabled ' : ' STATE_DISABLED '
}
STATUSES = {
' enabled ' : ' SESSION_STATUS_ENABLED ' ,
' disabled ' : ' SESSION_STATUS_DISABLED ' ,
' disabled ' : ' SESSION_STATUS_DISABLED ' ,
' offline ' : ' SESSION_STATUS_FORCED_DISABLED ' }
' offline ' : ' SESSION_STATUS_FORCED_DISABLED '
}
def vs_exists ( api , vs ) :
def vs_exists ( api , vs ) :
# hack to determine if pool exists
# hack to determine if pool exists
@ -207,7 +205,7 @@ def vs_exists(api, vs):
try :
try :
api . LocalLB . VirtualServer . get_object_status ( virtual_servers = [ vs ] )
api . LocalLB . VirtualServer . get_object_status ( virtual_servers = [ vs ] )
result = True
result = True
except bigsuds . OperationFailed , e :
except bigsuds . OperationFailed as e :
if " was not found " in str ( e ) :
if " was not found " in str ( e ) :
result = False
result = False
else :
else :
@ -215,6 +213,7 @@ def vs_exists(api, vs):
raise
raise
return result
return result
def vs_create ( api , name , destination , port , pool ) :
def vs_create ( api , name , destination , port , pool ) :
_profiles = [ [ { ' profile_context ' : ' PROFILE_CONTEXT_TYPE_ALL ' , ' profile_name ' : ' tcp ' } ] ]
_profiles = [ [ { ' profile_context ' : ' PROFILE_CONTEXT_TYPE_ALL ' , ' profile_name ' : ' tcp ' } ] ]
created = False
created = False
@ -231,16 +230,21 @@ def vs_create(api,name,destination,port,pool):
profiles = _profiles )
profiles = _profiles )
created = True
created = True
return created
return created
except bigsuds . OperationFailed , e :
except bigsuds . OperationFailed as e :
if " already exists " not in str ( e ) :
if " already exists " not in str ( e ) :
raise Exception ( ' Error on creating Virtual Server : %s ' % e )
raise Exception ( ' Error on creating Virtual Server : %s ' % e )
def vs_remove ( api , name ) :
def vs_remove ( api , name ) :
api . LocalLB . VirtualServer . delete_virtual_server ( virtual_servers = [ name ] )
api . LocalLB . VirtualServer . delete_virtual_server (
virtual_servers = [ name ]
)
def get_rules ( api , name ) :
def get_rules ( api , name ) :
return api . LocalLB . VirtualServer . get_rule ( virtual_servers = [ name ] ) [ 0 ]
return api . LocalLB . VirtualServer . get_rule (
virtual_servers = [ name ]
) [ 0 ]
def set_rules ( api , name , rules_list ) :
def set_rules ( api , name , rules_list ) :
@ -259,17 +263,26 @@ def set_rules(api,name,rules_list):
if ( i , x ) not in rules_list :
if ( i , x ) not in rules_list :
to_del_rules . append ( { ' priority ' : i , ' rule_name ' : x } )
to_del_rules . append ( { ' priority ' : i , ' rule_name ' : x } )
if len ( to_del_rules ) > 0 :
if len ( to_del_rules ) > 0 :
api . LocalLB . VirtualServer . remove_rule ( virtual_servers = [ name ] , rules = [ to_del_rules ] )
api . LocalLB . VirtualServer . remove_rule (
virtual_servers = [ name ] ,
rules = [ to_del_rules ]
)
updated = True
updated = True
if len ( to_add_rules ) > 0 :
if len ( to_add_rules ) > 0 :
api . LocalLB . VirtualServer . add_rule ( virtual_servers = [ name ] , rules = [ to_add_rules ] )
api . LocalLB . VirtualServer . add_rule (
virtual_servers = [ name ] ,
rules = [ to_add_rules ]
)
updated = True
updated = True
return updated
return updated
except bigsuds . OperationFailed , e :
except bigsuds . OperationFailed as e :
raise Exception ( ' Error on setting profiles : %s ' % e )
raise Exception ( ' Error on setting profiles : %s ' % e )
def get_profiles ( api , name ) :
def get_profiles ( api , name ) :
return api . LocalLB . VirtualServer . get_profile ( virtual_servers = [ name ] ) [ 0 ]
return api . LocalLB . VirtualServer . get_profile (
virtual_servers = [ name ]
) [ 0 ]
def set_profiles ( api , name , profiles_list ) :
def set_profiles ( api , name , profiles_list ) :
@ -287,15 +300,22 @@ def set_profiles(api,name,profiles_list):
if ( x not in profiles_list ) and ( x != " /Common/tcp " ) :
if ( x not in profiles_list ) and ( x != " /Common/tcp " ) :
to_del_profiles . append ( { ' profile_context ' : ' PROFILE_CONTEXT_TYPE_ALL ' , ' profile_name ' : x } )
to_del_profiles . append ( { ' profile_context ' : ' PROFILE_CONTEXT_TYPE_ALL ' , ' profile_name ' : x } )
if len ( to_del_profiles ) > 0 :
if len ( to_del_profiles ) > 0 :
api . LocalLB . VirtualServer . remove_profile ( virtual_servers = [ name ] , profiles = [ to_del_profiles ] )
api . LocalLB . VirtualServer . remove_profile (
virtual_servers = [ name ] ,
profiles = [ to_del_profiles ]
)
updated = True
updated = True
if len ( to_add_profiles ) > 0 :
if len ( to_add_profiles ) > 0 :
api . LocalLB . VirtualServer . add_profile ( virtual_servers = [ name ] , profiles = [ to_add_profiles ] )
api . LocalLB . VirtualServer . add_profile (
virtual_servers = [ name ] ,
profiles = [ to_add_profiles ]
)
updated = True
updated = True
return updated
return updated
except bigsuds . OperationFailed , e :
except bigsuds . OperationFailed as e :
raise Exception ( ' Error on setting profiles : %s ' % e )
raise Exception ( ' Error on setting profiles : %s ' % e )
def set_snat ( api , name , snat ) :
def set_snat ( api , name , snat ) :
updated = False
updated = False
try :
try :
@ -303,46 +323,65 @@ def set_snat(api,name,snat):
if snat is None :
if snat is None :
return updated
return updated
elif snat == ' None ' and current_state != ' SRC_TRANS_NONE ' :
elif snat == ' None ' and current_state != ' SRC_TRANS_NONE ' :
api . LocalLB . VirtualServer . set_source_address_translation_none ( virtual_servers = [ name ] )
api . LocalLB . VirtualServer . set_source_address_translation_none (
virtual_servers = [ name ]
)
updated = True
updated = True
elif snat == ' Automap ' and current_state != ' SRC_TRANS_AUTOMAP ' :
elif snat == ' Automap ' and current_state != ' SRC_TRANS_AUTOMAP ' :
api . LocalLB . VirtualServer . set_source_address_translation_automap ( virtual_servers = [ name ] )
api . LocalLB . VirtualServer . set_source_address_translation_automap (
virtual_servers = [ name ]
)
updated = True
updated = True
return updated
return updated
except bigsuds . OperationFailed , e :
except bigsuds . OperationFailed as e :
raise Exception ( ' Error on setting snat : %s ' % e )
raise Exception ( ' Error on setting snat : %s ' % e )
def get_snat_type ( api , name ) :
def get_snat_type ( api , name ) :
return api . LocalLB . VirtualServer . get_source_address_translation_type ( virtual_servers = [ name ] ) [ 0 ]
return api . LocalLB . VirtualServer . get_source_address_translation_type (
virtual_servers = [ name ]
) [ 0 ]
def get_pool ( api , name ) :
def get_pool ( api , name ) :
return api . LocalLB . VirtualServer . get_default_pool_name ( virtual_servers = [ name ] ) [ 0 ]
return api . LocalLB . VirtualServer . get_default_pool_name (
virtual_servers = [ name ]
) [ 0 ]
def set_pool ( api , name , pool ) :
def set_pool ( api , name , pool ) :
updated = False
updated = False
try :
try :
current_pool = get_pool ( api , name )
current_pool = get_pool ( api , name )
if pool is not None and ( pool != current_pool ) :
if pool is not None and ( pool != current_pool ) :
api . LocalLB . VirtualServer . set_default_pool_name ( virtual_servers = [ name ] , default_pools = [ pool ] )
api . LocalLB . VirtualServer . set_default_pool_name (
virtual_servers = [ name ] ,
default_pools = [ pool ]
)
updated = True
updated = True
return updated
return updated
except bigsuds . OperationFailed , e :
except bigsuds . OperationFailed as e :
raise Exception ( ' Error on setting pool : %s ' % e )
raise Exception ( ' Error on setting pool : %s ' % e )
def get_destination ( api , name ) :
def get_destination ( api , name ) :
return api . LocalLB . VirtualServer . get_destination_v2 ( virtual_servers = [ name ] ) [ 0 ]
return api . LocalLB . VirtualServer . get_destination_v2 (
virtual_servers = [ name ]
) [ 0 ]
def set_destination ( api , name , destination ) :
def set_destination ( api , name , destination ) :
updated = False
updated = False
try :
try :
current_destination = get_destination ( api , name )
current_destination = get_destination ( api , name )
if destination is not None and destination != current_destination [ ' address ' ] :
if destination is not None and destination != current_destination [ ' address ' ] :
api . LocalLB . VirtualServer . set_destination_v2 ( virtual_servers = [ name ] , destinations = [ { ' address ' : destination , ' port ' : current_destination [ ' port ' ] } ] )
api . LocalLB . VirtualServer . set_destination_v2 (
virtual_servers = [ name ] ,
destinations = [ { ' address ' : destination , ' port ' : current_destination [ ' port ' ] } ]
)
updated = True
updated = True
return updated
return updated
except bigsuds . OperationFailed , e :
except bigsuds . OperationFailed as e :
raise Exception ( ' Error on setting destination : %s ' % e )
raise Exception ( ' Error on setting destination : %s ' % e )
@ -351,14 +390,21 @@ def set_port(api,name,port):
try :
try :
current_destination = get_destination ( api , name )
current_destination = get_destination ( api , name )
if port is not None and port != current_destination [ ' port ' ] :
if port is not None and port != current_destination [ ' port ' ] :
api . LocalLB . VirtualServer . set_destination_v2 ( virtual_servers = [ name ] , destinations = [ { ' address ' : current_destination [ ' address ' ] , ' port ' : port } ] )
api . LocalLB . VirtualServer . set_destination_v2 (
virtual_servers = [ name ] ,
destinations = [ { ' address ' : current_destination [ ' address ' ] , ' port ' : port } ]
)
updated = True
updated = True
return updated
return updated
except bigsuds . OperationFailed , e :
except bigsuds . OperationFailed as e :
raise Exception ( ' Error on setting port : %s ' % e )
raise Exception ( ' Error on setting port : %s ' % e )
def get_state ( api , name ) :
def get_state ( api , name ) :
return api . LocalLB . VirtualServer . get_enabled_state ( virtual_servers = [ name ] ) [ 0 ]
return api . LocalLB . VirtualServer . get_enabled_state (
virtual_servers = [ name ]
) [ 0 ]
def set_state ( api , name , state ) :
def set_state ( api , name , state ) :
updated = False
updated = False
@ -368,28 +414,42 @@ def set_state(api,name,state):
if state == ' present ' :
if state == ' present ' :
state = ' enabled '
state = ' enabled '
if STATES [ state ] != current_state :
if STATES [ state ] != current_state :
api . LocalLB . VirtualServer . set_enabled_state ( virtual_servers = [ name ] , states = [ STATES [ state ] ] )
api . LocalLB . VirtualServer . set_enabled_state (
virtual_servers = [ name ] ,
states = [ STATES [ state ] ]
)
updated = True
updated = True
return updated
return updated
except bigsuds . OperationFailed , e :
except bigsuds . OperationFailed as e :
raise Exception ( ' Error on setting state : %s ' % e )
raise Exception ( ' Error on setting state : %s ' % e )
def get_description ( api , name ) :
def get_description ( api , name ) :
return api . LocalLB . VirtualServer . get_description ( virtual_servers = [ name ] ) [ 0 ]
return api . LocalLB . VirtualServer . get_description (
virtual_servers = [ name ]
) [ 0 ]
def set_description ( api , name , description ) :
def set_description ( api , name , description ) :
updated = False
updated = False
try :
try :
current_description = get_description ( api , name )
current_description = get_description ( api , name )
if description is not None and current_description != description :
if description is not None and current_description != description :
api . LocalLB . VirtualServer . set_description ( virtual_servers = [ name ] , descriptions = [ description ] )
api . LocalLB . VirtualServer . set_description (
virtual_servers = [ name ] ,
descriptions = [ description ]
)
updated = True
updated = True
return updated
return updated
except bigsuds . OperationFailed , e :
except bigsuds . OperationFailed as e :
raise Exception ( ' Error on setting description : %s ' % e )
raise Exception ( ' Error on setting description : %s ' % e )
def get_persistence_profiles ( api , name ) :
def get_persistence_profiles ( api , name ) :
return api . LocalLB . VirtualServer . get_persistence_profile ( virtual_servers = [ name ] ) [ 0 ]
return api . LocalLB . VirtualServer . get_persistence_profile (
virtual_servers = [ name ]
) [ 0 ]
def set_default_persistence_profiles ( api , name , persistence_profile ) :
def set_default_persistence_profiles ( api , name , persistence_profile ) :
updated = False
updated = False
@ -403,14 +463,21 @@ def set_default_persistence_profiles(api,name,persistence_profile):
default = profile [ ' profile_name ' ]
default = profile [ ' profile_name ' ]
break
break
if default is not None and default != persistence_profile :
if default is not None and default != persistence_profile :
api . LocalLB . VirtualServer . remove_persistence_profile ( virtual_servers = [ name ] , profiles = [ [ { ' profile_name ' : default , ' default_profile ' : True } ] ] )
api . LocalLB . VirtualServer . remove_persistence_profile (
virtual_servers = [ name ] ,
profiles = [ [ { ' profile_name ' : default , ' default_profile ' : True } ] ]
)
if default != persistence_profile :
if default != persistence_profile :
api . LocalLB . VirtualServer . add_persistence_profile ( virtual_servers = [ name ] , profiles = [ [ { ' profile_name ' : persistence_profile , ' default_profile ' : True } ] ] )
api . LocalLB . VirtualServer . add_persistence_profile (
virtual_servers = [ name ] ,
profiles = [ [ { ' profile_name ' : persistence_profile , ' default_profile ' : True } ] ]
)
updated = True
updated = True
return updated
return updated
except bigsuds . OperationFailed , e :
except bigsuds . OperationFailed as e :
raise Exception ( ' Error on setting default persistence profile : %s ' % e )
raise Exception ( ' Error on setting default persistence profile : %s ' % e )
def main ( ) :
def main ( ) :
argument_spec = f5_argument_spec ( )
argument_spec = f5_argument_spec ( )
argument_spec . update ( dict (
argument_spec . update ( dict (
@ -425,8 +492,7 @@ def main():
description = dict ( type = ' str ' ) ,
description = dict ( type = ' str ' ) ,
snat = dict ( type = ' str ' ) ,
snat = dict ( type = ' str ' ) ,
default_persistence_profile = dict ( type = ' str ' )
default_persistence_profile = dict ( type = ' str ' )
)
) )
)
module = AnsibleModule (
module = AnsibleModule (
argument_spec = argument_spec ,
argument_spec = argument_spec ,
@ -474,7 +540,7 @@ def main():
try :
try :
vs_remove ( api , name )
vs_remove ( api , name )
result = { ' changed ' : True , ' deleted ' : name }
result = { ' changed ' : True , ' deleted ' : name }
except bigsuds . OperationFailed , e :
except bigsuds . OperationFailed as e :
if " was not found " in str ( e ) :
if " was not found " in str ( e ) :
result [ ' changed ' ] = False
result [ ' changed ' ] = False
else :
else :
@ -503,7 +569,7 @@ def main():
set_default_persistence_profiles ( api , name , default_persistence_profile )
set_default_persistence_profiles ( api , name , default_persistence_profile )
set_state ( api , name , state )
set_state ( api , name , state )
result = { ' changed ' : True }
result = { ' changed ' : True }
except bigsuds . OperationFailed , e :
except bigsuds . OperationFailed as e :
raise Exception ( ' Error on creating Virtual Server : %s ' % e )
raise Exception ( ' Error on creating Virtual Server : %s ' % e )
else :
else :
# check-mode return value
# check-mode return value
@ -526,13 +592,13 @@ def main():
result [ ' changed ' ] | = set_default_persistence_profiles ( api , name , default_persistence_profile )
result [ ' changed ' ] | = set_default_persistence_profiles ( api , name , default_persistence_profile )
result [ ' changed ' ] | = set_state ( api , name , state )
result [ ' changed ' ] | = set_state ( api , name , state )
api . System . Session . submit_transaction ( )
api . System . Session . submit_transaction ( )
except Exception , e :
except Exception as e :
raise Exception ( " Error on updating Virtual Server : %s " % e )
raise Exception ( " Error on updating Virtual Server : %s " % e )
else :
else :
# check-mode return value
# check-mode return value
result = { ' changed ' : True }
result = { ' changed ' : True }
except Exception , e :
except Exception as e :
module . fail_json ( msg = " received exception: %s " % e )
module . fail_json ( msg = " received exception: %s " % e )
module . exit_json ( * * result )
module . exit_json ( * * result )