Kilka dni temu na DNSy Cloudflare przenosiłem domenę nowego klienta. Niby standard, bo jest to operacja, którą wykonuję przynajmniej kilka razy w miesiącu. Tym razem jednak trafiła się niespodzianka w postaci zaciągniętych ponad 500 rekordów DNS „ze starych” DNSów. I może nie byłoby to problemem, gdyby nie fakt, że w Cloudflare – tak jak i w wielu innych miejscach/serwisach – nie ma możliwości zbiorczego zarządzania (w tym kasowania) rekordów w DNSach. Przynajmniej jeśli chodzi o panel zarządzania kontem/domeną…

Kasowanie rekordów DNS w Cloudflare

Wizja ręcznego kasowania zbytecznych rekordów (wybierz, kasuj, potwierdź, wybierz, kasuj, potwierdź… i tak ponad 500 razy) nawet nie tyle, że nie była kusząca, ile wymagałaby zatrudnienia do tego jakiejś małpki (nawet niekoniecznie z magisterką z informatyki ;-)).

Na szczęście Cloudflare oferuje dostęp po API, i choć tam też nie ma możliwości hurtowego kasowania rekordów w DNSach, to na szczęście możemy to zautomatyzować za pomocą prostego skryptu:

#!/bin/bash

CF_API_KEY=ac79b94cd81ea4efa8eda5ab8a2ed5c44de5cd
[email protected]

DOMAIN=webinsider.pl
ZONE_ID=2a4bcde3f4a3be5c4575abf5def6a2b

curl -X GET "https://api.cloudflare.com/client/v4/zones/"$ZONE_ID"/dns_records?per_page=1000" \
	-H "X-Auth-Email: "$CF_EMAIL \
	-H "X-Auth-Key: "$CF_API_KEY \
	-H "Content-Type: application/json" | jq .result[].id |  tr -d '"' | ( 
		while read RECORD_ID; do
			curl -X DELETE "https://api.cloudflare.com/client/v4/zones/"$ZONE_ID"/dns_records/"$RECORD_ID"" \
				-H "X-Auth-Email: "$CF_EMAIL \
				-H "X-Auth-Key: "$CF_API_KEY \
				-H "Content-Type: application/json"
		done
	)

Następnie wystarczy skrypt zapisać, nadać odpowiednie uprawnienia (w systemie Linux/Debian):

sudo chmod +x nazwa_skryptu

I uruchomić.

Skrypt korzysta z programu cURL, który można – w przypadku braku – zainstalować w systemie Ubuntu/Debian za pomocą polecenia:

sudo apt-get install curl

Skrypt korzysta również z programu JQ, który służy do przetwarzania odpowiedzi w formacie JSON, które są zwracane z API Cloudflare.

jq is like sed for JSON data – you can use it to slice and filter and map and transform structured data with the same ease that sed, awk, grep and friends let you play with text.

Jest dość prawdopodobne, że przed uruchomieniem skryptu program ten trzeba będzie zainstalować w systemie. W przypadku systemu Debian/Ubuntu w tym celu wystarczy skorzystać z polecenia:

sudo apt-get install jq

Oczywiście skrypt wymaga konfiguracji, ale ta jest dość banalna:

  • CF_API_KEY – klucz API Cloudflare, do pozyskania w ustawieniach konta
  • CF_EMAIL – adres e-mail używany do logowania się do Cloudflare
  • DOMAIN – domena, na której chcemy wykonać operację
  • ZONE_ID – identyfikator przypisany do danej domeny,  do pozyskania w ustawieniach konta

Skrypt domyślnie przy każdym uruchomieniu (w pętli) skasuje do 1000 rekordów, ale można to zmienić, modyfikując ten fragment kodu:

?per_page=1000

Można zmienić, lub uruchomić kolejny raz skrypt… ;-)

Identyfikatory i klucze API

Szykując się do tego artykułu przygotowałem kolejne „zapytania API” w celu pobrania kolejnych niezbędnych danych, takich jak np. Zone ID. Ostatecznie uznałem, że jest to zbyteczne, bo wszystkie te informacje są dostępne bezpośrednio w panelu zarządzania Cloudflare i nie ma co niepotrzebnie komplikować artykułu/poradnika. A jak ktoś bardzo chce (lub musi), to wszystko znajdzie w dokumentacji Cloudflare…

Wyjątek zrobić postanowiłem dla elementu związanego z autoryzacją, czyli kluczem API.

Dlatego, że wprawdzie klucz API jest również dostępny w panelu, to np. ze względów bezpieczeństwa, zamiast globalnego klucza API można wygenerować klucz dedykowany do tej operacji (modyfikacja rekordów DNS dla wybranej domeny):

W przypadku takiego „dedykowanego” klucza w skrypcie zmieniamy linki związane z autoryzacją konta:

-H "X-Auth-Email: "$CF_EMAIL \
-H "X-Auth-Key: "$CF_API_KEY \

Na:

-H "Authorization: Bearer [DEDYKOWANY_TOKEN_API]" \

Taka „podmiana” klucza API nie jest wymagana, to czasem warto z niej skorzystać – czy to ze względów bezpieczeństwa jeśli chodzi o sam dostęp do konta, jak i ograniczenia możliwości, by w razie ewentualnej pomyłki w kodzie zminimalizować potencjalne szkody… ;-)

(!) Zgłoś błąd na stronie
Pomogłem? To może postawisz mi wirtualną kawę?
LUTy dla D-Cinelike (DJI Mini 3 Pro, DJI Avata, OSMO Pocket) od MiniFly
Wdrożenie Omnibusa w sklepie na WooCommerce
Jak (legalnie) latać dronem w Kategorii Otwartej
Patryk