Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
A
ansible
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
OpenEdx
ansible
Commits
f1a94adb
Commit
f1a94adb
authored
Sep 06, 2013
by
Matt Hite
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Documentation additions and major refactor
parent
faae84bf
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
90 additions
and
42 deletions
+90
-42
library/net_infrastructure/bigip_node
+90
-42
No files found.
library/net_infrastructure/bigip_node
View file @
f1a94adb
#!/usr/bin/
env
python
#!/usr/bin/python
# -*- coding: utf-8 -*-
# (c) 2013, Matt Hite <mhite@hotmail.com>
...
...
@@ -21,10 +21,10 @@
DOCUMENTATION
=
'''
---
module: bigip_node
short_description: "Manages F5 BIG-IP LTM
pool member
s"
short_description: "Manages F5 BIG-IP LTM
node
s"
description:
- "Manages F5 BIG-IP LTM
pool member
s via iControl SOAP API"
version_added: "
TBD
"
- "Manages F5 BIG-IP LTM
node
s via iControl SOAP API"
version_added: "
1.3
"
author: Matt Hite
notes:
- "Requires BIG-IP software version >= 11"
...
...
@@ -69,21 +69,21 @@ options:
choices: []
aliases: []
name:
description
description
:
- "Node name"
required: false
default: null
choices: []
host:
description:
- "Node IP. Required when state=present
. Ignored
when state=absent."
- "Node IP. Required when state=present
and node does not exist. Error
when state=absent."
required: true
default: null
choices: []
aliases: ['address']
aliases: ['address'
, 'ip'
]
description:
description:
- "
Optional n
ode description."
- "
N
ode description."
required: false
default: null
choices: []
...
...
@@ -91,10 +91,51 @@ options:
EXAMPLES
=
'''
TBD
TBD
TBD
TBD
## playbook task examples:
---
# file bigip-test.yml
# ...
- hosts: bigip-test
tasks:
- name: Add node
local_action: >
bigip_node
server=lb.mydomain.com
user=admin
password=mysecret
state=present
partition=matthite
host="{{ ansible_default_ipv4["address"] }}"
name="{{ ansible_default_ipv4["address"] }}"
# Note that the BIG-IP automatically names the node using the
# IP address specified in previous play's host parameter.
# Future plays referencing this node no longer use the host
# parameter but instead use the name parameter.
# Alternatively, you could have specified a name with the
# name parameter when state=present.
- name: Modify node description
local_action: >
bigip_node
server=lb.mydomain.com
user=admin
password=mysecret
state=present
partition=matthite
name="{{ ansible_default_ipv4["address"] }}"
description="Our best server yet"
- name: Delete node
local_action: >
bigip_node
server=lb.mydomain.com
user=admin
password=mysecret
state=absent
partition=matthite
name="{{ ansible_default_ipv4["address"] }}"
'''
...
...
@@ -106,8 +147,8 @@ else:
bigsuds_found
=
True
import
traceback
# ==========================
=================
# bigip_
pool_member module specific support methods.
# ==========================
# bigip_
node module specific
#
def
bigip_api
(
bigip
,
user
,
password
):
...
...
@@ -131,41 +172,42 @@ def node_exists(api, address):
def
create_node_address
(
api
,
address
,
name
):
try
:
api
.
LocalLB
.
NodeAddressV2
.
create
(
nodes
=
[
name
],
addresses
=
[
address
],
limits
=
[
0
])
return
True
,
""
result
=
True
desc
=
""
except
bigsuds
.
OperationFailed
,
e
:
if
"invalid node address"
in
str
(
e
)
and
"already exists"
in
str
(
e
):
return
(
False
,
"The referenced IP address is already in use."
)
if
"already exists"
in
str
(
e
):
result
=
False
desc
=
"referenced name or IP already in use"
else
:
# genuine exception
raise
return
(
result
,
desc
)
def
get_node_address
(
api
,
name
):
return
api
.
LocalLB
.
NodeAddressV2
.
get_address
(
nodes
=
[
name
])[
0
]
def
delete_node_address
(
api
,
address
):
result
=
False
try
:
api
.
LocalLB
.
NodeAddressV2
.
delete_node_address
(
nodes
=
[
address
])
result
=
True
desc
=
""
except
bigsuds
.
OperationFailed
,
e
:
if
"is referenced by a member of pool"
in
str
(
e
):
result
=
False
desc
=
"node referenced by pool"
else
:
# genuine exception
raise
return
result
return
(
result
,
desc
)
def
set_node_description
(
api
,
name
,
description
):
api
.
LocalLB
.
NodeAddressV2
.
set_description
(
nodes
=
[
name
],
descriptions
=
[
description
])
def
get_node_description
(
api
,
name
):
return
api
.
LocalLB
.
NodeAddressV2
.
get_description
(
nodes
=
[
name
])[
0
]
def
main
():
module
=
AnsibleModule
(
argument_spec
=
dict
(
server
=
dict
(
type
=
'str'
,
required
=
True
),
...
...
@@ -175,7 +217,7 @@ def main():
partition
=
dict
(
type
=
'str'
,
default
=
'Common'
),
name
=
dict
(
type
=
'str'
,
required
=
True
),
host
=
dict
(
type
=
'str'
,
aliases
=
[
'address'
,
'ip'
]),
description
=
dict
(
type
=
'str'
,
default
=
''
)
description
=
dict
(
type
=
'str'
)
),
supports_check_mode
=
True
)
...
...
@@ -193,10 +235,8 @@ def main():
address
=
"/
%
s/
%
s"
%
(
partition
,
name
)
description
=
module
.
params
[
'description'
]
# sanity check user supplied values
if
state
==
'present'
and
host
is
None
:
module
.
fail_json
(
msg
=
'host required when state=present'
)
if
state
==
'absent'
and
host
is
not
None
:
module
.
fail_json
(
msg
=
"host parameter invalid when state=absent"
)
try
:
api
=
bigip_api
(
server
,
user
,
password
)
...
...
@@ -205,33 +245,41 @@ def main():
if
state
==
'absent'
:
if
node_exists
(
api
,
address
):
if
not
module
.
check_mode
:
deleted
=
delete_node_address
(
api
,
address
)
deleted
,
desc
=
delete_node_address
(
api
,
address
)
if
not
deleted
:
module
.
fail_json
(
msg
=
"unable to delete:
node referenced by pool"
)
module
.
fail_json
(
msg
=
"unable to delete:
%
s"
%
desc
)
else
:
result
=
{
'changed'
:
True
}
else
:
# check-mode return value
result
=
{
'changed'
:
True
}
elif
state
==
'present'
:
if
not
node_exists
(
api
,
address
):
if
host
is
None
:
module
.
fail_json
(
msg
=
"host parameter required when "
\
"state=present and node does not exist"
)
if
not
module
.
check_mode
:
if
not
node_exists
(
api
,
address
):
res
,
desc
=
create_node_address
(
api
,
address
=
host
,
name
=
address
)
if
not
res
:
module
.
fail_json
(
msg
=
desc
)
result
=
{
'changed'
:
True
}
created
,
desc
=
create_node_address
(
api
,
address
=
host
,
name
=
address
)
if
not
created
:
module
.
fail_json
(
msg
=
"unable to create:
%
s"
%
desc
)
else
:
result
=
{
'changed'
:
True
}
if
description
is
not
None
:
set_node_description
(
api
,
address
,
description
)
result
=
{
'changed'
:
True
}
else
:
# check-mode return value
result
=
{
'changed'
:
True
}
else
:
# node exists -- potentially modify attributes
if
host
is
not
None
:
current_address
=
get_node_address
(
api
,
address
)
if
current_address
!=
host
:
module
.
fail_json
(
msg
=
"""Changing the node address is not
supported by the API, delete and
recreate the node."""
)
current_descrip
=
get_node_description
(
api
,
address
)
if
current_descrip
!=
description
:
if
get_node_address
(
api
,
address
)
!=
host
:
module
.
fail_json
(
msg
=
"Changing the node address is "
\
"not supported by the API; "
\
"delete and recreate the node."
)
if
description
is
not
None
:
if
get_node_description
(
api
,
address
)
!=
description
:
if
not
module
.
check_mode
:
set_node_description
(
api
,
address
,
description
)
result
=
{
'changed'
:
True
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment