1 changed files with 108 additions and 0 deletions
@ -0,0 +1,108 @@ |
|||||
|
--- |
||||
|
title: "Sauvegarder la configuration de ses EdgeSwitch et EdgeRouter avec Ansible" |
||||
|
date: 2021-02-22T00:00:00+02:00 |
||||
|
opensource: |
||||
|
- Ansible |
||||
|
topics: |
||||
|
- IT Automation |
||||
|
--- |
||||
|
|
||||
|
J'utilise des équipements de marque Ubiquiti dans mon réseau informatique à la maison: un EdgeSwitch et un EdgeRouter. |
||||
|
Et jusqu'à présent, je n'avais pas mis en place de moyen simple et automatisé pour sauvegarder leur configuration. |
||||
|
C'est désormais chose faite avec ce playbook Ansible qui me sauvegarde la configuration des deux équipements et me l'enregistre dans un entrepôt Git. |
||||
|
|
||||
|
<!--more--> |
||||
|
|
||||
|
La sauvegarde du EdgeRouter est plutôt triviale car sa configuration est sauvegardée dans `/config/config.boot`. |
||||
|
Un simple **cat** appelé depuis le module **raw** récupère cette configuration et le module **copy** peut le sauvegarder localement. |
||||
|
|
||||
|
```yaml |
||||
|
- name: Backup EdgeRouter configuration |
||||
|
hosts: edgerouter |
||||
|
gather_facts: no |
||||
|
become: no |
||||
|
tasks: |
||||
|
- name: Create a folder for each device |
||||
|
file: |
||||
|
path: '{{ playbook_dir }}/{{ inventory_hostname }}' |
||||
|
state: directory |
||||
|
delegate_to: localhost |
||||
|
|
||||
|
- name: Fetch config.boot |
||||
|
raw: cat /config/config.boot |
||||
|
register: config_boot |
||||
|
|
||||
|
- copy: |
||||
|
dest: '{{ playbook_dir }}/{{ inventory_hostname }}/config.boot' |
||||
|
content: '{{ config_boot.stdout }}' |
||||
|
delegate_to: localhost |
||||
|
``` |
||||
|
|
||||
|
La sauvegarde du EdgeSwitch a été plus difficile. |
||||
|
Il n'existe pas d'accès SSH direct au système de fichiers ou à un shell: tout passe par une CLI type Juniper/Cisco. |
||||
|
|
||||
|
J'ai donc rusé: j'utilise les API REST de l'interface Web Ubiquiti. |
||||
|
Un appel avec le module **uri** d'Ansible pour poster le login / mot de passe et récupérer un jeton d'authentification. |
||||
|
Un second appel toujours avec le même module pour récupérer une sauvegarde de la configuration. |
||||
|
|
||||
|
```yaml |
||||
|
- name: Backup EdgeSwitch Configuration |
||||
|
hosts: edgeswitch |
||||
|
gather_facts: no |
||||
|
become: no |
||||
|
vars_prompt: |
||||
|
- name: ubnt_password |
||||
|
prompt: "EdgeSwitch Admin Password?" |
||||
|
tasks: |
||||
|
- name: Create a folder for each device |
||||
|
file: |
||||
|
path: '{{ playbook_dir }}/{{ inventory_hostname }}' |
||||
|
state: directory |
||||
|
delegate_to: localhost |
||||
|
|
||||
|
- name: Login on EdgeSwitch |
||||
|
uri: |
||||
|
url: 'https://{{ ansible_host }}/api/v1.0/user/login' |
||||
|
method: POST |
||||
|
body_format: json |
||||
|
body: |
||||
|
username: '{{ ubnt_username }}' |
||||
|
password: '{{ ubnt_password }}' |
||||
|
headers: |
||||
|
Accept: "application/json, text/plain, */*" |
||||
|
User-Agent: "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:84.0) Gecko/20100101 Firefox/84.0" |
||||
|
Origin: 'https://{{ ansible_host }}' |
||||
|
Referer: 'https://{{ ansible_host }}/' |
||||
|
validate_certs: no |
||||
|
register: auth |
||||
|
delegate_to: localhost |
||||
|
|
||||
|
- name: Backup EdgeSwitch configuration |
||||
|
uri: |
||||
|
url: 'https://{{ ansible_host }}/api/v1.0/system/backup' |
||||
|
method: GET |
||||
|
headers: |
||||
|
x-auth-token: '{{ auth.x_auth_token }}' |
||||
|
return_content: no |
||||
|
dest: '{{ playbook_dir }}/{{ inventory_hostname }}/edgeswitch.tgz' |
||||
|
validate_certs: no |
||||
|
delegate_to: localhost |
||||
|
|
||||
|
- name: Extract EdgeSwitch configuration |
||||
|
command: |
||||
|
cmd: tar -xf {{ playbook_dir }}/{{ inventory_hostname }}/edgeswitch.tgz -C {{ playbook_dir }}/{{ inventory_hostname }} ./cfg-backup |
||||
|
warn: no |
||||
|
delegate_to: localhost |
||||
|
``` |
||||
|
|
||||
|
Je n'avais pas envie de stocker mon mot de passe administrateur dans l'inventaire c'est pourquoi le playbook le demande à l'utilisateur au démarrage (section **vars_prompt**). |
||||
|
Mais on pourrait tout à fait remplacer le **vars_prompt** par un accès au [coffre fort Ansible](https://docs.ansible.com/ansible/latest/user_guide/vault.html). |
||||
|
|
||||
|
Le login administrateur, lui, est stocké dans le fichier inventaire via la variable **ubnt_username**. |
||||
|
|
||||
|
```ini |
||||
|
[edgeswitch] |
||||
|
my-switch.example.test ansible_host=1.2.3.4 ubnt_username=nicolas |
||||
|
``` |
||||
|
|
||||
|
Les fichiers de configuration sont stockés dans un répertoire propre à chaque équipement... dont il n'y a plus qu'à suivre les versions dans un entrepôt Git ! |
||||
Loading…
Reference in new issue