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

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 ID | Portlar |
|---|---|---|
| MUHASEBE | 10 | ge-0/0/0 – ge-0/0/3 |
| IK | 20 | ge-0/0/4 – ge-0/0/7 |
| CUSTOMER | 30 | ge-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.