<?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 Wyssmann Engineering</title><link>https://wyssmann.com/blog/</link><description>Recent content in Blog on Wyssmann Engineering</description><generator>Hugo</generator><language>en</language><copyright>Copyright (c) Wyssmann Engineering</copyright><lastBuildDate>Tue, 13 Jan 2026 10:08:00 +0200</lastBuildDate><atom:link href="https://wyssmann.com/blog/index.xml" rel="self" type="application/rss+xml"/><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 href="https://bitwarden.com"&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 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 href="https://nixos.org/download/"&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 href="https://nixos.org/"&gt;Nixos&lt;/a&gt; in my &lt;a 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 href="https://ansible.com/"&gt;Ansible&lt;/a&gt; and &lt;a href="https://developer.hashicorp.com/terraform"&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 href="https://nixos.org/"&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 href="https://learn.microsoft.com/en-us/windows-server/security/kerberos/kerberos-authentication-overview"&gt;kerberos authentication&lt;/a&gt;. Just adding the external urls to &lt;a href="https://www.chezmoi.io/user-guide/include-files-from-elsewhere/"&gt;&lt;code&gt;.chezmoiexternal.toml&lt;/code&gt;&lt;/a&gt; will not work ase there is &lt;a href="https://github.com/twpayne/chezmoi/discussions/4450"&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 href="https://curl.se/mail/archive-2019-02/0001.html"&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;



&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" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--proxy-negotiate
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-u :&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;The I create a script, that would run at the beginning e.g. &lt;code&gt;run_before_get_packages.sh.tmpl&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 href="https://www.tuxedocomputers.com/en/TUXEDO-InfinityBook-Pro-16-Gen8"&gt;new Notebook&lt;/a&gt; and took the chance to checkout &lt;a href="https://nixos.org/"&gt;NixOS&lt;/a&gt;. I used &lt;a href="https://archlinux.org/"&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 href="https://ansible.com/"&gt;Ansible&lt;/a&gt; and &lt;a href="https://developer.hashicorp.com/terraform"&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 href="https://nixos.org/"&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" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-plain" data-lang="plain"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;platform-tooling
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├argocd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| └applications
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│   ├application_name1.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│   └application_name2.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├application_name1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├env1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ │ └values.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ ├dev
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ │ └values.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&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;&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" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;generators&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- &lt;span style="color:#f92672"&gt;list&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;elements&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;cluster&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;cluster-a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;clusterid&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;c-abcde&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;project&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;p-abcde&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;env&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;env1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;notifyChannel&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;channel-a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;targetRevision&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;x.x.x.x&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;cluster&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;cluster-b&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;clusterid&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;c-bcdef&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;project&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;p-bcdef&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;env&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;env2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;notifyChannel&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;channel-b&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;targetRevision&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;x.x.x.x&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&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 href="https://en.wikipedia.org/wiki/Don%27t_repeat_yourself"&gt;DRY-principle&lt;/a&gt;. So, following one of &lt;a 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 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" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sops --decrypt ./secrets/secrets.enc.json &amp;gt; ./secrets/secrets.json
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Failed to get the data key required to decrypt the SOPS file.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Group 0: FAILED
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; https://mykv.vault.azure.net/keys/sops-key/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx: FAILED
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - | failed to decrypt sops data key with Azure Key Vault key
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | &lt;span style="color:#e6db74"&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 style="display:flex;"&gt;&lt;span&gt; | DefaultAzureCredential: failed to acquire a token.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | Attempted credentials:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | EnvironmentCredential: missing environment variable
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | AZURE_TENANT_ID
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | WorkloadIdentityCredential: no client ID specified. Check
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | pod configuration or set ClientID in the options
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | ManagedIdentityCredential: managed identity timed out. See
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | https://aka.ms/azsdk/go/identity/troubleshoot#dac &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; more
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | information
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | AzureCLICredential: ERROR: AADSTS50173: The provided grant
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | has expired due to it being revoked, a fresh auth token is
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | needed. The user might have changed or reset their password.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | The grant was issued on &lt;span style="color:#e6db74"&gt;&amp;#39;2024-06-21T14:08:41.7484466Z&amp;#39;&lt;/span&gt; and
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | the TokensValidFrom date &lt;span style="color:#f92672"&gt;(&lt;/span&gt;before which tokens are not valid&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; this user is &lt;span style="color:#e6db74"&gt;&amp;#39;2024-11-04T11:11:10.0000000Z&amp;#39;&lt;/span&gt;. Trace ID:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Correlation ID:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy Timestamp: 2025-01-22
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | 13:55:44Z
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | Interactive authentication is needed. Please run:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | az login --scope https://vault.azure.net/.default
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | AzureDeveloperCLICredential: please run &lt;span style="color:#e6db74"&gt;&amp;#34;azd auth login&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | from a command prompt to authenticate before using this
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | credential
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Recovery failed because no master key was able to decrypt the file. In
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;order &lt;span style="color:#66d9ef"&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 style="display:flex;"&gt;&lt;span&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 href="https://learn.microsoft.com/en-us/azure/developer/azure-developer-cli/install-azd?tabs=winget-windows%2Cbrew-mac%2Cscript-linux&amp;amp;pivots=os-windows"&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 href="https://github.com/vmware-tanzu/velero"&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 href="https://github.com/vmware-tanzu/velero"&gt;velero&lt;/a&gt;. However we want to use &lt;a 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 href="https://github.com/vmware-tanzu/velero-plugin-for-microsoft-azure/blob/main/README.md#option-3-use-azure-ad-workload-identity"&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>DevOps vs. Platform Engineering</title><link>https://wyssmann.com/blog/2025/01/devops-vs.-platform-engineering/</link><pubDate>Mon, 06 Jan 2025 10:18:00 +0200</pubDate><guid>https://wyssmann.com/blog/2025/01/devops-vs.-platform-engineering/</guid><description>&lt;p&gt;Platform Engineering is the new kid on the block. But I have seen, there is some confusion with the term Devops. Here I want to give a quick clarification and also some cool links where you can read about Platform Engineering&lt;/p&gt;
&lt;h2 id="devops-vs-platform-engineering"&gt;DevOps vs. Platform Engineering&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DevOps&lt;/strong&gt; is a software development approach that promotes &lt;a href="https://www.computerweekly.com/feature/DevOps-done-right-Creating-a-collaborative-and-supportive-business-culture"&gt;collaboration&lt;/a&gt; between development and operations teams&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Platform engineering&lt;/strong&gt; gives DevOps teams a centralized platform for their tools and workflows.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Platform engineering teams take over the design, implementation and maintenance of these tools and workflows. The platform team uses tool experts to understand developer needs, select the best tools for the required tasks, perform integrations and automations, and troubleshoot and maintain the established platform over time.&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 href="https://learning.codefresh.io/path-player?courseid=gitops-enterprise"&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 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 href="https://azure.github.io/azure-workload-identity/docs/quick-start.html"&gt;Azure AD Workload Identity&lt;/a&gt; allows you the use of a &lt;a 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 href="https://learn.microsoft.com/en-us/azure/key-vault/general/overview"&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 href="https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/overview"&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 href="https://learn.microsoft.com/en-us/windows-server/storage/folder-redirection/deploy-roaming-user-profiles"&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 href="https://github.com/mozilla/sops"&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 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 href="https://gitlab.com/papanito/git-hooks"&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 href="https://github.com/gitleaks/gitleaks"&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><item><title>Git-hooks - a practical example with tf docs</title><link>https://wyssmann.com/blog/2023/09/git-hooks-a-practical-example-with-tf-docs/</link><pubDate>Wed, 27 Sep 2023 08:12:28 +0200</pubDate><guid>https://wyssmann.com/blog/2023/09/git-hooks-a-practical-example-with-tf-docs/</guid><description>&lt;p&gt;You are working on terraform code and want to ensure your documentation is updated after you made some changes. Why don&amp;rsquo;t you use git-hooks for that?&lt;/p&gt;
&lt;p&gt;A long time ago I wrote about &lt;a href="2020-12-introduction-to-git-hooks"&gt;git-hooks&lt;/a&gt;, today I want to give you a practicle example on how I ensure my terraform documetation stays up-to-date.&lt;/p&gt;
&lt;h2 id="terraform-docs"&gt;terraform-docs&lt;/h2&gt;
&lt;p&gt;Not sure if you every heard of &lt;a href="https://terraform-docs.io/"&gt;terraform-docs&lt;/a&gt;, but it&amp;rsquo;s a tool which generates terraform modules documentation in various formats. You can define a config file &lt;code&gt;.terraform-docs.yml&lt;/code&gt; which defines how your documentations shall look like. My &lt;code&gt;$HOME\.terraform-docs.yml&lt;/code&gt; looks as follows:&lt;/p&gt;</description></item><item><title>Hetzner Cloud referral (again)</title><link>https://wyssmann.com/blog/2023/05/hetzner-cloud-referral-again/</link><pubDate>Mon, 15 May 2023 07:40:12 +0200</pubDate><guid>https://wyssmann.com/blog/2023/05/hetzner-cloud-referral-again/</guid><description>&lt;p&gt;As a long-time user of &lt;a href="hetzner.com"&gt;Hetzner&lt;/a&gt; as my hosting provider, I am very satisfied of their services. The do not provide a bunch of interesting offers but also &lt;a href="https://www.hetzner.com/sb"&gt;an auction where you can reuse hardware for a very good price&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Server hardware can be reused even if a product is terminated. This is reasonable in terms of both economic and ecological aspects. Benefit from this advantage.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;For the ones of you looking for a cloud service - similar to Google Cloud or Amazon - I recommend to look into the &lt;a href="https://hetzner.cloud"&gt;Hetzner Cloud&lt;/a&gt; which offers a very competitive pricing. If you decide to give it a try, you may use my &lt;a href="https://hetzner.cloud/?ref=2POcOxl1qcEk"&gt;Hetzner Referral Link&lt;/a&gt; so you get € 20 in cloud credits.&lt;/p&gt;</description></item><item><title>Reusable Github Workflows</title><link>https://wyssmann.com/blog/2023/04/reusable-github-workflows/</link><pubDate>Sat, 15 Apr 2023 12:17:56 +0200</pubDate><guid>https://wyssmann.com/blog/2023/04/reusable-github-workflows/</guid><description>&lt;p&gt;Do you have multiple projects of the same topic, whicch use the same workflows? Then you might have a look into reusable workflows.&lt;/p&gt;
&lt;p&gt;I have multiple ansible roles and I want to use the same workflows for all of these roles. This is when &lt;a href="https://docs.github.com/en/actions/using-workflows/reusing-workflows"&gt;reusable workflows&lt;/a&gt; comes into play:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Rather than copying and pasting from one workflow to another, you can make workflows reusable. You and anyone with access to the reusable workflow can then call the reusable workflow from another workflow.&lt;/p&gt;</description></item></channel></rss>