{"id":660,"date":"2025-06-25T10:11:34","date_gmt":"2025-06-25T08:11:34","guid":{"rendered":"https:\/\/whoami.lausitz-event.info\/?p=660"},"modified":"2025-06-25T15:45:00","modified_gmt":"2025-06-25T13:45:00","slug":"backup-von-cisco-geraeten-via-ansible","status":"publish","type":"post","link":"https:\/\/whoami.lausitz-event.info\/?p=660","title":{"rendered":"Backup von Cisco Ger\u00e4ten via Ansible"},"content":{"rendered":"\n\n<p>Beschrieben wird wird das Netzwerkbackup unter Debian 12.11.<\/p>\n\n\n\n\n\n<p><strong>Installation Ansible<\/strong><\/p>\n\n\n\n\n\n<pre class=\"wp-block-code\"><code>apt install ansible<\/code><\/pre>\n\n\n\n\n\n<p><strong>Installation Ansible Collection<\/strong><\/p>\n\n\n\n\n\n<pre class=\"wp-block-code\"><code>ansible-galaxy collection install cisco.ios cisco.asa ansible.netcommon<\/code><\/pre>\n\n\n\n\n\n<p><strong>Verzeichnisstruktur anlegen<\/strong><\/p>\n\n\n\n\n\n<p>backup-config\/<br>\u251c\u2500\u2500 inventory.yml<\/p>\n\n\n\n\n\n<p>\u251c\u2500\u2500 files\/<br>\u251c\u2500\u2500 backup_config.yml<br>\u2514\u2500\u2500 group_vars\/<br>\u2514\u2500\u2500 all.yml<\/p>\n\n\n\n\n\n<p><strong>inventory.yml<\/strong><\/p>\n\n\n\n\n\n<pre class=\"wp-block-code\"><code>all:<br>  children:<br>    ios_switches:<br>      hosts:<br>        nsw2:<br>          ansible_host: 192.168.160.1<br>    nexus_switches:<br>      hosts:<br>        nsw21:<br>          ansible_host: 192.168.18.21<br>        nsw22:<br>          ansible_host: 192.168.18.22<br>        nsw13:<br>          ansible_host: 192.168.210.123<br>        nsw14:<br>          ansible_host: 192.168.210.124<br>        nsw11:<br>          ansible_host: 192.168.210.121<br>    asa_firewalls:<br>      hosts:<br>        nfw1:<br>          ansible_host: 192.168.0.1<br><br>   <br><br><strong>group_vars\/ios_switches.yml<\/strong><\/code><\/pre>\n\n\n\n\n\n<pre class=\"wp-block-code\"><code>ansible_network_os: cisco.ios.ios<br>ansible_become_password: secure_password<br><br><br><strong>group_vars\/asa_firewalls.yml<\/strong><\/code><\/pre>\n\n\n\n\n\n<pre class=\"wp-block-code\"><code>ansible_network_os: cisco.asa.asa<\/code><\/pre>\n\n\n\n\n\n<p><strong>group_vars\/nexus_switches.yml<\/strong><\/p>\n\n\n\n\n\n<pre class=\"wp-block-code\"><code>ansible_network_os: cisco.ios.ios<\/code><\/pre>\n\n\n\n\n\n<p><strong>backup_config.yml<\/strong><\/p>\n\n\n\n\n\n<pre class=\"wp-block-code\"><code>---\n- name: Backup Cisco IOS Switch Config\n  hosts: ios_switches\n  gather_facts: no\n  become: true\n  become_method: enable\n  tasks:\n    - name: Get Timestamp\n      command: date +%Y%m%d-%H-%M-%S\n      register: timestamp\n    - name: Backup running config\n      ios_config:\n        backup: yes\n        backup_options:\n          #filename: \"{{ inventory_hostname }}-{{ timestamp.stdout }}.cfg\"\n          filename: \"{{ inventory_hostname }}.cfg\"\n          dir_path: \"\/opt\/backup-config\/files\/netzwerk\/switches\"\n\n- name: Backup Cisco Nexus Switch Config\n  hosts: nexus_switches\n  gather_facts: no\n  tasks:\n    - name: Get Timestamp\n      command: date +%Y%m%d-%H-%M-%S\n      register: timestamp\n    - name: Backup running config\n      ios_config:\n        backup: yes\n        backup_options:\n          #filename: \"{{ inventory_hostname }}-{{ timestamp.stdout }}.cfg\"\n          filename: \"{{ inventory_hostname }}.cfg\"\n          dir_path: \"\/opt\/backup-config\/files\/netzwerk\/switches\"\n\n- name: Backup Cisco ASA Firewall\n  hosts: asa_firewalls\n  gather_facts: no\n  tasks:\n    - name: Get Timestamp\n      command: date +%Y%m%d-%H-%M-%S\n      register: timestamp\n    - name: Backup running config\n      ios_config:\n        backup: yes\n        backup_options:\n          #filename: \"{{ inventory_hostname }}-{{ timestamp.stdout }}.cfg\"\n          filename: \"{{ inventory_hostname }}.cfg\"\n          dir_path: \"\/opt\/backup-config\/files\/netzwerk\/firewalls\"\n\n- name: Check files into Gitea via HTTPS + Token\n  hosts: localhost\n  vars:\n    gitea_domain: \"git.local.de\"\n    repo_name: \"netzwerk\"\n    repo_user: \"user\"\n    gitea_user: \"user\"\n    gitea_token: \"0f5ac0dab834fef0f10e65670f3f89145f5f330e\"\n    repo_url: \"https:\/\/{{ gitea_user }}:{{ gitea_token }}@{{ gitea_domain }}\/{{ repo_user }}\/{{ repo_name }}.git\"\n    repo_dest: \"\/opt\/backup-config\/files\/{{ repo_name }}\"\n    git_branch: \"master\"\n    commit_msg: \"Automated commit via Ansible\"\n    files_to_add:\n      - { src: \"firewalls\/nfw1.cfg\", dest: \"nfw1.cfg\" }\n      - { src: \"switches\/nsw13.cfg\", dest: \"nsw13.cfg\" }\n      - { src: \"switches\/nsw14.cfg\", dest: \"nsw14.cfg\" }\n      - { src: \"switches\/nsw21.cfg\", dest: \"nsw21.cfg\" }\n      - { src: \"switches\/nsw22.cfg\", dest: \"nsw22.cfg\" }\n      - { src: \"switches\/nsw2.cfg\", dest: \"nsw2.cfg\" }\n      - { src: \"switches\/nsw11.cfg\", dest: \"nsw11.cfg\" }\n\n  tasks:\n    - name: Ensure git is installed\n      ansible.builtin.package:\n        name: git\n        state: present\n    - name: Check if Git repo already exists\n      ansible.builtin.stat:\n        path: \"{{ repo_dest }}\/.git\"\n      register: git_repo_present\n\n    - name: Check for uncommitted changes\n      ansible.builtin.command: git status --porcelain\n      args:\n        chdir: \"{{ repo_dest }}\"\n      register: git_status\n      when: git_repo_present.stat.exists\n\n    - name: Add all changes (tracked und neue Dateien)\n      ansible.builtin.command: git add .\n      args:\n        chdir: \"{{ repo_dest }}\"\n      when: git_status.stdout != \"\"\n\n    - name: Commit changes (falls etwas zum Commit vorhanden ist)\n      ansible.builtin.command: >\n        bash -c \"git diff --cached --quiet || git commit -m 'Auto-commit uncommitted changes before Ansible sync'\"\n      args:\n        chdir: \"{{ repo_dest }}\"\n      when: git_status.stdout != \"\"\n\n    - name: Push changes to Gitea\n      ansible.builtin.command: git push origin {{ git_branch }}\n      args:\n        chdir: \"{{ repo_dest }}\"\n      when: git_status.stdout != \"\"\n\n    - name: Clone Gitea repository (HTTPS with token)\n      ansible.builtin.git:\n        repo: \"{{ repo_url }}\"\n        dest: \"{{ repo_dest }}\"\n        version: \"{{ git_branch }}\"\n        update: yes\n\n    - name: Copy files into repository\n      ansible.builtin.copy:\n        src: \"{{ item.src }}\"\n        dest: \"{{ repo_dest }}\/{{ item.dest }}\"\n      loop: \"{{ files_to_add }}\"\n\n    - name: Git add files\n      ansible.builtin.command:\n        cmd: \"git add {{ item.dest }}\"\n        chdir: \"{{ repo_dest }}\"\n      loop: \"{{ files_to_add }}\"\n\n    - name: Git commit changes\n      ansible.builtin.command:\n        cmd: \"git commit -m '{{ commit_msg }}'\"\n        chdir: \"{{ repo_dest }}\"\n      register: git_commit\n      failed_when: git_commit.rc != 0 and \"'nothing to commit'\" not in git_commit.stderr\n\n    - name: Git push to Gitea\n      ansible.builtin.command:\n        cmd: \"git push origin {{ git_branch }}\"\n        chdir: \"{{ repo_dest }}\"\n\n\n\n<\/code><\/pre>\n\n\n\n\n\n<p><\/p>\n\n\n","protected":false},"excerpt":{"rendered":"<p>Beschrieben wird wird das Netzwerkbackup unter Debian 12.11. Installation Ansible Installation Ansible Collection Verzeichnisstruktur anlegen backup-config\/\u251c\u2500\u2500 inventory.yml \u251c\u2500\u2500 files\/\u251c\u2500\u2500 backup_config.yml\u2514\u2500\u2500 group_vars\/\u2514\u2500\u2500 all.yml inventory.yml group_vars\/nexus_switches.yml backup_config.yml<\/p>","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"default","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1,7,15,3],"tags":[],"class_list":["post-660","post","type-post","status-publish","format-standard","hentry","category-allgemein","category-ansible","category-cisco","category-it"],"_links":{"self":[{"href":"https:\/\/whoami.lausitz-event.info\/index.php?rest_route=\/wp\/v2\/posts\/660","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/whoami.lausitz-event.info\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/whoami.lausitz-event.info\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/whoami.lausitz-event.info\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/whoami.lausitz-event.info\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=660"}],"version-history":[{"count":10,"href":"https:\/\/whoami.lausitz-event.info\/index.php?rest_route=\/wp\/v2\/posts\/660\/revisions"}],"predecessor-version":[{"id":676,"href":"https:\/\/whoami.lausitz-event.info\/index.php?rest_route=\/wp\/v2\/posts\/660\/revisions\/676"}],"wp:attachment":[{"href":"https:\/\/whoami.lausitz-event.info\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=660"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/whoami.lausitz-event.info\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=660"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/whoami.lausitz-event.info\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=660"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}