@ -0,0 +1,83 @@
|
||||
#!/usr/bin/env python3
|
||||
import base64
|
||||
import time
|
||||
import functools
|
||||
import urllib.parse
|
||||
|
||||
import requests
|
||||
from ansible.errors import AnsibleActionFail
|
||||
from ansible.plugins.action import ActionBase
|
||||
|
||||
|
||||
class Aruba:
|
||||
def __init__(self, base_url):
|
||||
self._session = requests.session()
|
||||
self._base_url = base_url
|
||||
|
||||
def _url(self, url):
|
||||
return urllib.parse.urljoin(self._base_url, url)
|
||||
|
||||
def login(self, username, password):
|
||||
response = self._session.post(
|
||||
self._url("/rest/v4/login-sessions"),
|
||||
json={"userName": username, "password": password},
|
||||
)
|
||||
if response.status_code != requests.codes.created:
|
||||
raise AnsibleActionFail("Login failed")
|
||||
|
||||
def logout(self):
|
||||
response = self._session.delete(self._url("/rest/v4/login-sessions"))
|
||||
if response.status_code != requests.codes.no_content:
|
||||
raise AnsibleActionFail("Logout failed")
|
||||
|
||||
def restore(self, config):
|
||||
response = self._session.post(
|
||||
self._url(
|
||||
"/rest/v4/system/config/cfg_restore/payload"
|
||||
),
|
||||
json={
|
||||
"config_base64_encoded": base64.b64encode(config.encode()),
|
||||
"is_forced_reboot_enabled": True,
|
||||
},
|
||||
)
|
||||
if response.status_code != requests.codes.accepted:
|
||||
raise AnsibleActionFail("Restore failed")
|
||||
|
||||
response = self._session.get(
|
||||
self._url(
|
||||
"/rest/v4/system/config/cfg_restore/payload/status"
|
||||
)
|
||||
)
|
||||
print(response.text)
|
||||
|
||||
|
||||
class ActionModule(ActionBase):
|
||||
|
||||
_VALID_ARGS = frozenset(("username", "password", "config", "url"))
|
||||
|
||||
def _require_arg(self, name):
|
||||
try:
|
||||
return self._task.args[name]
|
||||
except KeyError:
|
||||
raise AnsibleActionFail("Missing argument: {}".format(name))
|
||||
|
||||
def run(self, tmp=None, task_vars=None):
|
||||
task_vars = task_vars or {}
|
||||
result = super().run(tmp, task_vars)
|
||||
|
||||
base_url = self._task.args.get("url")
|
||||
username = self._require_arg("username")
|
||||
password = self._require_arg("password")
|
||||
config = self._require_arg("config")
|
||||
|
||||
aruba = Aruba(base_url)
|
||||
aruba.login(username, password)
|
||||
|
||||
try:
|
||||
aruba.restore(config)
|
||||
except:
|
||||
raise
|
||||
else:
|
||||
aruba.logout()
|
||||
|
||||
return result
|
@ -0,0 +1,17 @@
|
||||
class FilterModule:
|
||||
def filters(self):
|
||||
return {
|
||||
"aruba_ints": aruba_ints,
|
||||
}
|
||||
|
||||
|
||||
def aruba_ints(seq, sep=",", hyphen="-"):
|
||||
ranges = []
|
||||
for value in sorted(seq):
|
||||
if not ranges or ranges[-1][1] + 1 != value:
|
||||
ranges.append((value, value))
|
||||
else:
|
||||
ranges[-1] = (ranges[-1][0], value)
|
||||
return sep.join(
|
||||
(f"{a}" if a == b else f"{a}{hyphen}{b}" for a, b in ranges)
|
||||
)
|
@ -0,0 +1,16 @@
|
||||
class FilterModule:
|
||||
def filters(self):
|
||||
return {
|
||||
"enquote": enquote,
|
||||
}
|
||||
|
||||
|
||||
def enquote(string, delimiter='"', escape="\\"):
|
||||
translation = str.maketrans(
|
||||
{
|
||||
delimiter: f"{escape}{delimiter}",
|
||||
escape: f"{escape}{escape}",
|
||||
}
|
||||
)
|
||||
escaped = string.translate(translation)
|
||||
return f"{delimiter}{escaped}{delimiter}"
|
@ -0,0 +1,9 @@
|
||||
class FilterModule:
|
||||
def filters(self):
|
||||
return {
|
||||
"contains": contains,
|
||||
}
|
||||
|
||||
|
||||
def contains(a, b):
|
||||
return b in a
|
@ -0,0 +1,11 @@
|
||||
class FilterModule:
|
||||
def filters(self):
|
||||
return {
|
||||
"choices": choices,
|
||||
}
|
||||
|
||||
|
||||
def choices(value, choices):
|
||||
if value not in choices:
|
||||
raise ValueError(f"{value} not in {choices}")
|
||||
return value
|
@ -0,0 +1,84 @@
|
||||
#!/usr/bin/env ansible-playbook
|
||||
---
|
||||
- hosts:
|
||||
- test-1.switch.infra.auro.re
|
||||
gather_facts: false
|
||||
vars:
|
||||
aruba__api_url: "http://{{ inventory_hostname }}"
|
||||
aruba__api_username: "manager"
|
||||
aruba__api_password: "manager"
|
||||
aruba__model: J9773A
|
||||
aruba__release: YA.16.11.002
|
||||
aruba__hostname: "{{ inventory_hostname | hostname }}"
|
||||
aruba__rest_enabled: true
|
||||
aruba__ssh_enabled: true
|
||||
aruba__ntp_servers:
|
||||
- 10.128.0.1
|
||||
- 2a09:6840:128:0:1::1
|
||||
aruba__timezone: Europe/Paris
|
||||
aruba__dns_servers:
|
||||
- 10.128.0.1
|
||||
- 2a09:6840:128:0:1::1
|
||||
aruba__dns_domain_names:
|
||||
- switch.infra.auro.re
|
||||
- infra.auro.re
|
||||
- toto.auro.re
|
||||
aruba__manager_password: "manager"
|
||||
aruba__operator_password: "operator"
|
||||
aruba__default_gateways:
|
||||
- 10.131.0.1
|
||||
- 2a09:6840:131:0:1::1
|
||||
aruba__vlans:
|
||||
1:
|
||||
name: Default
|
||||
131:
|
||||
name: Switchs
|
||||
addresses:
|
||||
- 10.131.1.1/16
|
||||
- 2a09:6840:131:1:1::1/56
|
||||
1000:
|
||||
name: "Client 0"
|
||||
1001:
|
||||
name: "Client 1"
|
||||
1002:
|
||||
name: "Client 2"
|
||||
1003:
|
||||
name: "Client 3"
|
||||
1004:
|
||||
name: "Client 4"
|
||||
aruba__interfaces:
|
||||
1:
|
||||
name: Uplink
|
||||
untagged: 131
|
||||
tagged:
|
||||
- 1000
|
||||
- 1001
|
||||
- 1002
|
||||
- 1003
|
||||
- 1004
|
||||
loop_protect: true
|
||||
lldp: true
|
||||
2:
|
||||
name: "Client 0"
|
||||
untagged: 1000
|
||||
loop_protect: true
|
||||
3:
|
||||
name: "Client 1"
|
||||
untagged: 1001
|
||||
loop_protect: true
|
||||
4:
|
||||
name: "Client 2"
|
||||
untagged: 1002
|
||||
speed_duplex: 100-full
|
||||
loop_protect: true
|
||||
5:
|
||||
name: "Client 3"
|
||||
untagged: 1003
|
||||
loop_protect: true
|
||||
6:
|
||||
name: "Client 4"
|
||||
untagged: 1004
|
||||
loop_protect: true
|
||||
roles:
|
||||
- aruba
|
||||
...
|
@ -0,0 +1,11 @@
|
||||
---
|
||||
aruba__ntp_servers: []
|
||||
aruba__vlans: {}
|
||||
aruba__interfaces: {}
|
||||
aruba__default_gateways: []
|
||||
aruba__ssh_enabled: False
|
||||
aruba__rest_enabled: True
|
||||
aruba__dns_domain_names: []
|
||||
aruba__loop_protect_disable_timer: 30
|
||||
aruba__loop_protect_tx_interval: 3
|
||||
...
|
@ -0,0 +1,97 @@
|
||||
---
|
||||
- name: Generate configuration
|
||||
set_fact:
|
||||
aruba__config: "{{ lookup('template', './config.j2') }}"
|
||||
when: "aruba__config is not defined"
|
||||
|
||||
- name: Restore configuration
|
||||
aruba_cfg_restore:
|
||||
url: "http://{{ inventory_hostname }}/"
|
||||
username: "{{ aruba__api_username }}"
|
||||
password: "{{ aruba__api_password }}"
|
||||
config: "{{ aruba__config }}"
|
||||
|
||||
#- name: Login to switch
|
||||
# delegate_to: localhost
|
||||
# uri:
|
||||
# url: "{{ aruba__api_base_url }}/rest/v4/login-sessions"
|
||||
# method: POST
|
||||
# status_code: 201
|
||||
# body_format: json
|
||||
# body:
|
||||
# userName: "{{ aruba__api_username }}"
|
||||
# password: "{{ aruba__api_password }}"
|
||||
# register: login
|
||||
|
||||
#- name: Get diff
|
||||
# delegate_to: localhost
|
||||
# uri:
|
||||
# url: "{{ aruba__api_base_url }}/rest/v4/system/config/cfg_restore/payload/latest_diff"
|
||||
# method: POST
|
||||
# body_format: json
|
||||
# status_code: 202
|
||||
# body:
|
||||
# config_base64_encoded: "{{ aruba__config | b64encode }}"
|
||||
# headers:
|
||||
# Cookie: "{{ login.json.cookie }}"
|
||||
# register: diff
|
||||
|
||||
#- name: Diff
|
||||
# debug:
|
||||
# msg: "{{ diff }}"
|
||||
|
||||
#- name: Get diff
|
||||
# delegate_to: localhost
|
||||
# uri:
|
||||
# url: "{{ aruba__api_base_url }}/rest/v4/system/config/cfg_restore/payload/latest_diff/status"
|
||||
# method: GET
|
||||
# status_code: 200
|
||||
# headers:
|
||||
# Cookie: "{{ login.json.cookie }}"
|
||||
# register: diff
|
||||
|
||||
#- name: Diff
|
||||
# debug:
|
||||
# msg: "{{ diff }}"
|
||||
|
||||
#- name: Restore configuration
|
||||
# delegate_to: localhost
|
||||
# uri:
|
||||
# url: "{{ aruba__api_base_url }}/rest/v4/system/config/cfg_restore/payload"
|
||||
# method: POST
|
||||
# body_format: json
|
||||
# status_code: 202
|
||||
# body:
|
||||
# config_base64_encoded: "{{ aruba__config | b64encode }}"
|
||||
# is_forced_reboot_enabled: true
|
||||
# headers:
|
||||
# Cookie: "{{ login.json.cookie }}"
|
||||
# register: status
|
||||
#
|
||||
#- name: XX
|
||||
# debug:
|
||||
# msg: "{{ status }}"
|
||||
#
|
||||
#- name: Get diff
|
||||
# delegate_to: localhost
|
||||
# uri:
|
||||
# url: "{{ aruba__api_base_url }}/rest/v4/system/config/cfg_restore/payload/status"
|
||||
# method: GET
|
||||
# status_code: 200
|
||||
# headers:
|
||||
# Cookie: "{{ login.json.cookie }}"
|
||||
# register: diff
|
||||
|
||||
#- name: Diff
|
||||
# debug:
|
||||
# msg: "{{ diff }}"
|
||||
|
||||
#- name: Logout
|
||||
# delegate_to: localhost
|
||||
# uri:
|
||||
# url: "{{ aruba__api_base_url }}/rest/v4/login-sessions"
|
||||
# method: DELETE
|
||||
# status_code: 204
|
||||
# headers:
|
||||
# Cookie: "{{ login.json.cookie }}"
|
||||
...
|
Loading…
Reference in New Issue