Citrix ADC (NetScaler) Backup mit Ansible

Table of Contents

Beschreibung

Citrix ADC, bis vor einer Weile noch als Citrix NetScaler bekannt ist eine Netzwerk Appliance welche als Access Gateway und Proxy verwendet werden kann. In diesem Artikel werden wir ein kleines Ansible Playbook schreiben, mit welchem man einen Citrix ADC sichern kann.

Ansible Config

Als erster Schritt definieren wir die Ansible Konfiguration: ansible.cfg

[defaults]
interpreter_python=auto_silent

[ssh_connection]
# allows new host keys once
ssh_args = -o StrictHostKeyChecking=accept-new

Dabei ist wichtig das du deine Secrets mit dem vault_password_file verschlüsselst.

Inventar

Nun erstellen wir uns eine Datei inventory.yamlmit dem folgenden Inhalt:

---
# yamllint disable rule:line-length

all:
  hosts:
  children:
    citrix_adc:
      hosts:
        netscaler01
        netscaler02

die Hosts müssen dabei natürlich den FQDN Namen deiner ADCs entsprechen.

Playbook

Auch das Playbook selbst ist nicht sehr spannend, von hier aus werden wir dann die Rolle mit dem eigentlich spannenden Inhalt anstossen: playbook.yaml

---

- hosts: citrix_adc
  gather_facts: false
  roles:
    - citrix_adc

Rolle citrix_adc

Nun kommt der Spannende Inhalt, wir erstellen nun folgende Ordnerstruktur und main.yaml Dateien:

└── roles
    └── citrix_adc
        ├── tasks
        │   └── main.yaml
        └── vars
            └── main.yaml

der Inhalt der task/main.yaml Datei ist wiefolgt:

---
# yamllint disable rule:line-length

- name: Delete all old backups from local
  delegate_to: localhost
  file:
    path: "{{ dest_path }}/{{ inventory_hostname }}"
    state: absent

- name: Generate new Citrix ADC system backup
  delegate_to: localhost
  command: ssh -l backuper {{ inventory_hostname }} "create system backup -level full {{ backup_file }}"
  register: command_result
  failed_when: "'Resource already exists' in command_result.stdout"

- name: Create new empty directory
  delegate_to: localhost
  file:
    path: "{{ dest_path }}/{{ inventory_hostname }}"
    state: directory
    mode: '0755'

- name: Download backup file from Citrix ADC to local folder
  delegate_to: localhost
  command: /bin/scp backuper@{{ inventory_hostname }}:/var/ns_sys_backup/{{ backup_file }}.tgz {{ dest_path }}/{{ inventory_hostname }}/{{ backup_file }}.tgz

- name: delete backup from ADC
  delegate_to: localhost
  command: ssh -l backuper {{ inventory_hostname }} "rm backup {{ backup_file }}.tgz"

der Inhalt der vars/main.yaml Datei ist wiefolgt:

---
# yamllint disable rule:line-length

dest_path: "/var/git/ndcb-data"
backup_file: "backup_full_{{ inventory_hostname }}_{{ lookup('pipe','date +%Y-%m-%d-%H') }}"

Secrets

Was noch fehlt sind die Secrets. Wir werden jedoch in diesem Fall gar keine Secrets verwenden, sondern direkt mit SSH-Key Authentifizieren. Dazu mussst du auf deinem Gerät einen neues SSH-Key Pair generieren und anschliessend wie folgt auf den Citrix ADCs als authorized keys erlauben:

  1. Auf ADCs einloggen und unter diesem Pfad dein PublicKey eintragen: /nsconfig/ssh/authorized_keys :
    ssh-rsa AAAAB3NzaC1.....
  2. Anschliessend kannst du den Citrix ADC Host neustarten (z.b. wenn er nur im Seconday Mode ist), noch einfacher ist, wenn du einfach den sshd Service neustartest, was auf dem Citrix ADC relativ brachial ist:
    kill -HUP `cat /var/run/sshd.pid`

Run

Das Playbook kann nun wiefolgt ausgeführt werden:

ansible-playbook playbook.yaml -i inventory.yaml