English · Ελληνικά
Έναν router τον ρυθμίζεις με το χέρι. Είκοσι routers σε είκοσι sites τους ρυθμίζεις με το χέρι μία φορά, και μετά περνάς τη ζωή σου κάνοντας login σε αυτούς έναν-έναν για να αλλάξεις έναν server DNS. Ορίστε πώς οδηγείς ένα fleet από boxes RouterOS από ένα μέρος — το REST API, το Ansible, και ένα scripted push που παραμένει idempotent. Το post Ansible της Cisco, σε RouterOS.
Το χειροκίνητο configuration δεν κάνει scale, και δεν παραμένει συνεπές — ολόκληρος ο λόγος που ένα fleet παρασύρεται σε είκοσι ελαφρώς-διαφορετικά snowflakes είναι ότι κάθε αλλαγή γράφτηκε με το χέρι σε όποιο box θυμήθηκε κάποιος. Το automation διορθώνει και τα δύο: μία πηγή αλήθειας, pushed παντού, επαληθεύσιμη. Το RouterOS 7 σου δίνει τρία επίπεδα αυτού. Το REST API είναι το low-level primitive — HTTP verbs πάνω σε paths /rest/…, scriptable από οτιδήποτε. Το Ansible (το collection community.routeros) είναι το declarative layer — περιέγραψε την επιθυμητή κατάσταση, άσ' το να συγκλίνει. Και το on-box scripting + scheduler (από το post scripting) χειρίζεται ό,τι είναι καλύτερο να γίνεται τοπικά.
Ο στόχος engineering σε όλο αυτό είναι η idempotency: το να τρέξεις το ίδιο push δύο φορές δεν αλλάζει τίποτα τη δεύτερη φορά. Πέτυχέ το και το automation είναι ασφαλές να τρέχει σε πρόγραμμα· χάσ' το και θα διπλασιάζεις κανόνες σε όλο το estate. Αυτό καθρεφτίζει το Cisco IOS: Managing a Fleet with Ansible — ίδια πειθαρχία, transports RouterOS.
api-ssl/REST μόνο στον host automation01
Το RouterOS 7 εκθέτει ολόκληρο το δέντρο μενού πάνω από REST. Κάθε path που ξέρεις από το CLI είναι ένα URL· το GET διαβάζει, το PUT προσθέτει, το PATCH επεξεργάζεται, το DELETE αφαιρεί. Οτιδήποτε μιλάει HTTP μπορεί τώρα να ρυθμίσει τον router.
> /ip service set www-ssl address=10.10.99.0/24 certificate=rest-cert disabled=no # Χρησιμοποίησε πραγματικό cert και περιόρισέ το στο subnet mgmt — αυτό είναι πλήρης έλεγχος.
# Διάβασμα: GET τον πίνακα διευθύνσεων σαν JSON. $ curl -sk -u auto:secret https://10.10.0.1/rest/ip/address | jq . # Αλλαγή: PATCH τον server DNS σε όλο το δέντρο με ένα call. $ curl -sk -u auto:secret -X POST https://10.10.0.1/rest/ip/dns/set \ -H 'Content-Type: application/json' -d '{"servers":"1.1.1.1,9.9.9.9"}' # Τύλιξέ το σε ένα for-loop πάνω σε μια λίστα hosts και άλλαξες 20 boxes.
02
Ένα loop πάνω από curl δουλεύει αλλά δεν είναι idempotent και δεν έχει μοντέλο state. Το collection community.routeros του Ansible σου δίνει inventory, modules desired-state, και dry-run — η ενήλικη εκδοχή της ίδιας ιδέας.
- hosts: mikrotiks gather_facts: no connection: ansible.netcommon.network_cli vars: ansible_network_os: community.routeros.routeros tasks: - name: Ensure NTP client config community.routeros.command: commands: - /system ntp client set enabled=yes servers=time.google.com - name: Read version (for a report) community.routeros.command: commands: [ /system resource print ] register: ver $ ansible-playbook -i inventory playbook.yml --check # dry run πρωτα
routeros_api εναντιον routeros_command
Το collection έχει δύο transports: το community.routeros.command (μέσω SSH, τρέχει γραμμές CLI) και το community.routeros.api (μέσω του binary API, δομημένο). Για push config, προτίμησε τα modules API όπου υπάρχουν — καταλαβαίνουν τα items με κλειδί .id του RouterOS και μπορούν πραγματικά να συγκλίνουν σε μια επιθυμητή κατάσταση, αντί να ξανατρέχουν τυφλά CLI που μπορεί να διπλασιάσει entries. Χρησιμοποίησε το command για reads και για μενού που τα modules API δεν καλύπτουν ακόμα.
03
Το failure mode ενός αφελούς automation είναι ο διπλασιασμός: ένα push που κάνει add έναν κανόνα firewall τον προσθέτει ξανά σε κάθε τρέξιμο. Η λύση είναι find-then-set, ώστε το δεύτερο τρέξιμο να είναι no-op.
# Αντί για ένα γυμνό add (που διπλασιάζει), έλεγξε πρώτα: > :if ([:len [/ip firewall address-list find list=MGMT address=10.10.99.0/24]] = 0) do={ \ /ip firewall address-list add list=MGMT address=10.10.99.0/24 } # Για ρυθμίσεις, το 'set' είναι φυσικά idempotent — προτίμησέ το από add/remove: > /ip dns set servers=1.1.1.1,9.9.9.9 # ίδιο αποτέλεσμα κάθε τρέξιμο
Μια λάθος εντολή γραμμένη σε έναν router είναι ένας χαλασμένος router· η ίδια εντολή pushed σε ένα fleet είναι διακοπή σε κάθε site ταυτόχρονα — συμπεριλαμβανομένου του management path που χρησιμοποιούσες για να τα φτάσεις. Πάντα dry-run (--check), stage σε ένα canary box, και ποτέ μην κάνεις push μια αλλαγή στην input-chain του firewall σε όλο το estate χωρίς προγραμματισμένο auto-revert ή δεύτερο access path. Η συνήθεια Safe Mode δεν προστατεύει τα API pushes — αυτή την ασφάλεια πρέπει να τη χτίσεις εσύ.
Βασικα Συμπερασματα
/rest/…, scriptable από οτιδήποτε.community.routeros του Ansible προσθέτει inventory, desired state, και dry-run — το declarative layer πάνω στις ίδιες λειτουργίες.set (φυσικά idempotent) από το add. Ένα δεύτερο τρέξιμο δεν πρέπει να αλλάζει τίποτα.Η διαχείριση πέντε sites με το χέρι σημαίνει πέντε ελαφρώς διαφορετικά configs μέσα σε έναν χρόνο. Χτίζω fleet automation για MikroTik και Cisco με μία πηγή αλήθειας και σταδιακά pushes, ώστε κάθε site να παραμένει συνεπές αντί να παρασύρεται σιωπηλά.
Κλεισε μια Discovery Call →