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.
