<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Blog on Adrian's Tech KB &amp; Blog</title><link>https://wyssmann.com/blog/</link><description>Recent content in Blog on Adrian's Tech KB &amp; Blog</description><generator>Hugo</generator><language>en</language><copyright>Copyright (c) Adrian Wyssmann</copyright><lastBuildDate>Wed, 22 Apr 2026 08:08:00 +0200</lastBuildDate><atom:link href="https://wyssmann.com/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>Better git commits and Pull Requests</title><link>https://wyssmann.com/blog/2026/04/better-git-commits-and-pull-requests/</link><pubDate>Wed, 22 Apr 2026 08:08:00 +0200</pubDate><guid>https://wyssmann.com/blog/2026/04/better-git-commits-and-pull-requests/</guid><description>&lt;p&gt;Looking at how developers work with git at my current employer, it surprised me how bad they actually work. Yes I have a very strong opinion about that, and I believe good engineering shows at each level, starting on how you make changes and communicate them. For this reason we recently release a guideline on how all developers shall commit their work in git.&lt;/p&gt;

&lt;picture&gt;
 &lt;source type="image/webp" data-srcset="https://wyssmann.com/blog/2026/04/better-git-commits-and-pull-requests/git_commit_2x_hu_7c472a966366622d.webp 480w,/blog/2026/04/better-git-commits-and-pull-requests/git_commit_2x_hu_8ce31e8dd5d5717c.webp 576w,/blog/2026/04/better-git-commits-and-pull-requests/git_commit_2x_hu_b8a1875434adc307.webp 768w,/blog/2026/04/better-git-commits-and-pull-requests/git_commit_2x_hu_b107447ffb8461d1.webp 878w"
 data-sizes="auto"&gt;
 &lt;img
 src="data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAADQAQCdASoQAAkAAph8J6QAAsaWZ/PXQAD&amp;#43;1beXQVL7YYqt46kbXKMOk8JQAAAA"
 data-src="https://wyssmann.com/blog/2026/04/better-git-commits-and-pull-requests/git_commit_2x_hu_78bf8bfe3098ca0a.jpg"
 width="878"
 height="501"
 decoding="async"
 fetchpriority="auto"
 loading="lazy"
 alt="commit messages chaos"
 class="lazyload blur-up"
 &gt;
&lt;/picture&gt;
&lt;h1 id="why-does-it-matter"&gt;Why does it matter&lt;/h1&gt;
&lt;p&gt;A proper Git commit message is the &lt;strong&gt;best way to communicate context about a change to other developers&lt;/strong&gt; - or even for yourself if you look at your changes in one week or so. Whole a &lt;strong&gt;diff&lt;/strong&gt; will tell you &lt;strong&gt;what changed&lt;/strong&gt;, only the &lt;strong&gt;commit message&lt;/strong&gt; can properly tell you &lt;strong&gt;why&lt;/strong&gt;. Peter Hutterer 

&lt;a class="link link--text" href="http://who-t.blogspot.co.at/2009/12/on-commit-messages.html" rel="external"&gt;makes this point&lt;/a&gt; well:&lt;/p&gt;</description></item><item><title>Software Testing Section</title><link>https://wyssmann.com/blog/2026/03/software-testing-section/</link><pubDate>Thu, 19 Mar 2026 21:08:00 +0200</pubDate><guid>https://wyssmann.com/blog/2026/03/software-testing-section/</guid><description>&lt;p&gt;As I worked several years as test engineer, test automation engineer and test manager/lead I wrote some blog posts about 

&lt;a class="link link--text" href="https://wyssmann.com/docs/swtesting/test-management/what-is-test-data/"&gt;test-data&lt;/a&gt; or 

&lt;a class="link link--text" href="https://wyssmann.com/docs/swtesting/test-engineering/false-negative-/-false-positive-tests/"&gt;false-negatives-false-positives-tests&lt;/a&gt;. But I also have some other articles which I intended to publish but never finished. So I decided to move all to a dedicates docs section 

&lt;a class="link link--text" href="https://wyssmann.com/docs/swtesting/"&gt;Software Testing&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Use Bitwarden and direnv to inject env variables</title><link>https://wyssmann.com/blog/2026/03/use-bitwarden-and-direnv-to-inject-env-variables/</link><pubDate>Mon, 02 Mar 2026 10:08:00 +0200</pubDate><guid>https://wyssmann.com/blog/2026/03/use-bitwarden-and-direnv-to-inject-env-variables/</guid><description>&lt;p&gt;Last year I stumbled upon 

&lt;a class="link link--text" href="https://ergaster.org/posts/2025/07/28-direnv-bitwarden-integration/" rel="external"&gt;Loading credentials from Bitwarden with direnv&lt;/a&gt; which explains how 

&lt;a class="link link--text" href="https://direnv.net/" rel="external"&gt;direnv&lt;/a&gt; and 

&lt;a class="link link--text" href="https://bitwarden.com" rel="external"&gt;bitwarden&lt;/a&gt; can be used together to keep infrastructure credentials safe - many thanks to the author of the post. Taking that into account, I slightly modified the whole setup to my needs.&lt;/p&gt;
&lt;h2 id="direnv-scripts"&gt;Direnv Scripts&lt;/h2&gt;
&lt;p&gt;One essential thing of 

&lt;a class="link link--text" href="https://direnv.net/" rel="external"&gt;direnv&lt;/a&gt; is, to be able to extend the 

&lt;a class="link link--text" href="https://direnv.net/man/direnv-stdlib.1.html" rel="external"&gt;std-lib functions&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It’s also possible to create your own extensions by creating a bash file at &lt;code&gt;~/.config/direnv/direnvrc&lt;/code&gt; or &lt;code&gt;~/.config/direnv/lib/*.sh&lt;/code&gt;. This file is loaded before your &lt;code&gt;.envrc&lt;/code&gt; and thus allows you to make your own extensions to direnv.&lt;/p&gt;</description></item><item><title>Paperless workflow with paperless-ngx</title><link>https://wyssmann.com/blog/2026/02/paperless-workflow-with-paperless-ngx/</link><pubDate>Sun, 15 Feb 2026 20:08:00 +0200</pubDate><guid>https://wyssmann.com/blog/2026/02/paperless-workflow-with-paperless-ngx/</guid><description>&lt;h2 id="what-is-paperless-and-how-i-use-it"&gt;What is paperless and how I use it&lt;/h2&gt;
&lt;p&gt;I use 

&lt;a class="link link--text" href="https://docs.paperless-ngx.com/" rel="external"&gt;paperless-ngx&lt;/a&gt; since years to organize my documents.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Paperless-ngx is a community-supported open-source document management system that transforms your physical documents into a searchable online archive so you can keep, well, less paper.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It&amp;rsquo;s an amazing tools which helps me to organize my papers digitally. For convenience, I had a local instance on my nnotebook running, with the disadvantage that only I had access to the user interface and could see the documents. In addition, up-to now my workflow was still pretty manual:&lt;/p&gt;</description></item><item><title>User Bitwarden as ssh agent</title><link>https://wyssmann.com/blog/2026/01/user-bitwarden-as-ssh-agent/</link><pubDate>Tue, 13 Jan 2026 10:08:00 +0200</pubDate><guid>https://wyssmann.com/blog/2026/01/user-bitwarden-as-ssh-agent/</guid><description>&lt;p&gt;Instead of managing ssh keys locally, you can use 

&lt;a class="link link--text" href="https://bitwarden.com" rel="external"&gt;Bitwarden&lt;/a&gt; as a ssh-agent which IMHO brings some nice benefits, I want to show you.&lt;/p&gt;
&lt;p&gt;Working with ssh (at least at home) you create your keys with &lt;code&gt;ssh-keygen&lt;/code&gt; and place them in &lt;code&gt;$HOME/.ssh&lt;/code&gt;. With Bitwarden the process is different:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;At first you need to ensure you have bitwarden application installed on your system and app is running.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As a second step you have to create an SSH key in the WebApp or the Desktop app:&lt;/p&gt;</description></item><item><title>NixOS for all my system - part 2</title><link>https://wyssmann.com/blog/2026/01/nixos-for-all-my-system-part-2/</link><pubDate>Sun, 11 Jan 2026 10:08:00 +0200</pubDate><guid>https://wyssmann.com/blog/2026/01/nixos-for-all-my-system-part-2/</guid><description>&lt;p&gt;I 

&lt;a class="link link--text" href="https://wyssmann.com/blog/2025/11/nixos-for-all-my-system/"&gt;my last post&lt;/a&gt; I showed you how to configure a remote host. In this post I want to reduce the manual interaction with the remote host - remember I had to do the manual setup on the target system.&lt;/p&gt;
&lt;h2 id="overall-approach"&gt;Overall approach&lt;/h2&gt;
&lt;p&gt;The 3 first steps are basically the same, I have to get the target system ready&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;

&lt;a class="link link--text" href="https://nixos.org/download/" rel="external"&gt;Download latest iso image&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Burn image to an usb stick&lt;/li&gt;
&lt;li&gt;Boot notebook from usb stick&lt;/li&gt;
&lt;li&gt;Install the remote system&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now the next steps is crucial, running the target system with an usb stick comes with ssh running. Unfortunately neither &lt;code&gt;root&lt;/code&gt; nor default user &lt;code&gt;nixos&lt;/code&gt; have a password set. If you use the image downloaded from the website you still have to interact with the remote system briefly by running &lt;code&gt;sudo passwd nixos&lt;/code&gt; or &lt;code&gt;sudo passwd root&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>NixOS for all my system</title><link>https://wyssmann.com/blog/2025/11/nixos-for-all-my-system/</link><pubDate>Sat, 15 Nov 2025 10:08:00 +0200</pubDate><guid>https://wyssmann.com/blog/2025/11/nixos-for-all-my-system/</guid><description>&lt;p&gt;I introduced you to 

&lt;a class="link link--text" href="https://nixos.org/" rel="external"&gt;Nixos&lt;/a&gt; in my 

&lt;a class="link link--text" href="https://wyssmann.com/blog/2025/06/nixos-my-new-linux-distro/"&gt;previous post&lt;/a&gt;. This is an amazing way of managing your linux in a declarative way with easy rollback.&lt;/p&gt;
&lt;p&gt;For my other nodes in my home lab I use(d) 

&lt;a class="link link--text" href="https://ansible.com/" rel="external"&gt;Ansible&lt;/a&gt; and 

&lt;a class="link link--text" href="https://developer.hashicorp.com/terraform" rel="external"&gt;Terraform&lt;/a&gt; which also allows me to create reproducible environments. However, I don&amp;rsquo;t want to use different tools, so why not use 

&lt;a class="link link--text" href="https://nixos.org/" rel="external"&gt;Nixos&lt;/a&gt; everywhere.&lt;/p&gt;
&lt;h2 id="overall-approach"&gt;Overall approach&lt;/h2&gt;
&lt;p&gt;As a starting point on my journey, I will install Nixos on a spare notebook manually and then apply further changes from the config I have locally on my developer machine. So what I did:&lt;/p&gt;</description></item><item><title>Chezmoi externals behind a coorporate proxy</title><link>https://wyssmann.com/blog/2025/06/chezmoi-externals-behind-a-coorporate-proxy/</link><pubDate>Tue, 17 Jun 2025 09:06:00 +0200</pubDate><guid>https://wyssmann.com/blog/2025/06/chezmoi-externals-behind-a-coorporate-proxy/</guid><description>&lt;p&gt;As you know I use https://wyssmann.com/blog/2022/08/chezmoi-a-very-cool-tool-to-manage-your-dotfiles/ to manage my dotfiles. One problem I face is using it in corparate environment with proxy that uses 

&lt;a class="link link--text" href="https://learn.microsoft.com/en-us/windows-server/security/kerberos/kerberos-authentication-overview" rel="external"&gt;kerberos authentication&lt;/a&gt;. Just adding the external urls to 

&lt;a class="link link--text" href="https://www.chezmoi.io/user-guide/include-files-from-elsewhere/" rel="external"&gt;&lt;code&gt;.chezmoiexternal.toml&lt;/code&gt;&lt;/a&gt; will not work ase there is 

&lt;a class="link link--text" href="https://github.com/twpayne/chezmoi/discussions/4450" rel="external"&gt;no native kerberos support&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Luckily there is &lt;code&gt;curl&lt;/code&gt; which supports 

&lt;a class="link link--text" href="https://curl.se/mail/archive-2019-02/0001.html" rel="external"&gt;Kerberos authentication with &amp;ndash;negotiate&lt;/a&gt;. In order to ensure that &lt;code&gt;curl&lt;/code&gt; works by default with &lt;code&gt;--netgotiate&lt;/code&gt; I add the following content into &lt;code&gt;~/.curlrc&lt;/code&gt;&lt;/p&gt;</description></item><item><title>NixOS my new linux distro</title><link>https://wyssmann.com/blog/2025/06/nixos-my-new-linux-distro/</link><pubDate>Sun, 01 Jun 2025 10:08:00 +0200</pubDate><guid>https://wyssmann.com/blog/2025/06/nixos-my-new-linux-distro/</guid><description>&lt;h2 id="reason-for-nixos"&gt;Reason for NixOs&lt;/h2&gt;
&lt;p&gt;Some months ago I got a 

&lt;a class="link link--text" href="https://www.tuxedocomputers.com/en/TUXEDO-InfinityBook-Pro-16-Gen8" rel="external"&gt;new Notebook&lt;/a&gt; and took the chance to checkout 

&lt;a class="link link--text" href="https://nixos.org/" rel="external"&gt;NixOS&lt;/a&gt;. I used 

&lt;a class="link link--text" href="https://archlinux.org/" rel="external"&gt;Archlinux&lt;/a&gt; for many years and was very happe. However as DevOps/Platform Engineer I am used to make things reproducible - I use(d) 

&lt;a class="link link--text" href="https://ansible.com/" rel="external"&gt;Ansible&lt;/a&gt; and 

&lt;a class="link link--text" href="https://developer.hashicorp.com/terraform" rel="external"&gt;Terraform&lt;/a&gt; which allows me to create repoducible environments. I even [used Ansible][https://gitlab.com/papanito/devenv] for some aspcets. Then I stumbled upon 

&lt;a class="link link--text" href="https://nixos.org/" rel="external"&gt;NixOs&lt;/a&gt; which states&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Declarative builds and deployments. Nix is a tool that takes a unique approach to package management and system configuration. Learn how to make reproducible, declarative and reliable systems.&lt;/p&gt;</description></item><item><title>How to use separate environment configuration files ArgoCD</title><link>https://wyssmann.com/blog/2025/02/how-to-use-separate-environment-configuration-files-argocd/</link><pubDate>Thu, 13 Feb 2025 14:58:00 +0200</pubDate><guid>https://wyssmann.com/blog/2025/02/how-to-use-separate-environment-configuration-files-argocd/</guid><description>&lt;h2 id="problem"&gt;Problem&lt;/h2&gt;
&lt;p&gt;Our current argo setup is as follows:&lt;/p&gt;



&lt;div class="expressive-code"&gt;
 &lt;figure class="frame not-content"&gt;
 &lt;figcaption class="header"&gt;
 &lt;span class="title"&gt;&lt;/span&gt;
 &lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-plain" data-lang="plain"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;platform-tooling
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├argocd
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| └applications
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│   ├application_name1.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│   └application_name2.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├application_name1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├env1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ └values.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├dev
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ └values.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;application_nameX&lt;/code&gt; is usually an applicatioSet which ensures the application is deployed to all clusters. Currently this file contains a repetitive configuration:&lt;/p&gt;



&lt;div class="expressive-code"&gt;
 &lt;figure class="frame not-content"&gt;
 &lt;figcaption class="header"&gt;
 &lt;span class="title"&gt;&lt;/span&gt;
 &lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;generators&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &lt;span class="nt"&gt;list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;elements&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;cluster&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cluster-a&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;clusterid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;c-abcde&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;project&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;p-abcde&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;env1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;notifyChannel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;channel-a&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;targetRevision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;x.x.x.x&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;cluster&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;cluster-b&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;clusterid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;c-bcdef&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;project&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;p-bcdef&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;env2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;notifyChannel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;channel-b&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;targetRevision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;x.x.x.x&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;This list grows the more cluster one has. It also does not follow the 

&lt;a class="link link--text" href="https://en.wikipedia.org/wiki/Don%27t_repeat_yourself" rel="external"&gt;DRY-principle&lt;/a&gt;. So, following one of 

&lt;a class="link link--text" href="https://wyssmann.com/blog/2025/01/how-to-organize-application-and-application-sets-in-argocd/"&gt;my last posts&lt;/a&gt; I started to use environment configurations files. So we have the common config in a folder &lt;code&gt;argocd/cluster-config&lt;/code&gt; which contains a &lt;code&gt;&amp;lt;environment&amp;gt;.yaml&lt;/code&gt; containing standard config. For example &lt;code&gt;env1.yaml&lt;/code&gt;&lt;/p&gt;</description></item><item><title>Copy of Failed to get the data key required to decrypt the SOPS file: The provided grant has expired due to it being revoked</title><link>https://wyssmann.com/blog/2025/01/copy-of-failed-to-get-the-data-key-required-to-decrypt-the-sops-file-the-provided-grant-has-expired-due-to-it-being-revoked/</link><pubDate>Thu, 23 Jan 2025 08:00:00 +0200</pubDate><guid>https://wyssmann.com/blog/2025/01/copy-of-failed-to-get-the-data-key-required-to-decrypt-the-sops-file-the-provided-grant-has-expired-due-to-it-being-revoked/</guid><description>&lt;p&gt;As of a sudden 

&lt;a class="link link--text" href="https://wyssmann.com/blog/2023/10/terraform-secrets-with-sops-and-azure-keyvault/"&gt;Terraform secrets with SOPS and Azure Keyvault&lt;/a&gt; does not work anymore and you will get an error when trying to decrypt:&lt;/p&gt;



&lt;div class="expressive-code"&gt;
 &lt;figure class="frame is-terminal not-content"&gt;
 &lt;figcaption class="header"&gt;
 &lt;span class="title"&gt;&lt;/span&gt;
 &lt;/figcaption&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sops --decrypt ./secrets/secrets.enc.json &amp;gt; ./secrets/secrets.json
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Failed to get the data key required to decrypt the SOPS file.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Group 0: FAILED
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; https://mykv.vault.azure.net/keys/sops-key/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx: FAILED
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="p"&gt;|&lt;/span&gt; failed to decrypt sops data key with Azure Key Vault key
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;https://mykv.vault.azure.net/keys/sops-key/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; DefaultAzureCredential: failed to acquire a token.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; Attempted credentials:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; EnvironmentCredential: missing environment variable
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; AZURE_TENANT_ID
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; WorkloadIdentityCredential: no client ID specified. Check
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; pod configuration or &lt;span class="nb"&gt;set&lt;/span&gt; ClientID in the options
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; ManagedIdentityCredential: managed identity timed out. See
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; https://aka.ms/azsdk/go/identity/troubleshoot#dac &lt;span class="k"&gt;for&lt;/span&gt; more
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; information
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; AzureCLICredential: ERROR: AADSTS50173: The provided grant
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; has expired due to it being revoked, a fresh auth token is
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; needed. The user might have changed or reset their password.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; The grant was issued on &lt;span class="s1"&gt;&amp;#39;2024-06-21T14:08:41.7484466Z&amp;#39;&lt;/span&gt; and
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; the TokensValidFrom date &lt;span class="o"&gt;(&lt;/span&gt;before which tokens are not valid&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="p"&gt;|&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; this user is &lt;span class="s1"&gt;&amp;#39;2024-11-04T11:11:10.0000000Z&amp;#39;&lt;/span&gt;. Trace ID:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Correlation ID:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy Timestamp: 2025-01-22
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; 13:55:44Z
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; Interactive authentication is needed. Please run:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; az login --scope https://vault.azure.net/.default
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; AzureDeveloperCLICredential: please run &lt;span class="s2"&gt;&amp;#34;azd auth login&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; from a &lt;span class="nb"&gt;command&lt;/span&gt; prompt to authenticate before using this
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; credential
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Recovery failed because no master key was able to decrypt the file. In
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;order &lt;span class="k"&gt;for&lt;/span&gt; SOPS to recover the file, at least one key has to be successful,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;but none were.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;While usually I did run &lt;code&gt;az auth login&lt;/code&gt; it seems that now you need 

&lt;a class="link link--text" href="https://learn.microsoft.com/en-us/azure/developer/azure-developer-cli/install-azd?tabs=winget-windows%2Cbrew-mac%2Cscript-linux&amp;pivots=os-windows" rel="external"&gt;Azure Developer CLI&lt;/a&gt;. Hence the solution for above problem ist&lt;/p&gt;</description></item><item><title>Velero using Azure Managed Identity</title><link>https://wyssmann.com/blog/2025/01/velero-using-azure-managed-identity/</link><pubDate>Mon, 20 Jan 2025 14:00:00 +0200</pubDate><guid>https://wyssmann.com/blog/2025/01/velero-using-azure-managed-identity/</guid><description>&lt;h2 id="what-is-velero"&gt;What is velero?&lt;/h2&gt;
&lt;p&gt;

&lt;a class="link link--text" href="https://github.com/vmware-tanzu/velero" rel="external"&gt;velero&lt;/a&gt; is a backup and restore tha allows you to&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Take backups of your cluster and restore in case of loss.&lt;/li&gt;
&lt;li&gt;Migrate cluster resources to other clusters.&lt;/li&gt;
&lt;li&gt;Replicate your production cluster to development and testing clusters.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="what-we-want-to-do"&gt;What we want to do?&lt;/h2&gt;
&lt;p&gt;We are currently running 

&lt;a class="link link--text" href="https://github.com/vmware-tanzu/velero" rel="external"&gt;velero&lt;/a&gt;. However we want to use 

&lt;a class="link link--text" href="https://wyssmann.com/blog/2024/09/azure-managed-identity/"&gt;Azure Managed Identity&lt;/a&gt;. Currently our setup is that we have 2 different resource groups&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 for the storage account&lt;/li&gt;
&lt;li&gt;1 for aks (disk snaphost).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Looking trough the 

&lt;a class="link link--text" href="https://github.com/vmware-tanzu/velero-plugin-for-microsoft-azure/blob/main/README.md#option-3-use-azure-ad-workload-identity" rel="external"&gt;documentation&lt;/a&gt;, it is not very clear to me on how to specify different resource groups using &lt;code&gt;./credentials-velero&lt;/code&gt;. Actually it&amp;rsquo;s quite simple. So if you are installing velero with helm you need to define the following in the &lt;code&gt;values.yaml&lt;/code&gt;&lt;/p&gt;</description></item><item><title>How to organize application and application sets in ArgoCD</title><link>https://wyssmann.com/blog/2025/01/how-to-organize-application-and-application-sets-in-argocd/</link><pubDate>Wed, 01 Jan 2025 10:00:00 +0200</pubDate><guid>https://wyssmann.com/blog/2025/01/how-to-organize-application-and-application-sets-in-argocd/</guid><description>&lt;p&gt;Key leanings from 

&lt;a class="link link--text" href="https://learning.codefresh.io/path-player?courseid=gitops-enterprise" rel="external"&gt;GitOps Enterprise&lt;/a&gt;: Learn how to use Argo CD in multi-tenant installations, how to create preview environments and more.&lt;/p&gt;
&lt;h2 id="categories"&gt;Categories&lt;/h2&gt;
&lt;p&gt;At first, it is important to differentiate the possible scenarios, or as the course calls it categories:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Category&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Change Frequency&lt;/th&gt;
 &lt;th&gt;Target User&lt;/th&gt;
 &lt;th&gt;What they are for&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;1&lt;/td&gt;
 &lt;td&gt;Developer Kubernetes Manifest&lt;/td&gt;
 &lt;td&gt;Helm, Kustomize or plain manifest in git&lt;/td&gt;
 &lt;td&gt;Very often&lt;/td&gt;
 &lt;td&gt;Developers mostly&lt;/td&gt;
 &lt;td&gt;Describe the state of any application to any of your organization environments (QA/Staging/Production etc)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;2&lt;/td&gt;
 &lt;td&gt;Developer Argo CD Manifest&lt;/td&gt;
 &lt;td&gt;Argo CD app and Application Set&lt;/td&gt;
 &lt;td&gt;Almost never&lt;/td&gt;
 &lt;td&gt;Operators/Developers&lt;/td&gt;
 &lt;td&gt;Policy configurations referencing the source of truth for an application i.e Category 1&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;3&lt;/td&gt;
 &lt;td&gt;Infrastructure Kubernetes manifests&lt;/td&gt;
 &lt;td&gt;Usually external Helm charts&lt;/td&gt;
 &lt;td&gt;Sometimes&lt;/td&gt;
 &lt;td&gt;Operators&lt;/td&gt;
 &lt;td&gt;Describe the state of any &lt;strong&gt;infrastructure application&lt;/strong&gt; (e.g. logging, monitoring, &amp;hellip;) to any of your organization environments (QA/Staging/Production etc)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;4&lt;/td&gt;
 &lt;td&gt;Infrastructure Argo CD manifests&lt;/td&gt;
 &lt;td&gt;Argo CD app and Application Set&lt;/td&gt;
 &lt;td&gt;Almost never&lt;/td&gt;
 &lt;td&gt;Operators&lt;/td&gt;
 &lt;td&gt;cy configurations referencing the source of truth for an infrastructure application i.e Category 3&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="category-1"&gt;Category 1&lt;/h3&gt;
&lt;p&gt;Category 1 change very often as due to new releases&lt;/p&gt;</description></item><item><title>Ship Rancher API Audit Logs from AKS clusters</title><link>https://wyssmann.com/blog/2024/10/ship-rancher-api-audit-logs-from-aks-clusters/</link><pubDate>Thu, 24 Oct 2024 10:00:00 +0200</pubDate><guid>https://wyssmann.com/blog/2024/10/ship-rancher-api-audit-logs-from-aks-clusters/</guid><description>&lt;p&gt;As reader of my blog you know we are using Rancher logging app. While we migrated the Rancher (Upstream) cluster from RKE to AKS, we cannot use the built in log collection and shipping for audit logs.&lt;/p&gt;
&lt;p&gt;As reader of my blog you know we are using 

&lt;a class="link link--text" href="https://wyssmann.com/blog/2021/08/upgrade-istio-monitoring-and-logging-from-rancher-2.4.x.-to-2.5.x/"&gt;Rancher logging app&lt;/a&gt;. While we migrated the Rancher (Upstream) cluster from RKE to AKS, we cannot use the built in log collection and shipping for audit logs.&lt;/p&gt;</description></item><item><title>External Secrets Operator and Azure Identity Workload</title><link>https://wyssmann.com/blog/2024/09/external-secrets-operator-and-azure-identity-workload/</link><pubDate>Wed, 18 Sep 2024 10:00:00 +0200</pubDate><guid>https://wyssmann.com/blog/2024/09/external-secrets-operator-and-azure-identity-workload/</guid><description>&lt;h2 id="what-is-azure-ad-workload-identity"&gt;What is Azure AD Workload Identity?&lt;/h2&gt;
&lt;p&gt;

&lt;a class="link link--text" href="https://azure.github.io/azure-workload-identity/docs/quick-start.html" rel="external"&gt;Azure AD Workload Identity&lt;/a&gt; allows you the use of a 

&lt;a class="link link--text" href="https://wyssmann.com/blog/2024/09/azure-managed-identity/"&gt;Managed Identity&lt;/a&gt; to access resources in Azure&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Azure AD Workload Identity for Kubernetes integrates with the capabilities native to Kubernetes to federate with external identity providers&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The kubernetes cluster becomes a token issuer, which issues tokens to Kubernetes Service Accounts. These service account tokens can be configured to be trusted on Azure AD applications or user-assigned managed identities.&lt;/p&gt;</description></item><item><title>Azure Managed Identity</title><link>https://wyssmann.com/blog/2024/09/azure-managed-identity/</link><pubDate>Sun, 01 Sep 2024 10:00:00 +0200</pubDate><guid>https://wyssmann.com/blog/2024/09/azure-managed-identity/</guid><description>&lt;p&gt;Managing secrets and credentials manually is cumbersome and error prone so what if you can make that easier? At least in azure you can do so using managed identities.&lt;/p&gt;
&lt;h2 id="what-is-managed-identities"&gt;What is managed identities?&lt;/h2&gt;
&lt;p&gt;Resources usually need secrets (secrets7credentials/certificates/keys) to communicate with other resources. While (in Azure) you can securely store these in an 

&lt;a class="link link--text" href="https://learn.microsoft.com/en-us/azure/key-vault/general/overview" rel="external"&gt;Azure Key Vault&lt;/a&gt;, as a developer you still have to configure your applications accordingly - means you probably copy around these secrets. With 

&lt;a class="link link--text" href="https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/overview" rel="external"&gt;Managed identities&lt;/a&gt; this is not necessary anymore, as it will &lt;strong&gt;provide an automatically managed identity in Microsoft Entra ID for applications&lt;/strong&gt;. An application can use this to connect to resources, by obtaining Microsoft Entra tokens &lt;strong&gt;without having to manage&lt;/strong&gt; any credentials.&lt;/p&gt;</description></item><item><title>Terraform complains with "EvalSymlinks: too many links" when on a Windows roaming profile</title><link>https://wyssmann.com/blog/2024/01/terraform-complains-with-evalsymlinks-too-many-links-when-on-a-windows-roaming-profile/</link><pubDate>Wed, 31 Jan 2024 10:00:00 +0200</pubDate><guid>https://wyssmann.com/blog/2024/01/terraform-complains-with-evalsymlinks-too-many-links-when-on-a-windows-roaming-profile/</guid><description>&lt;p&gt;Working with terraform on Windows can be a pain, even more when using remote profiles.&lt;/p&gt;
&lt;h2 id="problem"&gt;Problem&lt;/h2&gt;
&lt;p&gt;While try to do a terraform init you get the following error&lt;/p&gt;



&lt;div class="expressive-code"&gt;
 &lt;figure class="frame not-content"&gt;
 &lt;figcaption class="header"&gt;
 &lt;span class="title"&gt;&lt;/span&gt;
 &lt;/figcaption&gt;
 &lt;pre tabindex="0"&gt;&lt;code&gt;│ Error: Failed to install provider
│
│ Error while installing hashicorp/azurerm v3.83.0: failed to compute
│ checksum for
│ C:\Users\papa~1\AppData\Local\Temp\4\terraform-provider1701116033:
│ EvalSymlinks: too many links&lt;/code&gt;&lt;/pre&gt;
 &lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;The problem seem to occur if the profile is a 

&lt;a class="link link--text" href="https://learn.microsoft.com/en-us/windows-server/storage/folder-redirection/deploy-roaming-user-profiles" rel="external"&gt;roaming user profiles&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="solution"&gt;Solution&lt;/h2&gt;
&lt;h3 id="use-local-folder"&gt;Use Local Folder&lt;/h3&gt;
&lt;p&gt;This happens on Windows servers, where the profile is not local. To fix it you need a local folder where you have read access, and then configure the following variables either in PS or bash&lt;/p&gt;</description></item><item><title>Terraform secrets with SOPS and Azure Keyvault</title><link>https://wyssmann.com/blog/2023/10/terraform-secrets-with-sops-and-azure-keyvault/</link><pubDate>Tue, 24 Oct 2023 08:00:00 +0200</pubDate><guid>https://wyssmann.com/blog/2023/10/terraform-secrets-with-sops-and-azure-keyvault/</guid><description>&lt;p&gt;We are heavily using Terraform and and also Azure. However until now, we left out certain things cause they contain secrets which we don&amp;rsquo;t want to expose in the code. SOPS is a nice solution to solve that problem and keep things together what belongs together.&lt;/p&gt;
&lt;h2 id="what-is-sops"&gt;What is SOPS?&lt;/h2&gt;
&lt;p&gt;

&lt;a class="link link--text" href="https://github.com/mozilla/sops" rel="external"&gt;SOPS&lt;/a&gt; stands for &lt;strong&gt;S&lt;/strong&gt;ecrets &lt;strong&gt;OP&lt;/strong&gt;eration&lt;strong&gt;S&lt;/strong&gt;, and is an open-source text file editor that encrypts/decrypts YAML, JSON, ENV, INI and BINARY formats and encrypts with AWS KMS, GCP KMS, Azure Key Vault, age, and PGP.&lt;/p&gt;</description></item><item><title>Improvement of Atlantis workflow with azure by setting no_proxy automatically</title><link>https://wyssmann.com/blog/2023/10/improvement-of-atlantis-workflow-with-azure-by-setting-no_proxy-automatically/</link><pubDate>Thu, 19 Oct 2023 15:00:00 +0200</pubDate><guid>https://wyssmann.com/blog/2023/10/improvement-of-atlantis-workflow-with-azure-by-setting-no_proxy-automatically/</guid><description>&lt;p&gt;While we are using Atlantis to to deploy changes to the Cloud infrastructure, we had the issue, that after each new setup we had to re-deploy the atlantis instance, cause we had to extend the &lt;code&gt;no_proxy&lt;/code&gt; environment variable.&lt;/p&gt;
&lt;h2 id="why-update-the-no_proxy"&gt;Why update the &lt;code&gt;no_proxy&lt;/code&gt;?&lt;/h2&gt;
&lt;p&gt;Generally access to azure resources is going through public endpoints at first. Especially for sensitive stuff like keyvault and storage, this shall happen through private endpoints.&lt;/p&gt;
&lt;p&gt;While traffic to public endpoints have to be routed through the webproxy, for privat links we have a direct connection, so it shall not go trough the proxy. So for each private link, the fqdn has to be added to the no_proxy so that calls from atlantis (or terraform) are redirected properly.&lt;/p&gt;</description></item><item><title>Git-hooks - Automatically check for secrets in your code</title><link>https://wyssmann.com/blog/2023/10/git-hooks-automatically-check-for-secrets-in-your-code/</link><pubDate>Mon, 16 Oct 2023 08:00:00 +0200</pubDate><guid>https://wyssmann.com/blog/2023/10/git-hooks-automatically-check-for-secrets-in-your-code/</guid><description>&lt;p&gt;Who did not once in his/her life commit secrets to the code and instantly regretted it? Well we can use git-hooks to avoid that.&lt;/p&gt;
&lt;h2 id="what-is-it"&gt;What is it?&lt;/h2&gt;
&lt;p&gt;Based on 

&lt;a class="link link--text" href="https://wyssmann.com/blog/2023/09/git-hooks-a-practical-example-with-tf-docs/"&gt;Git-hooks - a practical example with tf docs&lt;/a&gt; I extended the 

&lt;a class="link link--text" href="https://gitlab.com/papanito/git-hooks" rel="external"&gt;git-hooks&lt;/a&gt; so it check for secrets and aborts the commit if secrets are found. All you neds it After that also install 

&lt;a class="link link--text" href="https://github.com/gitleaks/gitleaks" rel="external"&gt;gitleaks&lt;/a&gt;, which is a SAST tool for&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;detecting and preventing hardcoded secrets like passwords, api keys, and tokens in git repos. Gitleaks is an easy-to-use, all-in-one solution for detecting secrets, past or present, in your code.&lt;/p&gt;</description></item></channel></rss>