Ostatnio realizowałem szkolenie, w którym dość często musiałem reinstalować system operacyjny Linux na maszynach wirtualnych. Sama reinstalacja systemu i jego późniejsza konfiguracja nie sprawiały mi żadnego problemu. Mam przygotowane playbooki Ansible, które konfigurują system, instalują odpowiednie pakiety i wgrywają ich konfigurację. Problem pojawiał się z jednym krokiem – pierwszym logowaniem i wymuszoną zmianą hasła. Na szczęście w Ansible jest moduł expect
.
Moduł expect
W dystrybucji Ubuntu SSH jest domyślnie aktywne. Oznacza to, że po instalacji systemu możemy zalogować się na konto użytkownika ubuntu poprzez SSH. Pierwsze logowanie wymusza jednak zmianę hasła. Tak jak w przypadku wywołania komendy passwd
musimy wprowadzić stare hasło oraz dwa razy nowe. Tego kroku nie przeskoczymy – jeżeli nie zmienimy hasła to nie zostaniemy zalogowani i nie uzyskamy dostępu do shella.
Zmianę hasła możemy też zaprogramować. Z pomocą przychodzi nam moduł expect
. Za jego pomocą wywołamy dowolne polecenie powłoki. Moduł następnie będzie analizował to, co wywołany program wypisuje na konsoli. Jeżeli znajdzie podany przez nas wzorzec, to wprowadza na konsoli wskazany przez nas ciąg znaków. W ten sposób wyręcza nas we wprowadzaniu danych.
Z wykorzystaniem modułu expect
stworzyłem proste zadanie do playbooka Ansible, które wykorzystuję do zmiany hasła w trakcie pierwszego logowania.
--- - name: Change password on initial login delegate_to: 127.0.0.1 become: no expect: command: ssh -o "UserKnownHostsFile /dev/null" -o "StrictHostKeyChecking no" {{ ansible_ssh_common_args }} ubuntu@{{ inventory_hostname }} timeout: 20 responses: password: "{{ default_password }}" Current password: "{{ default_password }}" New password: "{{ temporary_password }}" new password: "{{ temporary_password }}" "\\~\\]\\$": exit register: status