Dotarłem do momentu, w którym utrzymanie aktualnych paczek w aplikacjach zaczyna zjadać zauważalne ilości mojego czasu. Obecnie opiekuję się 8 instancjami, które zaraz wzbogacą się o kolejne 4 projekty. Poświęcenie nawet 10 minut w tygodniu na każdą z nich zaraz przerodzi się w 2 godziny pracy. Jeśli chciałbym robić, to codziennie, to na samo przeklikiwanie instancji straciłbym 10 godzin tygodniowo. Dlatego czas zautomatyzować najwięszych pożeraczy czasu. Na pierwszy rzut idzie utrzymanie pluginów WordPressa.
Słowem wstępu. Dla wygody i porządku, całą konfigurację SSH mam opisaną w konwencji [nazwa / kod klienta].[rodzaj instancji]
np. pk2.staging
. Skrypt piszę jedynie z myślą o Ubuntu 20.04. Zakładam też, że na maszynie dostępny jest jq.
Na początek odrobina definicji. Komunikację z klientami prowadzę w komunikatorze, który potrafi interpretować markdown. Dlatego chciałbym mieć przygotowany gotowy raport do przeklejenia. Data w nazwie pliku przyda się w czasie porządkowania. Tablica instancji jest przykładowa.
#!/bin/bash
FILE=$(date +'%d-%m-%Y').md
INSTANCES=("pk2.staging" "pk2.production")
Teraz czas na szkielet pętli, która będzie iterować po tablicy INSTANCES
. Dodaję echo z emoji, dla własnej przyjemności ;)
for INSTANCE in ${INSTANCES[@]}
do
echo -e "\U1F600 Checking plugins in $INSTANCE"
done
Następnie najtrudniejszy etap, czyli jak pobrać dane na temat pluginów z kontenera dockera, na zdalnym serwerze? Długo eksperymentowałem z oznaczeniami serwisów, ale label
w docker-compose
sprawdziło się najlepiej. Dzięki niemu mam pewność, że zawsze otrzymam id
jednego kontenera, a i takie oznaczenie może mi się przydać w przyszłości. Przyjąłem konwencję [skrócona nazwa firmy]service.label=[unikalny prefiks]-wordpress
. W poniższym wycinku kodu użyłem również filtra, bez niego otrzymamy format table
, który jest strasznie zniekształcony.
WORDPRESS_CONTAINER_ID=$(ssh $INSTANCE "docker ps -q --filter label=pk2service.label=pk2main-wordpress")
RESPONSE=$(ssh $INSTANCE "docker exec $WORDPRESS_CONTAINER_ID wp plugin list --format=json --allow-root")
Z RESPONSE
potrzebuję jeszcze informacji o długości tablicy, do kolejnej pętli.
ARRLENGTH=$(echo $RESPONSE | jq length)
Teraz można przystąpić do generowania raportu. Na początek nagłówek, później standardowe nagłówki i wyrównanie kolumn.
echo -e "\n### $INSTANCE\n" >> $FILE
echo -e "Name | Status | Update | Version" >> $FILE
echo -e "--- | --- | --- | ---" >> $FILE
No i czas na ostatnią pętlę, która wygeneruje poszczególne rzędy w tabeli.
for (( i=0; i<$ARRLENGTH; i++ ))
do
echo "$(echo $RESPONSE | jq -r .[$i].name) | $(echo $RESPONSE | jq -r .[$i].status) | $(echo $RESPONSE | jq -r .[$i].update) | $(echo $RESPONSE | jq -r .[$i].version)" >> $FILE
done
Na koniec wynik działania funkcji i cały skrypt.
### pk2.staging
Name | Status | Update | Version
--- | --- | --- | ---
akismet | active | none | 4.1.8
hello | inactive | none | 1.7.2
### pk2.production
Name | Status | Update | Version
--- | --- | --- | ---
akismet | active | none | 4.1.8
hello | inactive | none | 1.7.2
#!/bin/bash
FILE=$(date +'%d-%m-%Y').md
INSTANCES=("pk2.staging" "pk2.production")
for INSTANCE in ${INSTANCES[@]}
do
echo -e "\U1F600 Checking plugins in $INSTANCE"
WORDPRESS_CONTAINER_ID=$(ssh $INSTANCE "docker ps -q --filter label=pk2service.label=pk2main-wordpress")
RESPONSE=$(ssh $INSTANCE "docker exec $WORDPRESS_CONTAINER_ID wp plugin list --format=json --allow-root")
ARRLENGTH=$(echo $RESPONSE | jq length)
echo -e "\n### $INSTANCE\n" >> $FILE
echo -e "Name | Status | Update | Version" >> $FILE
echo -e "--- | --- | --- | ---" >> $FILE
for (( i=0; i<$ARRLENGTH; i++ ))
do
echo "$(echo $RESPONSE | jq -r .[$i].name) | $(echo $RESPONSE | jq -r .[$i].status) | $(echo $RESPONSE | jq -r .[$i].update) | $(echo $RESPONSE | jq -r .[$i].version)" >> $FILE
done
done