niedziela, 29 kwiecień 2007

Ubuntu. Kontrola wersji plików konfiguracyjnych.

W poprzednim poście wrzuciłem info na temat odtwarzania systemu, a raczej stanu zainstalowanych aplikacji w prosty sposób. Teraz trochę o kontroli wersji plików systemowych. Można to bardzo zgrabnie rozwiązać za pomocą narzędzi do kontroli wersji. Najczęściej stosuje się je do zarządzania wersjami kodu źródłowego aplikacji, jednak nic nie stoi na przeszkodzie, aby wykorzystać je do kontroli zmian w plikach konfiguracyjnych. Bardzo przystępnie zostało to opisane w tym blogu. Osobiście wprowadziłem do powyższej procedury trochę zmian pod kątem Ubuntu. Przedstawię jednak całą procedurę, żeby nie było niedomówień.

Uaktualnienie: Właśnie napotkałem o informacji na temat świetnego rozwiązania, które mogłoby zastąpić całe to How-To :) Polecam odwiedzić http://www.ext3cow.com/ i zapoznać się z przykładami użycia. Robi się ciekawie.

Po pierwsze zakładam, że wiecie coś na temat Subversion, bo tego będę używał jako narzędzia kontroli wersji. Jeżeli nie, to polecam przejrzeć książkę o Subversion. Oczywiście nie trzeba znać się na tym od podszewki, ale wystarczy podstawowa wiedza o działaniu. Drugie moje założenie -- wszystkie polecenia wykonywane są jako root. Można łatwo wejść do powłoki roota wykonując polecenie sudo -s.

Najpierw należy zainstalować Subversion:
apt-get install subversion

Potem tworzymy katalog, w którym będzie trzymana kopia robocza naszego repozytorium, czyli po prostu nasze pliki konfiguracyjne. Należy pamiętać, że system Subversion przechowuje wszystko w swoim repozytorium, a to co będzie w naszym katalogu /etc będzie tak zwaną kopią roboczą. Ja wykorzystałem istniejący już katalog /srv do tego celu:
mkdir -p /srv/config-rcs

Cały katalog config-rcs będzie znajdował się pod kontrolą wersji. Brzmi bez sensu, bo przecież chcemy mieć pod kontrolą wersji katalog /etc... Ale dzięki stworzeniu osobnego katalogu na konfigurację, można w prosty sposób zwiększyć ilość katalogów i plików wziętych pod kontrolę wersji. Należałoby go teraz skopiować, ale wtedy nie będzie to nic innego jak archiwizacja... Również nie można stworzyć linku do tego katalogu, bo Subversion to rozpozna i zapisze w repozytorium tylko sam link... Ale jest na to rada. Katalog /etc zostanie zamontowany do /srv/config-rcs/etc i po krzyku. Najlepiej będzie dodać do pliku /etc/fstab odpowiednie wpisy, żeby przy każdym starcie katalog był montowany:
# Główny katalog konfiguracyjny
/etc /srv/config-rcs/etc none bind 0 0
# Katalog z zadaniami Cron'a
/var/spool/cron/crontabs /srv/config-rcs/var-spool-cron-crontabs none bind 0 0

Żeby to mogło działać muszą istnieć punkty montowania:
mkdir /srv/config-rcs/etc
mkdir /srv/config-rcs/var-spool-cron-crontabs

Teraz można już zamontować katalogi:
mount /srv/config-rcs/etc
mount /srv/config-rcs/var-spool-cron-crontabs


Żeby mieć także możliwość kontrolowania instalowanych aplikacji stworzyłem plik dpkg-selections, który jest uaktualniany przy zmianach spowodowanych instalacją, lub usunięciem pakietów.
dpkg --get-selections > /srv/config-rcs/dpkg-selections


Idealnym rozwiązaniem będzie także automatyczne aktualizowanie tego pliku przy ewentualnych instalacjach, lub deinstalacjach pakietów. Można tego dokonać poprzez dodanie odpowiedniej opcji w konfiguracji apt'a:
gedit /etc/apt/apt.conf.d/99local
# dodajemy linijkę:
DPkg::Post-Invoke {"/usr/bin/dpkg --get-selections > /srv/config-rcs/dpkg-selections || true";};

Co sprawi, że będzie to wykonywane z automatu.

Teraz ostatni krok. Stworzenie repozytorium i dodanie doń katalogu konfiguracyjnego. Sprowadza się to do wykonania następujących czynności:

Tworzymy repozytorium
svnadmin create configurations

Jeżeli jest więcej niż jeden komputer, to można stworzyć im katalogi w repozytorium
svn mkdir https://venus.space.podzone.org/svn/configurations/ubik
svn mkdir https://venus.space.podzone.org/svn/configurations/venus

Powyższy przykład dla komputerów ubik i venus. Następnie robimy checkout katalogu konfiguracyjnego do katalogu, w którym będzie jego kopia robocza.
svn checkout https://venus.space.podzone.org/svn/configurations/venus /srv/config-rcs

Teraz dodajemy pod kontrolę wersji wszystkie pliki, które się w nim znajdują (dodanie rekurencyjne)
cd /srv/config-rcs
svn add --force .

Zakończyć całość należy wrzuceniem wszystkiego do repozytorium, czyli checkin:
svn ci -m "Adding config files for venus (1st run)"


Pliki powinny znajdować się już w repozytorium. Żeby zobaczyć zmiany, które zaszły w trakcie pracy wystarczy, będąc w katalogu kontrolowanym przez Subversion, wykonać svn status. Wszystkie zmiany dodajemy do repozytorium za pomocą polecenia svn ci -m "komentarz do zmian".

Do obsługi takiego repozytorium konfiguracyjnego przydatny jest jeszcze mały skrypt, który doda nowe pliki do kopii roboczej, usunie z pod kontroli wersji nie istniejące już pliki i będzie w stanie tego dokonać w sposób *prosty*. Można także taki skrypt dodać do Cron'a i dzięki temu nawet jeżeli zapomnimy dorzucić zmiany do repozytorium, to będą one tam się regularnie pojawiać. Poniższy skrypt pobiera komentarz z pierwszego (!) argumentu wywołania z linii poleceń (trzeba użyć cudzysłowów, żeby nie wziął tylko pierwszego słowa). Jeżeli nie podamy komentarza, to wykona się z domyślnym. Jeżeli nie było żadnych zmian, to oczywiście nic się nie doda do repozytorium.
#!/bin/bash

comment=${1:-"Auto commit executed on `date`"}

cd /srv/config-rcs
svn status | grep '^\?' | awk '{printf("%s\000",$2)}' | xargs --no-run-if-empty -0 svn add
svn status | grep '^!' | awk '{printf("%s\000",$2)}' | xargs --no-run-if-empty -0 svn rm --force

svn status
echo $comment
svn ci -m "$comment"


Właściwie to wszystko. Teraz można już tylko dodawać więcej plików, lub katalogów do kontroli wersji, modyfikować ustawienia do woli i robić co jakiś czas checkin konfiguracji (!). Nadmienię, że oprócz oczywistych zalet związanych ze śledzeniem zmian konfiguracji, jest także możliwość cofnięcia się do wcześniejszych ustawień. Aż dziw bierze, że w tak prosty sposób można to osiągnąć. Podejrzewam, że już niedługo pojawią się narzędzia graficzne dla przeciętnego Ubunciarza, które znacznie uproszczą i zautomatyzują ten proces.

0 komentarze: