Home » Genel » Ansible ile Juniper Switch Config Yedeği Alma ve VLAN Yönetimi

Ansible ile Juniper Switch Config Yedeği Alma ve VLAN Yönetimi

Network altyapılarında bulunan switch ve router cihazlarının konfigürasyonlarını düzenli olarak yedeklemek, ağ yönetiminin önemli parçalarından biridir. Özellikle birden fazla network cihazının bulunduğu ortamlarda konfigürasyon yedeklerini manuel olarak almak hem zaman kaybına neden olur hem de operasyonel hata riskini artırır.

Ansible, network cihazlarının yönetimini ve konfigürasyon işlemlerini otomatikleştirmek için kullanabileceğimiz güçlü bir otomasyon aracıdır.

Ansible ile Juniper switch cihazlarının konfigürasyon yedeklerini otomatik olarak alabilir, bu yedekleri GitHub üzerinde saklayabilir ve ihtiyaç duyduğumuzda cihazların konfigürasyonlarını merkezi olarak yönetebiliriz.

Bu yazıda Juniper switch cihazları üzerinde Ansible kullanarak:

  • Network cihazlarından konfigürasyon yedeği almayı,
  • Cihaz bilgilerini ve yazılım sürümlerini öğrenmeyi,
  • Alınan yedekleri GitHub reposuna göndermeyi,
  • VLAN yapılandırmalarını otomatikleştirmeyi,
  • Switch portlarını Access ve Trunk olarak yapılandırmayı

adım adım inceleyeceğiz.

1. Ansible ve Juniper için gerekli kurulumlar

Öncelikle Ansible’ın çalışacağı Linux makinemizde gerekli Python modüllerini ve Ansible koleksiyonlarını kurmamız gerekiyor.

Juniper cihazlarıyla NETCONF üzerinden haberleşebilmek için aşağıdaki Python paketlerini yükleyelim:

pip install junos-eznc jxmlease ncclient

Ardından Juniper Ansible koleksiyonunu yükleyelim:

ansible-galaxy collection install juniper.device

NETCONF bağlantısı için gerekli Ansible koleksiyonunun da kurulu olduğundan emin olalım:

ansible-galaxy collection install ansible.netcommon

Kurulumları kontrol etmek için:

ansible-galaxy collection list

2. Ansible yapılandırma dosyasını oluşturma

İlk olarak proje dizinimiz içerisinde ansible.cfg isimli yapılandırma dosyasını oluşturalım.

[defaults]
inventory = hosts
deprecation_warnings = False

Bu yapılandırma sayesinde Ansible, varsayılan envanter dosyası olarak hosts dosyasını kullanacaktır.

3. Ansible Vault ile kullanıcı bilgilerini güvenli saklama

Network cihazlarına bağlantı kurarken kullanıcı adı ve şifre bilgilerini doğrudan envanter dosyasında tutmak güvenlik açısından doğru bir yaklaşım değildir.

Bunun yerine Ansible Vault kullanarak hassas bilgileri şifreli şekilde saklayabiliriz.

Öncelikle aşağıdaki komutla Vault dosyamızı oluşturalım:

ansible-vault create vault.yml

Komutu çalıştırdığımızda bizden bir Vault parolası istenecektir. Bu parolayı belirledikten sonra dosya içerisine aşağıdaki bilgileri ekleyelim:

username: "ansible"
password: "ansiblepassword"

Böylece network cihazlarına bağlantı için kullanacağımız kullanıcı bilgileri şifrelenmiş bir dosyada saklanacaktır.

4. Juniper cihazlarını Ansible Inventory dosyasına ekleme

Şimdi Ansible’ın yöneteceği Juniper switch cihazlarını hosts dosyasına ekleyelim.

---
all:
  children:
    juniper_devices:
      hosts:
        Host_1:
          ansible_host: 192.168.1.252

        Host_2:
          ansible_host: 192.168.1.253

      vars:
        ansible_user: "{{ username }}"
        ansible_password: "{{ password }}"

Burada iki adet Juniper switch tanımladık.

  • ansible_host: Cihazın IP adresini belirtir.
  • ansible_user: Bağlantı kurulacak kullanıcı adını belirtir.
  • ansible_password: Bağlantı şifresini belirtir.

Kullanıcı adı ve şifre bilgileri daha önce oluşturduğumuz Vault dosyasından alınacaktır.

5. Juniper switch konfigürasyon yedeği alma

Şimdi asıl işlemi gerçekleştirelim. Ansible kullanarak Juniper switch cihazlarının mevcut konfigürasyonlarını otomatik olarak yedekleyeceğiz.

Öncelikle backup_juniper.yml isimli playbook dosyamızı oluşturalım.

---
- name: Juniper Switch Configuration Backup
  hosts: juniper_devices
  gather_facts: false

  connection: ansible.netcommon.netconf

  collections:
    - juniper.device

  tasks:

    - name: Cihaz bilgilerini topla
      juniper.device.junos_facts:
      register: junos_facts_output

    - name: Cihaz modelini ve versiyonunu yazdır
      debug:
        msg:
          - "Model: {{ ansible_facts.net_model }}"
          - "Version: {{ ansible_facts.net_version }}"

    - name: Juniper konfigürasyon yedeğini al
      juniper.device.junos_config:
        backup: true
        backup_options:
          backup_format: text
          dir_path: backups
          filename: "{{ inventory_hostname }}.conf"

Bu playbook içerisinde üç temel işlem gerçekleştiriyoruz.

Cihaz bilgilerini toplama: junos_facts modülü ile Juniper cihazının donanım ve yazılım bilgilerini alıyoruz.

Cihaz bilgilerini görüntüleme: debug modülü ile cihazın model ve yazılım sürümünü ekrana yazdırıyoruz.

Konfigürasyon yedeği alma: junos_config modülündeki backup parametresi sayesinde cihazın mevcut konfigürasyonunu dosyaya kaydediyoruz.

Yedekler backups dizini altında cihaz isimleriyle oluşturulacaktır.

Playbook’u çalıştırmak için:

ansible-playbook backup_juniper.yml -e @vault.yml --ask-vault-pass

Böylece envanterde bulunan Juniper switch cihazlarının konfigürasyon yedekleri otomatik olarak alınacaktır.

6. Alınan konfigürasyon yedeklerini GitHub üzerinde saklama

github juniper backup repo

Konfigürasyon yedeklerini yalnızca yerel makinede saklamak yerine GitHub üzerinde tutmak daha sürdürülebilir bir yöntemdir.

Bu sayede:

  • Önceki konfigürasyonlara ulaşabiliriz.
  • İki farklı yedek arasındaki değişiklikleri karşılaştırabiliriz.
  • Yapılan değişikliklerin geçmişini takip edebiliriz.
  • Yedekleri merkezi bir depoda saklayabiliriz.

Öncelikle Linux makinemizde GitHub bağlantısı için SSH anahtarımızı tanımlamalı ve ilgili public key’i GitHub hesabımıza eklemeliyiz.

Ardından git_control.yml isimli playbook dosyamızı oluşturalım.

---
- name: Compare and commit configuration backups
  hosts: localhost
  connection: local
  gather_facts: true

  tasks:

    - name: Git repository kontrolü ve güncelleme
      ansible.builtin.git:
        repo: "[email protected]:ramazantufekci/juniper.git"
        dest: backups
        update: true
        version: main
      register: git_result

    - name: Git durumunu kontrol et
      ansible.builtin.command:
        cmd: git status --porcelain
        chdir: backups
      register: gitstatus
      changed_when: false

    - name: Değişiklikleri commit et ve GitHub'a gönder
      when: gitstatus.stdout != ""
      block:

        - name: Dosyaları Git'e ekle
          ansible.builtin.command:
            cmd: git add .
            chdir: backups

        - name: Commit oluştur
          ansible.builtin.command:
            cmd: >-
              git commit -m "Ansible Backup
              {{ ansible_date_time.iso8601 }}"
            chdir: backups

        - name: GitHub'a gönder
          ansible.builtin.command:
            cmd: git push origin main
            chdir: backups
          register: gitpush

        - name: Push sonucunu görüntüle
          ansible.builtin.debug:
            var: gitpush.stdout

Bu playbook öncelikle GitHub reposunu kontrol eder ve günceller. Ardından yerel yedek dosyalarında değişiklik olup olmadığını kontrol eder.

Herhangi bir değişiklik varsa dosyaları Git’e ekler, commit oluşturur ve GitHub reposuna gönderir.

Not: Yedekleme playbook’u ile Git playbook’unu ayrı çalıştırmak yerine bir ana playbook üzerinden sıralı şekilde çalıştırmak da mümkündür. Ayrıca GitHub reposunun private olması, SSH erişiminin doğru yapılandırılması ve yedeklerin hassas bilgiler içerip içermediğinin kontrol edilmesi önemlidir.

7. Ansible ile Juniper VLAN yapılandırması

Şimdiye kadar Juniper cihazlarının konfigürasyon yedeklerini almayı ve GitHub üzerinde saklamayı gördük.

Ansible yalnızca yedekleme için değil, network cihazlarının konfigürasyon işlemlerini otomatikleştirmek için de kullanılabilir.

Örneğin yeni bir VLAN oluşturmak, switch portlarını Access veya Trunk olarak yapılandırmak gibi işlemleri Ansible playbook’ları üzerinden gerçekleştirebiliriz.

Öncelikle proje dizinimiz içerisinde group_vars/juniper.yml isimli dosyamızı oluşturalım.

VLAN değişkenlerini tanımlama

---
vlans:

  - name: MUHASEBE
    id: 10
    ports:
      - ge-0/0/0
      - ge-0/0/1
      - ge-0/0/2
      - ge-0/0/3

  - name: IK
    id: 20
    ports:
      - ge-0/0/4
      - ge-0/0/5
      - ge-0/0/6
      - ge-0/0/7

  - name: CUSTOMER
    id: 30
    ports:
      - ge-0/0/8
      - ge-0/0/9
      - ge-0/0/10
      - ge-0/0/11

trunk_port: ge-0/0/23

trunk_vlans:
  - MUHASEBE
  - IK
  - CUSTOMER

Bu dosyada üç farklı VLAN tanımladık.

VLAN adıVLAN IDPortlar
MUHASEBE10ge-0/0/0 – ge-0/0/3
IK20ge-0/0/4 – ge-0/0/7
CUSTOMER30ge-0/0/8 – ge-0/0/11

Ayrıca ge-0/0/23 portunu trunk olarak kullanacağımızı ve üç VLAN’ın da bu port üzerinden taşınacağını belirttik.

VLAN yapılandırma görevlerini oluşturma

Şimdi VLAN oluşturma ve port atama işlemlerini gerçekleştirecek vlan_config_ports.yml dosyasını oluşturalım.

---
- name: Interfaces VLAN settings
  juniper.device.junos_config:
    lines:
      - "set interfaces {{ item }} unit 0 family ethernet-switching interface-mode access"
      - "set interfaces {{ item }} unit 0 family ethernet-switching vlan members {{ vlan_data.name }}"
    comment: "Ansible VLAN Configuration"
  loop: "{{ vlan_data.ports }}"

Burada vlan_data değişkeni üzerinden ilgili VLAN’ın adını ve port listesini alıyoruz.

Her port için Access modunu etkinleştiriyor ve ilgili VLAN’a dahil ediyoruz.

Ana VLAN yapılandırma playbook’u

Şimdi vlan_config.yml isimli ana playbook dosyamızı oluşturalım.

---
- name: Configure VLANs on Juniper
  hosts: juniper_devices
  gather_facts: false

  connection: ansible.netcommon.netconf

  collections:
    - juniper.device

  vars_files:
    - group_vars/juniper.yml

  tasks:

    - name: VLAN yapılandırmalarını oluştur
      include_tasks: vlan_config_ports.yml
      loop: "{{ vlans }}"
      loop_control:
        loop_var: vlan_data

    - name: Trunk port yapılandırması
      juniper.device.junos_config:
        lines:
          - "set interfaces {{ trunk_port }} unit 0 family ethernet-switching interface-mode trunk"
        comment: "Ansible Trunk Configuration"

    - name: Trunk VLAN üyeliklerini tanımla
      juniper.device.junos_config:
        lines:
          - "set interfaces {{ trunk_port }} unit 0 family ethernet-switching vlan members {{ item }}"
        comment: "Ansible Trunk VLAN Configuration"
      loop: "{{ trunk_vlans }}"

    - name: Konfigürasyonu commit et
      juniper.device.junos_config:
        confirm_commit: true

    - name: VLAN durumlarını kontrol et
      juniper.device.junos_command:
        commands:
          - show vlans
          - show ethernet-switching interfaces
      register: vlan_status

    - name: VLAN sonuçlarını görüntüle
      debug:
        var: vlan_status.stdout

Bu playbook ile önce VLAN’ların Access portlarını yapılandırıyoruz. Ardından trunk portunu belirleyerek ilgili VLAN’ları bu porta ekliyoruz.

Son olarak konfigürasyonu commit ediyor ve VLAN durumlarını kontrol ediyoruz.

Önemli: Bu örnek Juniper EX serisi ve klasik Ethernet switching yapılandırması için hazırlanmıştır. Cihaz modeli, Junos sürümü ve mevcut VLAN yapılandırmasına göre komutların uyarlanması gerekebilir. Ayrıca gerçek ortamda commit öncesinde değişiklikleri kontrol etmek, commit confirmed kullanmak ve gerektiğinde rollback planı bulundurmak önemlidir. confirm_commit parametresinin kullanımını kurulu juniper.device sürümünün modül dokümantasyonuyla doğrulamalısınız.

8. NETCONF bağlantısını Juniper switch üzerinde etkinleştirme

Ansible ile Juniper cihazları arasında NETCONF bağlantısı kurabilmek için cihaz üzerinde NETCONF servisinin SSH üzerinden etkinleştirilmesi gerekir.

Juniper switch üzerinde aşağıdaki komutu çalıştıralım:

configure
set system services netconf ssh
commit

Bu işlemden sonra Ansible, NETCONF protokolü üzerinden Juniper switch ile haberleşebilir.

Bağlantıyı kullanmadan önce SSH erişimini, kullanıcı yetkilerini ve TCP 830 portunun erişilebilirliğini de kontrol etmeliyiz.

9. Projeyi çalıştırma

Projemizin dosya yapısı aşağıdaki gibi olacaktır:

juniper-ansible/
│
├── ansible.cfg
├── hosts
├── vault.yml
│
├── backup_juniper.yml
├── git_control.yml
├── vlan_config.yml
├── vlan_config_ports.yml
│
├── group_vars/
│   └── juniper.yml
│
└── backups/

Yedekleme işlemini başlatmak için:

ansible-playbook backup_juniper.yml -e @vault.yml --ask-vault-pass

VLAN yapılandırmasını uygulamak için:

ansible-playbook vlan_config.yml -e @vault.yml --ask-vault-pass

GitHub senkronizasyonu için:

ansible-playbook git_control.yml

Böylece Juniper switch cihazlarımızın yedeklerini alabilir, bu yedekleri GitHub üzerinde saklayabilir ve VLAN yapılandırmalarını Ansible üzerinden yönetebiliriz.

Sonuç

Ansible kullanarak network cihazlarının yönetimini otomatikleştirmek, özellikle çok sayıda switch ve router bulunan altyapılarda önemli avantajlar sağlar.

Bu örnekte Juniper switch cihazları üzerinde NETCONF bağlantısı kurarak konfigürasyon yedekleme, GitHub entegrasyonu ve VLAN yapılandırma işlemlerini gerçekleştirdik.

Bu yapıyı geliştirerek günlük otomatik yedekleme, konfigürasyon değişikliklerinin takibi, farklı VLAN senaryolarının uygulanması ve birden fazla network cihazının merkezi olarak yönetilmesi gibi işlemleri de otomatik hale getirebiliriz.

Yorum yapın