Od momentu napisania pierwszej wersji skryptu do sprawdzania wersji pluginów w kontenerach WP, ich ilość zwiększyła się dwukrotnie. Niektóre aplikacje na jednym serwerze posiadają dwie instancje WordPressa, a pierwsza wersja skryptu kompletnie nie była przygotowana na taką sytuację. Patrząc na wiele możliwych rozwiązań, stwierdziłem, że najczystszym z nich będzie wprowadzenie labelek.
Od teraz każdy serwis posiada opisującą go labelkę, dzięki temu namierzenie odpowiedniego w danym projekcie kontenera z bazą, wordpressem, czy aplikacją w nodejs stało się bardzo proste. Jest to też pewna forma dokumentacji, która devopsom niezaangażowanym w projekt szybko daje infomację na temat przeznaczenia danego serwisu.
By odwzorować tą zmianę w skrypcie wporwadziłem nową zmienną LABELS
, która tak na prawdę jest po prostu tablicą z nazwami labelek opisujących kontenery WordPressa.
LABELS=("shop-wordpress" "blog-wordpress" "shop2-wordpress")
Zmieniła się też natura pętli, która teraz nie tylko iteruje po zmiennej INSTANCES
, ale również odnosi się do LABESL
. Z tego powodu ma ona teraz postać
for i in ${!INSTANCES[@]}
do
echo -e "\U1F600 Checking plugins in ${INSTANCES[i]}"
WORDPRESS_CONTAINER_ID=$(ssh ${INSTANCES[i]} "docker ps -q --filter label=pk.label=${LABELS[i]}")
RESPONSE=$(ssh ${INSTANCES[i]} "docker exec $WORDPRESS_CONTAINER_ID wp plugin list --format=json --allow-root")
ARRLENGTH=$(echo $RESPONSE | jq length)
echo -e "\n### ${INSTANCES[i]} - label ${LABELS[i]}\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
Idąc jeszcze za ciosem, stwierdziłem, że skrypt mógłby jeszcze sprawdzić dla mnie szablony, które są zainstalowane w kontenerach. Poniższy kod, to obecnie kopia poprzedniej pętli, z nową komendą w exec
i nazwą pliku, która informuje o raporcie dla themes
FILE=themes-$(date +'%d-%m-%Y').md
for i in ${!INSTANCES[@]}
do
echo -e "\U1F600 Checking themes in ${INSTANCES[i]}"
WORDPRESS_CONTAINER_ID=$(ssh ${INSTANCES[i]} "docker ps -q --filter label=pk.label=${LABELS[i]}")
RESPONSE=$(ssh ${INSTANCES[i]} "docker exec $WORDPRESS_CONTAINER_ID wp theme list --format=json --allow-root")
ARRLENGTH=$(echo $RESPONSE | jq length)
echo -e "\n### ${INSTANCES[i]} - label ${LABELS[i]}\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
Na koniec, cały skrypt, który obecnie pozwala mi zaoszczędzić kilkadziesiąt minut pracy, co tydzień.
#!/bin/bash
FILE=plugins-$(date +'%d-%m-%Y').md
INSTANCES=("pkgs.staging" "pkgs.production")
LABELS=("shop-wordpress" "blog-wordpress")
for i in ${!INSTANCES[@]}
do
echo -e "\U1F600 Checking plugins in ${INSTANCES[i]}"
WORDPRESS_CONTAINER_ID=$(ssh ${INSTANCES[i]} "docker ps -q --filter label=pk2service.label=${LABELS[i]}")
RESPONSE=$(ssh ${INSTANCES[i]} "docker exec $WORDPRESS_CONTAINER_ID wp plugin list --format=json --allow-root")
ARRLENGTH=$(echo $RESPONSE | jq length)
echo -e "\n### ${INSTANCES[i]} - label ${LABELS[i]}\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
FILE=themes-$(date +'%d-%m-%Y').md
for i in ${!INSTANCES[@]}
do
echo -e "\U1F600 Checking themes in ${INSTANCES[i]}"
WORDPRESS_CONTAINER_ID=$(ssh ${INSTANCES[i]} "docker ps -q --filter label=pk2service.label=${LABELS[i]}")
RESPONSE=$(ssh ${INSTANCES[i]} "docker exec $WORDPRESS_CONTAINER_ID wp theme list --format=json --allow-root")
ARRLENGTH=$(echo $RESPONSE | jq length)
echo -e "\n### ${INSTANCES[i]} - label ${LABELS[i]}\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