104 lines
3.8 KiB
YAML
104 lines
3.8 KiB
YAML
# Playbook to backup running configs from (Cisco IOS) network devices to Git
|
|
#
|
|
# Gather the config via ios_facts, store it in the local directory {{ config_path }}
|
|
# Sanitize config files / remove lines with timestamps like {{ timestamp_line_identifier }}
|
|
# Commit to git, only if neccessary
|
|
# Report all steps to {{ syslog_host }}
|
|
#
|
|
# You might want to change the vars config_path, syslog_host and timestamp_line_identifier
|
|
# Uncomment the line 'git push -f origin master' if you want to push to a central repo like GitHub/Lab
|
|
|
|
|
|
---
|
|
- name: CONFIG BACKUP TO LOCAL DIRECTORY
|
|
hosts: all
|
|
connection: network_cli
|
|
ignore_errors: yes
|
|
gather_facts: no
|
|
|
|
vars:
|
|
config_path: /home/nwmichl/configs
|
|
syslog_host: 192.168.1.12
|
|
timestamp_line_identifier: "! Last configuration"
|
|
|
|
tasks:
|
|
|
|
- name: GATHER FACTS VIA SSH
|
|
ios_facts:
|
|
gather_subset:
|
|
- config
|
|
register: ios_facts_result
|
|
when: ansible_network_os == 'ios'
|
|
|
|
- name: SYSLOG MESSAGE - GATHER FACTS ERROR
|
|
shell: |
|
|
logger -n {{ syslog_host }} -p local0.error --udp Config Backup of "{{ inventory_hostname }}" GATHER FACTS FAILED because "{{ ios_facts_result.msg }}"
|
|
when: "ansible_network_os == 'ios' and ios_facts_result.failed"
|
|
|
|
- name: SAVE CONFIG TO FILE
|
|
local_action: copy content={{ ansible_net_config }} dest={{ config_path }}/{{ inventory_hostname }}.txt
|
|
register: save_result
|
|
when: "ansible_network_os == 'ios' and not ios_facts_result.failed"
|
|
|
|
- name: SYSLOG MESSAGE - SAVE CONFIG ERROR
|
|
shell: |
|
|
logger -n {{ syslog_host }} -p local0.error --udp Config Backup of "{{ inventory_hostname }}" SAVE FAILED because "{{ save_result.msg }}"
|
|
when: "ansible_network_os == 'ios' and save_result.failed"
|
|
|
|
- name: SYSLOG MESSAGE - SUCCESSFUL
|
|
shell: |
|
|
logger -n {{ syslog_host }} -p local0.notice --udp Config Backup of "{{ inventory_hostname }}" successful
|
|
when: "ansible_network_os == 'ios' and not ios_facts_result.failed and not save_result.failed"
|
|
|
|
- name: REMOVE CONFIG LINES WITH TIMESTAMPS
|
|
lineinfile:
|
|
path: "{{ config_path }}/{{ inventory_hostname }}.txt"
|
|
state: absent
|
|
regexp: '^{{ timestamp_line_identifier }}'
|
|
delegate_to: localhost
|
|
|
|
#
|
|
# The following tasks will only be executed once
|
|
#
|
|
|
|
- name: GIT - ADD ALL (NEW) FILES AND CHECK IF WORKING DIRECTORY IS DIRTY => FAILED
|
|
shell: |
|
|
cd {{ config_path }}/
|
|
git add --all .
|
|
git diff-index --quiet HEAD #Return code = 0 if working directory is clean and 1 if dirty
|
|
delegate_to: localhost
|
|
register: git_result
|
|
run_once: true
|
|
|
|
- name: SYSLOG MESSAGE - Git Dir clean - Nothing to commit
|
|
shell: |
|
|
logger -n {{ syslog_host }} -p local0.notice --udp Config Backup - GIT Working Directory {{ config_path }} is clean - Nothing to commit
|
|
when: not git_result.failed
|
|
delegate_to: localhost
|
|
run_once: true
|
|
|
|
- name: GIT - COMMIT/PUSH ONLY IF WORKING DIRECTORY IS DIRTY
|
|
shell: |
|
|
cd {{ config_path }}/
|
|
git commit -m "Config backup taken $(date +"%Y-%m-%d %H:%M:%S")"
|
|
# git push -f origin master
|
|
delegate_to: localhost
|
|
register: gitcommit_result
|
|
run_once: true
|
|
when: git_result.failed
|
|
|
|
- name: SYSLOG MESSAGE - GIT COMMIT/PUSH SUCCESSFUL
|
|
shell: |
|
|
logger -n {{ syslog_host }} -p local0.notice --udp Config Backup - GIT Commit / Push successful
|
|
when: gitcommit_result.failed is defined and not gitcommit_result.failed
|
|
delegate_to: localhost
|
|
run_once: true
|
|
|
|
- name: SYSLOG MESSAGE - GIT COMMIT/PUSH ERROR
|
|
shell: |
|
|
logger -n {{ syslog_host }} -p local0.error --udp Config Backup - GIT Commit / Push FAILED !
|
|
when: gitcommit_result.failed is defined and gitcommit_result.failed
|
|
delegate_to: localhost
|
|
run_once: true
|
|
|