Osoby tworzące playbooki Ansible, często zapominają o tym, że to nie jest tak, że Ansible robi wszystkie operacje samodzielnie. Tak na prawdę Ansible to tylko silnik, który jest zależny od innych narzędzi zapewniających specyficzne funkcjonalności. Takie jak na przykład połączenia SSH ze zdalnymi urządzeniami. Czasem, te narzędzia trzeba dodatkowo skonfigurować, tak by móc je elastycznie wykorzystywać do naszych potrzeb, lub by zapewnić odpowiedni poziom bezpieczeństwa. W tym wpisie będzie krótko o symbiozie Ansible i Paramiko z kluczami SSH w tle.
Symbioza Ansible i Paramiko
Ansible to narzędzie do automatyzacji konfiguracji i zarządzania systemami. Umożliwia zdalne zarządzanie wieloma maszynami za pomocą jednego polecenia. Paramiko to biblioteka Pythona, która pozwala na tworzenie połączeń SSH i SFTP. Umożliwia interakcję z zdalnymi systemami przez SSH. Ansible używa Paramiko do zarządzania zdalnymi serwerami. Paramiko obsługuje komunikację SSH, a Ansible wykorzystuje ją do wykonywania zadań na wielu serwerach.
W kolekcji cisco.ios, która służy do zarządzania konfiguracją urządzeń, biblioteka Paramiko odgrywa kluczową rolę. Kolekcja cisco.ios używa Paramiko do bezpiecznego łączenia się z urządzeniami przez SSH, co pozwala na zarządzanie konfiguracją zdalnie. W przypadku wykonywania zadań takich jak wgrywanie konfiguracji czy zbieranie informacji o stanie urządzenia, cisco.ios polega na Paramiko, aby zapewnić stabilne połączenie i przesyłanie danych. Paramiko obsługuje uwierzytelnianie przy użyciu kluczy SSH, co podnosi poziom bezpieczeństwa. Gdy Ansible uruchamia moduły z kolekcji cisco.ios, Paramiko realizuje operacje związane z przesyłaniem komend i odbieraniem wyników. Pozwala to na automatyzację zarządzania konfiguracją i monitorowanie urządzeń Cisco w sposób efektywny i bezpieczny.
Dostępne metody logowania
Biblioteka Paramiko obsługuje kilka metod uwierzytelniania, które umożliwiają bezpieczne łączenie się z zdalnymi serwerami przez SSH. Dostępne metody to:
Uwierzytelnianie za pomocą hasła: Użytkownik podaje nazwę użytkownika i hasło. Paramiko przesyła dane do serwera SSH, który weryfikuje uwierzytelnienie.
Uwierzytelnianie za pomocą kluczy SSH: Użytkownik generuje parę kluczy (publiczny i prywatny). Klucz publiczny jest umieszczany na serwerze, a klucz prywatny używany do logowania. Paramiko używa klucza prywatnego do nawiązywania połączenia.
Uwierzytelnianie z użyciem agentów kluczy: Paramiko może korzystać z agentów kluczy, takich jak
ssh-agent
, które przechowują klucze prywatne i automatycznie dostarczają je podczas uwierzytelniania.Uwierzytelnianie za pomocą certyfikatów: Paramiko wspiera także uwierzytelnianie z użyciem certyfikatów, które mogą być używane do zapewnienia dodatkowej warstwy bezpieczeństwa.
Problem z logowaniem do urządzeń
Gdy korzytamy z Ansible i połączeń realizowanych za pomocą biblioteki Paramiko możemy napotkać problem. Wystarczy, że w katalogu ~/.ssh
znajduje się plik id_rsa
. Jest to plik zawierający klucz prywatny używanym w systemie SSH do uwierzytelniania. Podczas łączenia się z serwerem, klient SSH używa klucza prywatnego do udowodnienia swojej tożsamości. Serwer weryfikuje, czy klucz publiczny odpowiada kluczowi prywatnemu.
Jeżeli plik id_rsa istnieje, to Paramiko używane przez moduły Ansible domyślnie będzie chciało użyć metody uwierzytelniania za pomocą kluczy SSH. Nawet jeżeli urządzenie sieciowe nie ma takiej metody skonfigurowanej, ani włączonej. Nie pomagają opcje ustawione w konfiguracji klienta SSH w systemie (~/.ssh/config) ani opcje przekazywane jako parametry połączenia SSH w playbooku czy konfiguracji hosta w inventory.
Komunikat błędu w takim przypadku może wyglądać następująco:
fatal: [172.20.1.202]: FAILED! => {"changed": false, "msg": "Failed to authenticate: Authentication failed: transport shut down or saw EOF"}
Rozwiązaniem, jest całkowite wyłączenie uwierzytelniania za pomocą kluczy w pliku ansible.cfg w sekcji parametrów specyficznych dla biblioteki Paramiko:
[paramiko_connection] look_for_keys = False
Dopiero przy takiej konfiguracji playbook Ansible zaloguje się do urządzenia za pomocą loginu i hasła.