W świecie inżynierii sieci i systemów oraz administracji IT, automatyzacja stała się kluczowym elementem codziennej pracy. Wiele osób w tej branży kojarzy automatyzację głównie z językiem Python, który dzięki swojej prostocie i wszechstronności zdobył ogromną popularność. Jednak warto pamiętać, że Python to tylko jedno z wielu narzędzi dostępnych na rynku. Jest najpopularniejszych z języków programowania, jeżeli chodzi o pisanie skryptów do automatyzacji. Ale nie jest jedynym.  

Oprócz Pythona istnieje wiele innych języków programowania i narzędzi, które mogą być równie skuteczne, a w niektórych przypadkach nawet lepiej dopasowane do specyficznych zadań automatyzacji. W tym artykule przyjrzymy się kilku alternatywom, które mogą zainteresować inżynierów sieci i systemów oraz administratorów IT. 

Pokażemy sposoby wykonania prostego zadania za pomocą opisywanych narzędzi. Zadanie to będzie polegało na odczytaniu stanu interfejsów routera poprzez wykonanie na nim polecenia „show interfaces status”.  

W Python implementacja takiego skryptu będzie wyglądała następująco: 

# Konfiguracja SSH
hostname = "router_address"
port = 22
username = "username"
password = "password"
# Nawiązanie połączenia
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname, port, username, password)
# Uruchomienie komendy
stdin, stdout, stderr = client.exec_command("show interfaces status")
# Odczyt stanu interfejsów
interfaces_status = stdout.read().decode()
print(interfaces_status)
# Zamknięcie połączenia
client.close()

Golang (Go) 

Golang, znany również jako Go, to język programowania stworzony przez Google, który zdobywa coraz większą popularność wśród inżynierów sieci i systemów. Jego główne zalety to wysoka wydajność, łatwość pisania i utrzymania kodu oraz wbudowane wsparcie dla współbieżności. Golang, w przeciwieństwie do Pythona, jest kompilowanym językiem programowania, co sprawia, że jego kod wykonuje się szybciej w porównaniu do interpretowanego Pythona. W kontekście automatyzacji sieci, gdzie czas reakcji i wydajność mogą być krytyczne, Golang może mieć przewagę. Charakteryzuje się on prostą składnią i silnym typowaniem, co może prowadzić do bardziej czytelnego i mniej podatnego na błędy kodu.  

Python, z drugiej strony, jest znany ze swojej prostoty i łatwości nauki, co może być istotne dla początkujących programistów. Jednym z największych atutów Golanga jest jego wbudowane wsparcie dla współbieżności za pomocą gorutyn, co pozwala na efektywne wykonywanie wielu zadań równocześnie. Python posiada mechanizmy współbieżności, takie jak asyncio, ale są one mniej intuicyjne i mogą być trudniejsze w użyciu. Python posiada ogromny ekosystem bibliotek i narzędzi do automatyzacji sieci, takich jak Paramiko do obsługi SSH czy Netmiko do zarządzania urządzeniami sieciowymi. Golang ma również rosnący ekosystem, ale nie jest jeszcze tak rozbudowany jak ten dla Pythona. 

Implementacja zadania w języku Go będzie zawierała nieco więcej linii, niż ta, którą pokazałem w Pythonie. Może też wydawać się nieco mniej czytelna szczególnie dla początkującego programisty. 

package main
import (
    "fmt"
    "golang.org/x/crypto/ssh"
    "io/ioutil"
    "log"
    "strings"
)
func main() {
    // Konfiguracja SSH
    config := &ssh.ClientConfig{
        User: "username",
        Auth: []ssh.AuthMethod{
            ssh.Password("password"),
        },
        HostKeyCallback: ssh.InsecureIgnoreHostKey(),
    }
    // Nawiązanie połączenia
    client, err := ssh.Dial("tcp", "router_address:22", config)
    if err != nil {
        log.Fatalf("Failed to dial: %s", err)
    }
    defer client.Close()
    // Uruchomienie komendy
    session, err := client.NewSession()
    if err != nil {
        log.Fatalf("Failed to create session: %s", err)
    }
    defer session.Close()
    // Odczyt stanu interfejsów
    output, err := session.Output("show interfaces status")
    if err != nil {
        log.Fatalf("Failed to run command: %s", err)
    }
    fmt.Println(string(output))
}

Ruby

Ruby to język programowania, który zdobył popularność dzięki swojej eleganckiej składni i dużemu ekosystemowi bibliotek. Jego elastyczność i łatwość w pisaniu skryptów sprawiają, że jest to atrakcyjny wybór dla wielu inżynierów sieci i administratorów IT. Ruby jest szczególnie znany w środowiskach DevOps, gdzie narzędzia takie jak Chef wykorzystują go do zarządzania konfiguracją i automatyzacji procesów. 

Ruby jest znany ze swojej eleganckiej i czytelnej składni, która przypomina język naturalny. Python również cechuje się prostotą i czytelnością, ale Ruby jest często chwalony za bardziej „ludzką” składnię, co może zwiększyć przyjemność z pisania kodu. Python posiada ogromny ekosystem bibliotek i narzędzi do automatyzacji sieci, takich jak Paramiko i Netmiko. Ruby także ma swoje narzędzia, takie jak Net::SSH do obsługi SSH. Pod względem wydajności, Ruby i Python są do siebie zbliżone, chociaż Python zazwyczaj jest nieco szybszy. W kontekście automatyzacji sieci różnice te są często pomijalne, chyba że mamy do czynienia z bardzo wymagającymi zadaniami. Warto też zwrócić uwagę na to, że Python ma większą i bardziej aktywną społeczność, co przekłada się na więcej dostępnych zasobów, takich jak biblioteki, dokumentacja i fora. Ruby również ma silną społeczność, ale jest ona mniejsza w porównaniu do Pythona. 

Implementacja naszego skryptu w Ruby przedstawia się następująco: 

require 'net/ssh'
# Konfiguracja SSH
hostname = 'router_address'
username = 'username'
password = 'password'
# Nawiązanie połączenia
Net::SSH.start(hostname, username, password: password) do |ssh|
  # Uruchomienie komendy
  output = ssh.exec!("show interfaces status")
  
  # Odczyt stanu interfejsów
  puts output
end

Ansible

Ansible to potężne narzędzie do automatyzacji konfiguracji, zarządzania systemami oraz wdrażania aplikacji. Jest szczególnie cenione wśród inżynierów sieci i administratorów IT za swoją prostotę, elastyczność i niewymagającą agentów architekturę. Ansible pozwala na automatyzację zadań w sposób deklaratywny, co znaczy, że użytkownik określa, co chce osiągnąć, a Ansible zajmuje się resztą. Ansible używa łatwego do zrozumienia języka YAML do definiowania zadań i konfiguracji. Dzięki temu konfiguracje są czytelne i łatwe do napisania, nawet dla osób, które nie są programistami. Co ważne nie wymaga instalowania agentów na zarządzanych urządzeniach. Wykorzystuje SSH do komunikacji z nimi, co upraszcza wdrażanie i zmniejsza wymagania dotyczące konserwacji. Ansible jest w stanie zarządzać zarówno małymi sieciami, jak i dużymi infrastrukturami. Dzięki modularnej architekturze i możliwościom równoległego wykonywania zadań, Ansible jest skalowalne i wydajne. Posiada też bogaty ekosystem modułów, które wspierają różnorodne urządzenia sieciowe i systemy operacyjne. Istnieje również duża społeczność, która tworzy i udostępnia dodatkowe moduły oraz role. 

 Playbook realizujący nasze zadanie w Ansible wyglądać może następująco: 

---
- name: Odczyt stanu interfejsów z routera
  hosts: routers
  tasks:
    - name: Show interfaces status
      ansible.builtin.command:
        cmd: show interfaces status
      register: interfaces_status
    - name: Wyświetlenie stanu interfejsów
      ansible.builtin.debug:
        msg: "{{ interfaces_status.stdout }}"

Terraform

Terraform, stworzony przez HashiCorp, to narzędzie do zarządzania infrastrukturą jako kodem (IaC). Umożliwia definiowanie, wdrażanie i zarządzanie infrastrukturą w sposób deklaratywny, co oznacza, że opisujemy pożądany stan infrastruktury, a Terraform zajmuje się jej uruchomieniem i utrzymaniem. Terraform jest szczególnie popularny w środowiskach DevOps i chmurowych, ale ma również zastosowanie w automatyzacji sieci. Podobnie jak Ansible, Terraform umożliwia deklaratywne definiowanie stanu końcowego infrastruktury. Dzięki temu łatwiej jest utrzymać spójność konfiguracji i zarządzać infrastrukturą. Jedną z kluczowych funkcji Terraform jest możliwość generowania planów zmian (tzw. „terraform plan”). Przed zastosowaniem jakichkolwiek zmian, Terraform wyświetla, co zamierza zrobić, co pozwala na dokładne zrozumienie wpływu modyfikacji przed ich wdrożeniem. Terraform wspiera modularność, co oznacza, że można tworzyć i używać modułów – zbiory konfiguracji, które mogą być wielokrotnie używane w różnych projektach. Moduły ułatwiają zarządzanie skomplikowanymi infrastrukturami poprzez ponowne wykorzystanie kodu. Terraform przechowuje stan infrastruktury, co pozwala na śledzenie i kontrolowanie zmian w czasie. Stan ten jest kluczowy dla dokładnego zarządzania i utrzymania infrastruktury. 

Terraform jest idealnym narzędziem do definiowania i zarządzania infrastrukturą jako kodem (IaC), takich jak tworzenie zasobów w chmurze (instancje EC2, VPC, S3 w AWS itp.), ale nie jest przeznaczony do bezpośredniego zarządzania konfiguracją urządzeń sieciowych poprzez SSH. Dlatego naszego zadania w Terraformie bezpośrednio nie zaimplementujemy. Pokazuje to też, że dobór narzędzi automatyzacji jest bardzo ważny, bo nie wszystkie zadania wykonamy w każdym z nich. 

I choć Terraform nie wspiera bezpośredniego zarządzania po SSH, to istnieje możliwość użycia Terraform do uruchomienia zadań Ansible poprzez integrację obu narzędzi. Możemy użyć Terraform do uruchomienia skryptów Ansible, które następnie wykonają potrzebne zadania na urządzeniach sieciowych. Poniżej znajduje się przykładowy sposób, jak to można zrobić – używamy Terraforma do uruchomienia playbooka Ansible z poprzedniej części. 

provider "local" {}
resource "local_file" "ansible_inventory" {
  content  =  << EOF
[routers]
router1 ansible_host=${var.router_address} ansible_user=${var.username} ansible_password=${var.password}
EOF
  filename = "${path.module}/ansible/inventory"
}
resource "null_resource" "ansible_playbook" {
  provisioner "local-exec" {
    command = "ansible-playbook -i ${path.module}/ansible/inventory ${path.module}/ansible/playbook.yml"
  }
  triggers = {
    always_run = "${timestamp()}"
  }
}
variable "router_address" {
  description = "Adres IP routera"
}
variable "username" {
  description = "Nazwa użytkownika"
}
variable "password" {
  description = "Hasło"
}

Podsumowanie

Automatyzacja sieci i systemów to kluczowy element współczesnej infrastruktury IT. Chociaż Python jest niezwykle popularnym narzędziem do automatyzacji dzięki swojej prostocie i wszechstronności, warto znać alternatywy, które mogą być lepiej dopasowane do konkretnych zadań. 

Golang oferuje wysoką wydajność, prostotę utrzymania kodu oraz wbudowane wsparcie dla współbieżności, co czyni go atrakcyjnym wyborem dla skomplikowanych i wydajnościowych zadań automatyzacji sieci. Ruby, z kolei, wyróżnia się elegancką składnią i silnym wsparciem w ekosystemie DevOps, zwłaszcza z narzędziami takimi jak Chef. Jeśli chodzi o narzędzia do zarządzania infrastrukturą, Ansible i Terraform są wiodącymi rozwiązaniami. Ansible, z jego prostotą i deklaratywnym podejściem, jest idealny do zarządzania konfiguracją urządzeń sieciowych bez potrzeby instalacji agentów. Terraform, natomiast, doskonale sprawdza się w zarządzaniu infrastrukturą jako kodem, umożliwiając planowanie i śledzenie zmian w środowiskach chmurowych i fizycznych. Integracja Ansible z Terraformem pozwala na wykorzystanie zalet obu narzędzi, oferując kompleksowe rozwiązanie do zarządzania i automatyzacji infrastruktury sieciowej. Choć Terraform nie jest przeznaczony do bezpośredniego zarządzania urządzeniami sieciowymi poprzez SSH, jego współpraca z Ansible pozwala na osiągnięcie tego celu w sposób efektywny i spójny. 

Podsumowując, wybór odpowiedniego narzędzia do automatyzacji powinien zależeć od specyficznych wymagań i kontekstu zadania. Znajomość różnych narzędzi i języków programowania, takich jak Golang, Ruby, Ansible i Terraform, pozwala inżynierom sieci i administratorom IT na elastyczne i skuteczne zarządzanie swoimi infrastrukturami, prowadząc do zwiększenia wydajności i spójności operacyjnej. 

Zainteresował Cię ten artykuł i chcesz dowiedzieć się więcej o automatyzacji z wykorzystaniem języka Python lub innych narzędzi? Koniecznie sprawdź portal Szkoła DevNet prowadzony przez Piotra, a także z przygotowanymi przez niego szkoleniami on-line (https://showroute.pl/edu/) między innymi z automatyzacji z wykorzystaniem Python i Ansible.