<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on Michał Kuzdzal</title><link>http://michal.kuzdzal.pl/posts/</link><description>Recent content in Posts on Michał Kuzdzal</description><generator>Hugo -- gohugo.io</generator><language>pl</language><copyright>© 2026 Michał Kuzdzal</copyright><lastBuildDate>Tue, 12 Aug 2025 13:19:19 +0200</lastBuildDate><atom:link href="http://michal.kuzdzal.pl/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>Przyśpieszenie rolling restart i recovery shardów w Elasticsearch</title><link>http://michal.kuzdzal.pl/elasticsearch-recovery-speedup/</link><pubDate>Tue, 12 Aug 2025 13:19:19 +0200</pubDate><guid>http://michal.kuzdzal.pl/elasticsearch-recovery-speedup/</guid><description>&lt;p&gt;Czasem trzeba zrobić rolling restart w klastrze Elasticsearch - wymienić sprzęt, zaktualizować wersję lub przenieść shardy na nowy węzeł. Bez odpowiedniego przygotowania proces może trwać długo i generować dużo niepotrzebnego ruchu.&lt;br&gt;
Poniżej opisuję, co robię, żeby przyspieszyć restart i ograniczyć ruch shardów.&lt;/p&gt;</description></item><item><title>Puppet przejęty przez Perforce - co się zmieniło i jakie są inne alternatywy dla Puppet?</title><link>http://michal.kuzdzal.pl/puppet-przejety-przez-perforce-co-sie-zmienilo-i-jakie-sa-inne-alternatywy-dla-puppet/</link><pubDate>Fri, 08 Aug 2025 05:01:41 +0200</pubDate><guid>http://michal.kuzdzal.pl/puppet-przejety-przez-perforce-co-sie-zmienilo-i-jakie-sa-inne-alternatywy-dla-puppet/</guid><description>&lt;p&gt;Puppet przez lata był jednym z filarów automatyzacji i konfiguracji w dużych środowiskach IT. W 2022 roku projekt został przejęty przez firmę &lt;strong&gt;Perforce&lt;/strong&gt;, a pod koniec 2024 roku ogłoszono poważne zmiany w sposobie dystrybucji i licencjonowania.&lt;/p&gt;</description></item><item><title>ArgoCD App-of-Apps: Jak efektywnie zarządzać aplikacjami w Kubernetes?</title><link>http://michal.kuzdzal.pl/argocd-app-of-apps-jak-zarzadzac-gitops-w-k8s/</link><pubDate>Fri, 01 Aug 2025 14:42:00 +0200</pubDate><guid>http://michal.kuzdzal.pl/argocd-app-of-apps-jak-zarzadzac-gitops-w-k8s/</guid><description>&lt;p&gt;W świecie &lt;strong&gt;Kubernetes&lt;/strong&gt;, zarządzanie rosnącą liczbą aplikacji i ich konfiguracjami staje się wyzwaniem. Tradycyjne podejścia często prowadzą do powielania konfiguracji i trudności w utrzymaniu spójności w różnych środowiskach (&lt;strong&gt;staging&lt;/strong&gt; i &lt;strong&gt;production&lt;/strong&gt;). Właśnie tutaj z pomocą przychodzi wzorzec &lt;strong&gt;App-of-Apps&lt;/strong&gt; (aplikacja aplikacji) w &lt;strong&gt;ArgoCD&lt;/strong&gt;, który pozwala na &lt;strong&gt;skalowalne zarządzanie&lt;/strong&gt; całym ekosystemem aplikacji z jednego, centralnego miejsca.&lt;/p&gt;</description></item><item><title>In-place Pod Resize i Sidecary w Kubernetes 1.33 – Co to zmienia?</title><link>http://michal.kuzdzal.pl/kubernetes-133/</link><pubDate>Mon, 28 Jul 2025 13:18:00 +0200</pubDate><guid>http://michal.kuzdzal.pl/kubernetes-133/</guid><description>&lt;h3 class="relative group"&gt;TL;DR
 &lt;div id="tldr" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#tldr" aria-label="Kotwica"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;p&gt;Kubernetes 1.33 to kamień milowy, który znacząco podnosi elastyczność i bezpieczeństwo platformy. Kluczowe nowości to stabilne, natywne &lt;strong&gt;kontenery sidecar&lt;/strong&gt;, które upraszczają złożone architektury, oraz funkcja &lt;strong&gt;in-place Pod resize&lt;/strong&gt;, umożliwiająca zmianę alokacji zasobów (CPU i pamięci) w działających kontenerach bez konieczności ich restartu. Dodatkowo, domyślnie włączone &lt;strong&gt;przestrzenie nazw użytkowników&lt;/strong&gt; podnoszą poziom izolacji, czyniąc Kubernetes jeszcze potężniejszym narzędziem dla każdego dewelopera i administratora.&lt;/p&gt;</description></item><item><title>HAProxy + Lua: Ochrona przed botami i atakami DDoS</title><link>http://michal.kuzdzal.pl/haproxy-lua-ddos-protection/</link><pubDate>Tue, 22 Jul 2025 14:33:00 +0200</pubDate><guid>http://michal.kuzdzal.pl/haproxy-lua-ddos-protection/</guid><description>&lt;h2 class="relative group"&gt;Wstęp
 &lt;div id="wstęp" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#wst%c4%99p" aria-label="Kotwica"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;W świecie rosnącego natężenia ruchu automatycznego (botów) i ataków DDoS staje się niezbędne wprowadzenie inteligentnych filtrów już na warstwie L7. W tym wpisie opiszę, jak dzięki prostemu skryptowi w Lua oraz mechanizmom HAProxy zbudowałem jedną z wielu warstw ochrony backendów przed nieporządanym ruchem.&lt;/p&gt;</description></item><item><title>Terraform i GitOps w GitLab CI/CD</title><link>http://michal.kuzdzal.pl/terraform-with-gitops/</link><pubDate>Thu, 10 Jul 2025 12:31:00 +0200</pubDate><guid>http://michal.kuzdzal.pl/terraform-with-gitops/</guid><description>&lt;p&gt;Dziś opiszę, jak zintegrować &lt;strong&gt;Terraform&lt;/strong&gt; z &lt;strong&gt;GitLab CI/CD&lt;/strong&gt;, aby stworzyć wydajny i niezawodny proces GitOps.&lt;/p&gt;

&lt;h4 class="relative group"&gt;&lt;strong&gt;Po co Terraform i GitOps?&lt;/strong&gt;
 &lt;div id="po-co-terraform-i-gitops" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#po-co-terraform-i-gitops" aria-label="Kotwica"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Terraform&lt;/strong&gt; pozwala opisywać infrastrukturę jako kod (&lt;strong&gt;IaC&lt;/strong&gt;). Dzięki temu możesz ją wersjonować, łatwo powielać i audytować. &lt;strong&gt;GitOps&lt;/strong&gt; dodaje do tego proces CI/CD, w którym każda zmiana w kodzie jest automatycznie wdrażana, eliminując ręczne modyfikacje i minimalizując ryzyko błędów. Trzymanie stanu w gitlabi pomoże też uniknąć potencjalnych problemów i konfliktów.&lt;/p&gt;</description></item><item><title>Uruchamianie Kali Linux na macOS w kontenerze Apple</title><link>http://michal.kuzdzal.pl/uruchamianie-kali-linux-na-macos-w-kontenerze-apple/</link><pubDate>Tue, 08 Jul 2025 16:35:00 +0200</pubDate><guid>http://michal.kuzdzal.pl/uruchamianie-kali-linux-na-macos-w-kontenerze-apple/</guid><description>&lt;p&gt;Dzięki nowej &lt;strong&gt;konteneryzacji Apple&lt;/strong&gt; (ogłoszonej podczas WWDC 2025) możesz teraz bezproblemowo uruchomić &lt;strong&gt;Kali Linux&lt;/strong&gt; bezpośrednio na swoim Macu z Apple Silicon. To idealne rozwiązanie dla tych, którzy chcą szybko testować narzędzia bezpieczeństwa bez konieczności stawiania pełnej maszyny wirtualnej.&lt;/p&gt;</description></item><item><title>Kompilacja HAProxy 3.2.3 z obsługą QUIC (OpenSSL 3.1.5) na Debianie 12</title><link>http://michal.kuzdzal.pl/untitled/</link><pubDate>Sun, 01 Jun 2025 09:31:00 +0200</pubDate><guid>http://michal.kuzdzal.pl/untitled/</guid><description>&lt;p&gt;Jeśli zależy Ci na wykorzystaniu pełni możliwości HAProxy, w tym najnowszych funkcji takich jak obsługa protokołu &lt;strong&gt;QUIC&lt;/strong&gt;, często konieczna jest kompilacja z kodu źródłowego. Domyślne pakiety HAProxy dostępne w oficjalnych repozytoriach systemów (np. przez &lt;code&gt;apt install haproxy&lt;/code&gt;) zazwyczaj nie zawierają wsparcia dla QUIC, ponieważ wymaga to użycia niestandardowej biblioteki OpenSSL. Co więcej, obsługa QUIC jest często dostępna w wersjach komercyjnych (HAProxy Enterprise), dlatego ręczna kompilacja jest najlepszym sposobem, aby uzyskać tę funkcjonalność w wersji darmowej.&lt;/p&gt;</description></item><item><title>ArgoCD - ingress ssl too many redirects</title><link>http://michal.kuzdzal.pl/argocd/</link><pubDate>Sat, 06 Aug 2022 20:56:25 +0200</pubDate><guid>http://michal.kuzdzal.pl/argocd/</guid><description>&lt;p&gt;Jeżeli chcemy użyć ingressa z ArgoCD zetkniemy się z problemem pętli redirectów&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -I https://argo.michal.kuzdzal.pl
HTTP/2 307
date: Sat, 06 Aug 2022 20:25:02 GMT
content-type: text/html; charset=utf-8
location: https://argo.michal.kuzdzal.pl/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dzieje się tak ponieważ backend ArgoCD oczekuje, że sam nawiąże połączenie TLS, w innym przypadku zawsze przekierowuje połączenie na HTTPS.&lt;/p&gt;</description></item><item><title>Python - lokalny skrypt na zdalnej maszynie (ssh)</title><link>http://michal.kuzdzal.pl/python-lokalny-skrypt-na-zdalnej-maszynie-ssh/</link><pubDate>Tue, 29 Mar 2022 06:30:54 +0200</pubDate><guid>http://michal.kuzdzal.pl/python-lokalny-skrypt-na-zdalnej-maszynie-ssh/</guid><description>&lt;p&gt;Czasem jest taka potrzeba uruchomienia jakiegoś lokalnego skryptu/programu na zdalnym hoście. Jeżeli nie chcemy kopiować i umieszczać na hoście tego skryptu możemy użyć ssh:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh user@host python3 &amp;lt; script.py
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Natomiast jeżeli chcemy uruchomić skrypt z dodatkowymi parametrami:&lt;/p&gt;</description></item><item><title>Gitlab CI/CD - environment variable</title><link>http://michal.kuzdzal.pl/gitlab-ci-cd-environment-variable/</link><pubDate>Sun, 06 Mar 2022 20:33:04 +0100</pubDate><guid>http://michal.kuzdzal.pl/gitlab-ci-cd-environment-variable/</guid><description>&lt;p&gt;Czasami jest potrzeba przekazania zmiennej env pomiędzy różnymi stagami pipelina. Od wersji 13 gitlaba możemy do tego użyć wbudowanego mechanizmu inherit environment variables. Zapisujemy naszą wartość w pliku &lt;em&gt;.env&lt;/em&gt; i przekazujemy ją za pomocą mechanizmu &lt;strong&gt;artifacts&lt;/strong&gt;:&lt;/p&gt;</description></item><item><title>Terraform - deploy LXD container</title><link>http://michal.kuzdzal.pl/terraform/</link><pubDate>Wed, 23 Feb 2022 18:17:47 +0100</pubDate><guid>http://michal.kuzdzal.pl/terraform/</guid><description>&lt;p&gt;Terraform, numer jeden jeżeli chodzi o IaC (&lt;em&gt;&lt;strong&gt;Infrastructure as Code&lt;/strong&gt;). W bardzo przyjemny sposób można zarządzać infrastrukturą cloudową jak i&lt;/em&gt; on-premise.&lt;br&gt;
W tym przypadku opiszę pokrótce jak deployować virtualną maszynę w LXD.&lt;/p&gt;</description></item><item><title>Varnish - cache serwer w k8s</title><link>http://michal.kuzdzal.pl/varnish-k8s/</link><pubDate>Tue, 01 Feb 2022 22:15:00 +0100</pubDate><guid>http://michal.kuzdzal.pl/varnish-k8s/</guid><description>&lt;p&gt;Varnish, świetny serwer cache&amp;rsquo;u umożliwiający bardzo zaawansowaną konfigurację. Większość serwerów cdn dostępnych w internecie wykorzystuje właśnie varnisha na backendzie do serwowania statycznych danych. Osobiście użyłem go jako front przed ghostem, o którego de facto oparty jest ten blog.&lt;/p&gt;</description></item><item><title>k3s - nginx ingress</title><link>http://michal.kuzdzal.pl/k3s-nginx-ingress/</link><pubDate>Wed, 05 Jan 2022 20:58:00 +0100</pubDate><guid>http://michal.kuzdzal.pl/k3s-nginx-ingress/</guid><description>&lt;p&gt;Domyślnym ingressem w k3s jest traefik. Osobiście wolne korzystać z nginx&amp;rsquo;a więc opiszę pokrótce jak zdeploywać go w clustrze k3s&amp;rsquo;a.&lt;/p&gt;

&lt;h3 class="relative group"&gt;Instalacja k3s
 &lt;div id="instalacja-k3s" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#instalacja-k3s" aria-label="Kotwica"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;p&gt;Zaczniemy od instalacji samego k3s z wyłączonym traefikiem:&lt;/p&gt;</description></item><item><title>CI/CD - drone k8s deploy</title><link>http://michal.kuzdzal.pl/cd-cd-drone-k8s-deploy/</link><pubDate>Tue, 14 Dec 2021 13:36:00 +0100</pubDate><guid>http://michal.kuzdzal.pl/cd-cd-drone-k8s-deploy/</guid><description>&lt;p&gt;Drone jest fajnym i lekkim toolem do Continuous Integration i Continuous Delivery/Deployment. Jak przy jego po mocy zdeployować coś do clustra k8s?&lt;br&gt;
Z pomocą przychodzi projekt dostępny na &lt;a href="https://github.com/sinlead/drone-kubectl" target="_blank" rel="noreferrer"&gt;GitHub&amp;rsquo;ie&lt;/a&gt;.&lt;/p&gt;

&lt;h3 class="relative group"&gt;Przygotowanie
 &lt;div id="przygotowanie" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#przygotowanie" aria-label="Kotwica"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;p&gt;Stwórzmy pipeline, który utworzy nam testowy deployment gotowy do dalszej pracy:&lt;/p&gt;</description></item><item><title>Kubernetes - nfs storage</title><link>http://michal.kuzdzal.pl/kubernetes-nfs-storage/</link><pubDate>Sun, 28 Feb 2021 21:02:07 +0100</pubDate><guid>http://michal.kuzdzal.pl/kubernetes-nfs-storage/</guid><description>&lt;p&gt;Do domowego laba k8s bardzo fajnie sprawdza się &lt;strong&gt;microk8s&lt;/strong&gt;. Jest instalowany przez &lt;em&gt;snapa,&lt;/em&gt; jego konfiguracja jest banalna i co najważniejsze posiada masę addonów, które ułatwiają odpalenie wiele rzeczy w sekundę. Jednym z takich addonów jest &amp;ldquo;storage&amp;rdquo;, który utworzy nam storage class w naszym clustrze alokując storage jako &lt;em&gt;host directory&lt;/em&gt;.&lt;br&gt;
Przydatne jednak może być podpięcie zewnętrznego storygu jak np. NFS.&lt;/p&gt;</description></item><item><title>Microk8s - FAIL: snap.microk8s.daemon-proxy</title><link>http://michal.kuzdzal.pl/microk8s-fail-snap-microk8s-daemon-proxy-is-not-running/</link><pubDate>Fri, 25 Dec 2020 12:55:37 +0100</pubDate><guid>http://michal.kuzdzal.pl/microk8s-fail-snap-microk8s-daemon-proxy-is-not-running/</guid><description>&lt;p&gt;Podczas deployu microk8s w kontenerze LXD może pojawić się problem z daemon-proxy. Wówczas w statusie microk8s zobaczymy:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;FAIL:  Service snap.microk8s.daemon-proxy is not running&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;W logach samego procesu (&lt;em&gt;journalctl -u snap.microk8s.daemon-proxy&lt;/em&gt;) widzimy:&lt;/p&gt;</description></item><item><title>Docker - filebeat autodiscovery</title><link>http://michal.kuzdzal.pl/filebeat-autodiscovery/</link><pubDate>Tue, 08 Dec 2020 18:25:32 +0100</pubDate><guid>http://michal.kuzdzal.pl/filebeat-autodiscovery/</guid><description>&lt;p&gt;Przy pomocy beatów od elasticka i opcji autodiscovery mamy możliwość monitorowania kontenerów z poziomu hosta bez niepotrzebnej ingerencji do środka samych kontenerów. Autodoscoverer podczas startu beat&amp;rsquo;a skanuje odpalone kontenery i przypisuje im odpowiedni config.&lt;/p&gt;</description></item><item><title>Puppet - restart usługi po zmianie pliku</title><link>http://michal.kuzdzal.pl/puppet-restart-uslugi-po-zmianie/</link><pubDate>Mon, 05 Oct 2020 11:53:49 +0200</pubDate><guid>http://michal.kuzdzal.pl/puppet-restart-uslugi-po-zmianie/</guid><description>&lt;p&gt;W przypadku puppeta sprawa jest bardzo prosta. Najpierw deklarujemy naszą usługę:&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;service &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;stunnel4&amp;#34;&lt;/span&gt; :
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;ensure&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&amp;gt; &lt;span class="s2"&gt;&amp;#34;running&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&amp;gt; &lt;span class="s2"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;require&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&amp;gt; Package&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;stunnel4&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Następnie w pliku, którym chcemy striggerować nasz serwis dodajemy parametr &amp;rsquo;notify':&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;file &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/etc/stunnel/stunnel.pem&amp;#39;&lt;/span&gt;: &lt;span class="c1"&gt;## {{{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;source&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&amp;gt; &lt;span class="s1"&gt;&amp;#39;puppet:///modules/lb-hq-cm-ha/stunnel-mysql.pem&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;owner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&amp;gt; root,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;group&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&amp;gt; root,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;mode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&amp;gt; &lt;span class="s1"&gt;&amp;#39;0644&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;notify&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&amp;gt; Service&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;stunnel4&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;## }}}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 class="relative group"&gt;Linki
 &lt;div id="linki" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#linki" aria-label="Kotwica"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://puppet.com/docs/puppet/5.5/types/service.html" target="_blank" rel="noreferrer"&gt;Puppet service&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Git - cofnięcie ostatniego commitu</title><link>http://michal.kuzdzal.pl/git-cofniecie-ostatniego-commitu/</link><pubDate>Thu, 01 Oct 2020 08:00:00 +0200</pubDate><guid>http://michal.kuzdzal.pl/git-cofniecie-ostatniego-commitu/</guid><description>&lt;p&gt;Przy pracy z gitem nie raz spotkamy się z sytuacją kiedy będziemy musieli wycofać ostatnio dodany commit. Z pomocą przychodzi reset z oderwaniem &amp;ldquo;głowy&amp;rdquo; o jeden commit do góry:&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git reset --soft HEAD~1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Flaga &amp;ndash;soft pozwala nam na zachowanie zmian w plikach.&lt;/p&gt;</description></item><item><title>Ansible - dodanie ścieżki $PATH</title><link>http://michal.kuzdzal.pl/ansible-dodanie-sciezki-path/</link><pubDate>Wed, 30 Sep 2020 08:00:00 +0200</pubDate><guid>http://michal.kuzdzal.pl/ansible-dodanie-sciezki-path/</guid><description>&lt;p&gt;Przy budowaniu playbooków często musimy dodać jakąś ścieżkę globalnie do zmiennej PATH. Możemy tego dokonać np. przy użyciu modułu copy:&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - name: Add new &lt;span class="nv"&gt;$PATH&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; copy:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; dest: /etc/profile.d/my-path.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; content: &lt;span class="s1"&gt;&amp;#39;PATH=$PATH:{{ /opt/my/path/ }}&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 class="relative group"&gt;Linki
 &lt;div id="linki" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#linki" aria-label="Kotwica"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://docs.ansible.com/ansible/latest/collections/ansible/builtin/copy_module.html" target="_blank" rel="noreferrer"&gt;Ansible copy&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Ansible - instalacja pakietu jeśli nie istnieje</title><link>http://michal.kuzdzal.pl/ansible/</link><pubDate>Tue, 29 Sep 2020 10:41:48 +0200</pubDate><guid>http://michal.kuzdzal.pl/ansible/</guid><description>&lt;p&gt;Exit code przydać nam się mogą w ansiblu do sprawdzania prostych warunków. W tym przypadku do zweryfikowania czy mamy zainstalowany pakiet repozytoriów puppetlabs.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;- name: &amp;quot;Check if puppet is installed&amp;quot; 
 shell: dpkg-query -W puppet5-release
 register: is_puppet_installed
 failed_when: no
 changed_when: no
 
- name: &amp;quot;Download puppetlabs package&amp;quot;
 get_url: 
 url: https://apt.puppetlabs.com/puppet5-release-{{ ansible_distribution_release }}.deb
 dest: /tmp/puppet5-release-{{ ansible_distribution_release }}.deb
 when: is_puppet_installed.rc == 1

- name: &amp;quot;Install puppet repository&amp;quot;
 apt: deb=&amp;quot;/tmp/puppet5-release-{{ ansible_distribution_release }}.deb&amp;quot; when: is_puppet_installed.rc == 1
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 class="relative group"&gt;Linki
 &lt;div id="linki" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#linki" aria-label="Kotwica"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://docs.ansible.com/ansible/latest/user_guide/playbooks_error_handling.html" target="_blank" rel="noreferrer"&gt;Ansible error handling&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Backup kontenerów LXD</title><link>http://michal.kuzdzal.pl/backup-kontenerow-lxd/</link><pubDate>Tue, 22 Sep 2020 20:27:02 +0200</pubDate><guid>http://michal.kuzdzal.pl/backup-kontenerow-lxd/</guid><description>&lt;p&gt;LXD to tak naprawdę nakładka (api) na kontenery LXC.&lt;br&gt;
Backup kontenerów możemy robić na kilka sposobów.&lt;/p&gt;

&lt;h3 class="relative group"&gt;Snapshot
 &lt;div id="snapshot" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#snapshot" aria-label="Kotwica"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;p&gt;Snapshot to tak naprawdę nic innego, jak rsync file systemu danego kontenera. Snapshot nie zapisuje konfiguracji kontenera!\&lt;/p&gt;</description></item><item><title>HAProxy - logowanie do pliku</title><link>http://michal.kuzdzal.pl/haproxy-logowanie-do-pliku/</link><pubDate>Mon, 20 Jul 2020 17:30:33 +0200</pubDate><guid>http://michal.kuzdzal.pl/haproxy-logowanie-do-pliku/</guid><description>&lt;p&gt;Haproxy nie umożliwia nam zapisywania logów bezpośrednio do pliku i trzeba w tym celu użyć np. rsysloga. Logi można wysyłać na zdalny serwer logów, lub odpalić taki serwer lokalnie.&lt;/p&gt;

&lt;h3 class="relative group"&gt;Konfiguracja
 &lt;div id="konfiguracja" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#konfiguracja" aria-label="Kotwica"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;p&gt;Dodajmy konfigurację do rsysloga &lt;em&gt;/etc/rsyslog.d/49-haproxy.conf&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Let's encrypt - certyfikat wildcard</title><link>http://michal.kuzdzal.pl/letsencrypt-wildcard/</link><pubDate>Sun, 12 Jul 2020 19:47:31 +0200</pubDate><guid>http://michal.kuzdzal.pl/letsencrypt-wildcard/</guid><description>&lt;p&gt;Od marca 2018 r. let&amp;rsquo;s encrypt wprowadził opcję generowania certyfikatów typu wildcard.&lt;/p&gt;

&lt;h3 class="relative group"&gt;Generowanie certyfikatu
 &lt;div id="generowanie-certyfikatu" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#generowanie-certyfikatu" aria-label="Kotwica"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;certbot certonly --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory --manual-public-ip-logging-ok -d '*.kuzdzal.pl' -d kuzdzal.pl
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;W trakcje operacji zostaniemy poproszeni o dodanie rekordu TXT dla wskazanej domeny.&lt;/p&gt;</description></item><item><title>Zabbix - timeout executing script</title><link>http://michal.kuzdzal.pl/zabbix-timeout/</link><pubDate>Sat, 11 Jul 2020 20:54:05 +0200</pubDate><guid>http://michal.kuzdzal.pl/zabbix-timeout/</guid><description>&lt;p&gt;Dzięki agentowi zabbixa możemy uruchamiać zewnętrzne programy/skrypty i przekazywać ich outputu bezpośrednio do serwera zabbixa. Umożliwia to opcja &lt;em&gt;UserParameter&lt;/em&gt;.&lt;br&gt;
Problem może pojawić się, jeżeli skrypt zwraca output po jakimś dłuższym czasie, wtedy zabbix server może nas przywitać błędem:&lt;/p&gt;</description></item><item><title>DevOps roadmap 2022</title><link>http://michal.kuzdzal.pl/devops-roadmap-2022/</link><pubDate>Fri, 10 Jul 2020 20:32:09 +0200</pubDate><guid>http://michal.kuzdzal.pl/devops-roadmap-2022/</guid><description>&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="Roadmap devops 2022"
 src="http://michal.kuzdzal.pl/content/images/2020/07/devops_roadmap.png"
 &gt;&lt;/figure&gt;</description></item><item><title>OVH - keepalived i publiczne ip (VRF)</title><link>http://michal.kuzdzal.pl/ovh-keepalived-i-publiczne-ip/</link><pubDate>Fri, 03 Jul 2020 20:38:08 +0200</pubDate><guid>http://michal.kuzdzal.pl/ovh-keepalived-i-publiczne-ip/</guid><description>&lt;p&gt;Keepalived, narzędzie do zapewnienia loadbalancingu i wysokiej dostępności (HA).&lt;/p&gt;

&lt;h3 class="relative group"&gt;Wstęp
 &lt;div id="wstęp" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#wst%c4%99p" aria-label="Kotwica"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;p&gt;Jak wiadomo w OVH, aby przypisać adresację publiczną, trzeba wygenerować w panelu adres mac, który następnie musimy przypisać serwerowi. Powstaje więc problem, jeżeli chcemy połączyć serwery keepalive&amp;rsquo;m musimy przypisać obu serwerom te same mac addressy, co może prowadzić do różnych problemów z warstwą L2.&lt;br&gt;
Dodatkowo, jeżeli chcemy przypisać kilka publiczny adresów ip, niezbędne będzie zastosowanie VRF&amp;rsquo;ów (virtual routing and forwarding).&lt;/p&gt;</description></item><item><title>Docker - backup Bazy MySQL</title><link>http://michal.kuzdzal.pl/docker-backup-bazy-mysql/</link><pubDate>Thu, 02 Jul 2020 21:11:01 +0200</pubDate><guid>http://michal.kuzdzal.pl/docker-backup-bazy-mysql/</guid><description>&lt;p&gt;Wykonanie dumpa bazy danych kontenera mysql z poziomu hosta:&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; NAZWA_KONTENERA /usr/bin/mysqldump -u root --password&lt;span class="o"&gt;=&lt;/span&gt;root DATABASE &amp;gt; backup.sql&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Odtworzenie dumpa:&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat backup.sql &lt;span class="p"&gt;|&lt;/span&gt; docker &lt;span class="nb"&gt;exec&lt;/span&gt; -i NAZWA_KONTENERA /usr/bin/mysql -u root --password&lt;span class="o"&gt;=&lt;/span&gt;root DATABASE&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 class="relative group"&gt;Linki
 &lt;div id="linki" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#linki" aria-label="Kotwica"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://docs.docker.com/engine/reference/commandline/exec/" target="_blank" rel="noreferrer"&gt;Docker exec&lt;/a&gt;,&lt;br&gt;
&lt;a href="https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html" target="_blank" rel="noreferrer"&gt;Mysqldump&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>XtraDB Cluster</title><link>http://michal.kuzdzal.pl/xtradb-cluster/</link><pubDate>Mon, 29 Jun 2020 16:34:08 +0200</pubDate><guid>http://michal.kuzdzal.pl/xtradb-cluster/</guid><description>&lt;p&gt;Żeby zapewnić HA cluster powinien składać się, z nieparzystej liczby nodów (3, 5, 7&amp;hellip;).  Samo XtraDB jest forkiem MySQL Galera.&lt;/p&gt;

&lt;h3 class="relative group"&gt;Wstęp
 &lt;div id="wstęp" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#wst%c4%99p" aria-label="Kotwica"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;p&gt;Poniżej przykładowa konfiguracja dla dwóch nodów (niezalecana):&lt;br&gt;
xtradb-1 - 10.1.100.101&lt;br&gt;
xtradb-2 - 10.1.100.102&lt;br&gt;
Konfiguracja zakłada komunikację po adresach IP (samo resolvowanie dnsów przy bazach danych, jest niezalecane ze względu na performance).&lt;br&gt;
Dodanie kolejnych nodów przebiega analogicznie.&lt;/p&gt;</description></item><item><title>Zbiór ciekawych linków</title><link>http://michal.kuzdzal.pl/link/</link><pubDate>Fri, 19 Jun 2020 20:54:12 +0200</pubDate><guid>http://michal.kuzdzal.pl/link/</guid><description>&lt;p&gt;&lt;a href="https://www.redhat.com/rhtapps/promo-do007/?segment=9" target="_blank" rel="noreferrer"&gt;Ansible kurs od redhat&amp;rsquo;a&lt;/a&gt;,&lt;/p&gt;
&lt;p&gt;&lt;a href="https://learngitbranching.js.org/" target="_blank" rel="noreferrer"&gt;Gra do nauki git&amp;rsquo;a&lt;/a&gt;,&lt;/p&gt;
&lt;p&gt;&lt;a href="https://sqlpd.com" target="_blank" rel="noreferrer"&gt;Gra do nauki SQL&amp;rsquo;a&lt;/a&gt;,&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/AlphaMycelium/pathfinder.vim" target="_blank" rel="noreferrer"&gt;Plugin do nauki VIM&amp;rsquo;&lt;/a&gt;a,&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/jubos/fake-s3" target="_blank" rel="noreferrer"&gt;Wlasny serwer s3&lt;/a&gt;,&lt;/p&gt;
&lt;p&gt;Darmowa książka &lt;a href="https://automatetheboringstuff.com" target="_blank" rel="noreferrer"&gt;Automate the Boring Stuff with Python&lt;/a&gt;,&lt;/p&gt;</description></item></channel></rss>