The following Ansible playbook is a rewrite of a script from a long time ago to perform backups of a Netscaler. As far as I know, there are no native Ansible or Vendor modules to perform a system backup. Within the playbook I am simply performing a raw call using the URI module against the Nitro API and fetching the backup file.
The following Vendor links contain good/related reference information:
- Citrix Product Documentation: Backup and restore
- Netscaler Development Documentation: systembackup
- Netscaler Development Documentation: Direct NITRO API calls
netscaler_systembackup.yaml: a /usr/bin/ansible-playbook -f 10 script text executable, ASCII text
#!/usr/bin/ansible-playbook -f 10 ## Ansible playbook to perform a full backup of Netscaler systems ## 2018 (v.01) - Playbook from www.davideaves.com --- - name: Netscaler full backup hosts: netscalers connection: local gather_facts: False vars: ansible_connection: "local" ansible_python_interpreter: "/usr/bin/env python" backup_location: "/srv/nsbackup" ns_sys_backup: "/var/ns_sys_backup" tasks: - name: Check backup file status local_action: module: stat path: "{{ backup_location }}/{{ inventory_hostname }}_{{ lookup('pipe', 'date +%Y%m%d') }}_nsbackup.tgz" register: stat_result - name: Check backup directory location local_action: module: file path: "{{ backup_location }}" state: directory mode: 0775 recurse: yes run_once: True when: stat_result.stat.exists == False - name: Full backup of Netscaler configuration. block: - name: Create Netscaler system backup local_action: module: uri url: "https://{{ inventory_hostname }}/nitro/v1/config/systembackup?action=create" method: POST validate_certs: no return_content: yes headers: X-NITRO-USER: "{{ nitro_user | default('nsroot') }}" X-NITRO-PASS: "{{ nitro_pass | default('nsroot') }}" body_format: json body: systembackup: filename: "{{ inventory_hostname | hash('md5') }}" level: full comment: Ansible Generated Backup - name: Fetch Netscaler system backup local_action: module: uri url: "https://{{ inventory_hostname }}/nitro/v1/config/systemfile?args=filename:{{ inventory_hostname | hash('md5') }}.tgz,filelocation:{{ ns_sys_backup | replace('/','%2F') }}" method: GET status_code: 200 validate_certs: no return_content: yes headers: X-NITRO-USER: "{{ nitro_user | default('nsroot') }}" X-NITRO-PASS: "{{ nitro_pass | default('nsroot') }}" register: result - name: Save Netscaler system backup to backup directory local_action: "shell echo '{{ result.json.systemfile[0].filecontent }}' | base64 -d > '{{ backup_location }}/{{ inventory_hostname }}_{{ lookup('pipe', 'date +%Y%m%d') }}_nsbackup.tgz'" - name: Chmod saved backup file permissions local_action: module: file path: "{{ backup_location }}/{{ inventory_hostname }}_{{ lookup('pipe', 'date +%Y%m%d') }}_nsbackup.tgz" mode: 0644 always: - name: Delete system backup from Netscaler local_action: module: uri url: "https://{{ inventory_hostname }}/nitro/v1/config/systembackup/{{ inventory_hostname | hash('md5') }}.tgz" method: DELETE validate_certs: no return_content: yes headers: X-NITRO-USER: "{{ nitro_user | default('nsroot') }}" X-NITRO-PASS: "{{ nitro_pass | default('nsroot') }}" - name: Locate backup files older than 90 days local_action: module: find paths: "{{ backup_location }}" age: "1d" run_once: true register: files_matched - name: Purge old backup files local_action: module: file path: "{{ item.path }}" state: absent run_once: true with_items: "{{ files_matched.files }}" when: stat_result.stat.exists == False |