<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Andrej Golis</title><link>https://www.agolis.xyz/</link><description>Recent content on Andrej Golis</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Wed, 08 Jul 2026 19:21:44 +0200</lastBuildDate><atom:link href="https://www.agolis.xyz/index.xml" rel="self" type="application/rss+xml"/><item><title>My Watch Died Mid-Hike: Merging Two FIT Files with Python</title><link>https://www.agolis.xyz/posts/merging-fit-files-with-python/</link><pubDate>Thu, 02 Jul 2026 14:05:00 +0200</pubDate><guid>https://www.agolis.xyz/posts/merging-fit-files-with-python/</guid><description>&lt;p&gt;Four and a half hours into a long hike my watch ran out of battery, so the
descent got recorded with the Strava app on my phone. Strava cannot merge two
activities into one, and the web tools that can want my GPS data uploaded to
somebody else&amp;rsquo;s server. FIT is a documented binary format with a usable
Python parser, so I stitched the two recordings together myself.&lt;/p&gt;
&lt;h2 id="two-files-two-very-different-recorders"&gt;Two files, two very different recorders&lt;/h2&gt;
&lt;p&gt;Both devices export FIT. The parser is
&lt;a href="https://pypi.org/project/fit-tool/"&gt;fit-tool&lt;/a&gt;:&lt;/p&gt;</description></item><item><title>Upgrading OKD 4.15 to 4.21 in Production: A Field Log</title><link>https://www.agolis.xyz/posts/okd-4.15-to-4.21-upgrade-notes/</link><pubDate>Thu, 25 Jun 2026 09:47:00 +0200</pubDate><guid>https://www.agolis.xyz/posts/okd-4.15-to-4.21-upgrade-notes/</guid><description>&lt;p&gt;Six years ago I wrote about
&lt;a href="https://www.agolis.xyz/posts/okd-4.4-install-on-aws/"&gt;installing OKD 4.4 on AWS&lt;/a&gt;. This is
the sequel nobody plans for: a production OKD cluster on AWS that had been
sitting on 4.15 for well over a year, brought up to 4.21 in five upgrade
windows over one weekend, including the cross-OS migration from Fedora
CoreOS to CentOS Stream CoreOS. Every hop had at least one surprise, and
almost none of them are documented in one place.&lt;/p&gt;</description></item><item><title>Rook-Ceph on Bare Metal: MTU Tuning and Proving Your 10G Network Is Actually 10G</title><link>https://www.agolis.xyz/posts/rook-ceph-bare-metal-benchmarks/</link><pubDate>Tue, 07 Apr 2026 10:18:00 +0200</pubDate><guid>https://www.agolis.xyz/posts/rook-ceph-bare-metal-benchmarks/</guid><description>&lt;p&gt;I recently built a dedicated three-node Ceph cluster with Rook on bare metal
to serve block, file and object storage to a small fleet of Kubernetes
clusters. The Rook YAML turned out to be the easy part. The part that decides
whether the cluster performs is the network underneath it, so this build went
benchmark-first: prove the 10G network is actually delivering 10G before a
single OSD exists, then benchmark Ceph against that baseline.&lt;/p&gt;</description></item><item><title>Red Hat Satellite Content Lifecycle as Code</title><link>https://www.agolis.xyz/posts/satellite-content-lifecycle-as-code/</link><pubDate>Tue, 19 Dec 2023 09:38:00 +0100</pubDate><guid>https://www.agolis.xyz/posts/satellite-content-lifecycle-as-code/</guid><description>&lt;p&gt;Every Satellite I have inherited was managed by clicking through the UI, and
nobody could say why a content view contained what it contained. For a recent
multi-environment RHEL estate I put the whole content lifecycle - products,
repositories, GPG keys, content views, activation keys, publish and promote -
into a git repo driven by the &lt;code&gt;redhat.satellite&lt;/code&gt; Ansible collection. These are
the patterns that worked and the traps that cost me an afternoon each.&lt;/p&gt;</description></item><item><title>Surviving Leapp: Automating RHEL 7 to 8 Migrations at Scale with Ansible</title><link>https://www.agolis.xyz/posts/surviving-leapp-rhel7-to-rhel8/</link><pubDate>Thu, 10 Aug 2023 11:23:00 +0200</pubDate><guid>https://www.agolis.xyz/posts/surviving-leapp-rhel7-to-rhel8/</guid><description>&lt;p&gt;Running Leapp against one server is a tutorial. Running it against a large
enterprise estate is a campaign, and the failure modes are completely
different. These are the traps I hit while automating RHEL 7 to 8 in-place
upgrades with Ansible over the last few months, and the playbook patterns
that fixed them.&lt;/p&gt;
&lt;h2 id="the-moving-parts"&gt;The moving parts&lt;/h2&gt;
&lt;p&gt;Each migration wave runs through the same pipeline, driven from Ansible
Automation Platform:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;pre_upgrade.yml&lt;/code&gt; - patch to latest RHEL 7, install Leapp, preseed
answers, re-register the host against the upgrade content view&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rear_backup.yml&lt;/code&gt; - install ReaR, prepare local disk space, take a
full backup to a remote backup server&lt;/li&gt;
&lt;li&gt;&lt;code&gt;leapp upgrade&lt;/code&gt; and reboot&lt;/li&gt;
&lt;li&gt;&lt;code&gt;post_upgrade.yml&lt;/code&gt; - cleanup, re-register against RHEL 8 content,
application-specific fixes&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Hosts come in as a simple list and get expanded into an in-memory inventory,
so a wave is just a vars file:&lt;/p&gt;</description></item><item><title>Installation of Syndesis on OKD 4.4</title><link>https://www.agolis.xyz/posts/okd-4.4-syndesis/</link><pubDate>Wed, 19 Aug 2020 13:11:01 +0200</pubDate><guid>https://www.agolis.xyz/posts/okd-4.4-syndesis/</guid><description>&lt;p&gt;The installation of Syndesis on OKD/OpenShift is pretty straightforward.&lt;/p&gt;
&lt;p&gt;Clone the repository:&lt;/p&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;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ git clone https://github.com/syndesisio/syndesis.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Add syndesis bin tools to your PATH:&lt;/p&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;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ export PATH&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;PATH&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;:&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;pwd&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;/syndesis/tools/bin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Source shell completion, e.g. zsh or bash - replace accordingly:&lt;/p&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;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ source &amp;lt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;syndesis completion zsh&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Make sure you are &lt;a href="https://www.agolis.xyz/posts/okd-4.4-install-on-aws/#accessing-the-cluster"&gt;logged in to the cluster&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Install CRDs clusterwide. You have to run this option once as cluster admin.&lt;/p&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;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ syndesis install --setup
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Install the latest version of Syndesis in &lt;code&gt;syndesis&lt;/code&gt; project. If the project
exists, it will be re-created.&lt;/p&gt;</description></item><item><title>OKD 4.4 Custom Letsencrypt certificate</title><link>https://www.agolis.xyz/posts/okd-4.4-custom-ssl-letsencrypt/</link><pubDate>Mon, 15 Jun 2020 13:24:56 +0200</pubDate><guid>https://www.agolis.xyz/posts/okd-4.4-custom-ssl-letsencrypt/</guid><description>&lt;p&gt;Credits: &lt;a href="https://www.openshift.com/blog/requesting-and-installing-lets-encrypt-certificates-for-openshift-4"&gt;https://www.openshift.com/blog/requesting-and-installing-lets-encrypt-certificates-for-openshift-4&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;Create AWS credentials as described in the &lt;a href="https://www.agolis.xyz/posts/okd-4.4-install-on-aws/#prerequisites"&gt;previous article&lt;/a&gt;.
Replace the values accordingly.&lt;/p&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;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ cat &lt;span style="color:#e6db74"&gt;&amp;lt;&amp;lt; EOF &amp;gt; aws.credentials
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;export AWS_ACCESS_KEY_ID=REPLACE_AWSACCESSKEYID
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;export AWS_SECRET_ACCESS_KEY=REPLACE_AWSSECRETACCESSKEY
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;EOF&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;$ source aws.credentials
&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;p&gt;Make sure you are &lt;a href="https://www.agolis.xyz/posts/okd-4.4-install-on-aws/#accessing-the-cluster"&gt;logged in to the cluster&lt;/a&gt;.&lt;/p&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;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ export KUBECONFIG&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;PWD&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;/config/auth/kubeconfig
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ oc get node
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME STATUS ROLES AGE VERSION
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ip-10-0-128-29.eu-west-1.compute.internal Ready worker 68m v1.17.1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ip-10-0-140-213.eu-west-1.compute.internal Ready master 78m v1.17.1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ip-10-0-149-203.eu-west-1.compute.internal Ready master 77m v1.17.1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ip-10-0-150-180.eu-west-1.compute.internal Ready worker 68m v1.17.1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ip-10-0-169-24.eu-west-1.compute.internal Ready worker 68m v1.17.1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ip-10-0-175-121.eu-west-1.compute.internal Ready master 78m v1.17.1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ oc whoami
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;system:admin
&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;p&gt;Clone acme.sh github repo.&lt;/p&gt;</description></item><item><title>OKD 4.4 beta5 installation on AWS</title><link>https://www.agolis.xyz/posts/okd-4.4-install-on-aws/</link><pubDate>Mon, 15 Jun 2020 10:43:34 +0200</pubDate><guid>https://www.agolis.xyz/posts/okd-4.4-install-on-aws/</guid><description>&lt;p&gt;This post briefly describes the installation process of OKD 4.4-beta5 on AWS.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;AWS account has to be configured before the actual installation. The process is
described in the &lt;a href="https://docs.okd.io/latest/installing/installing_aws/installing-aws-account.html"&gt;official docs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Once the IAM user is configured, create &lt;code&gt;aws.credentials&lt;/code&gt; file and source it.
Replace the values accordingly.&lt;/p&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;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ cat &lt;span style="color:#e6db74"&gt;&amp;lt;&amp;lt; EOF &amp;gt; aws.credentials
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;export AWS_ACCESS_KEY_ID=REPLACE_AWSACCESSKEYID
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;export AWS_SECRET_ACCESS_KEY=REPLACE_AWSSECRETACCESSKEY
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;EOF&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;$ source aws.credentials
&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;h3 id="download-and-extract-the-installer-and-cli"&gt;Download and extract the installer and cli&lt;/h3&gt;
&lt;p&gt;I am using mac, that is the reason for downloading mac binaries. Make sure to
download correct tarballs for your OS.&lt;/p&gt;</description></item><item><title>OpenShift node disk space disappeared</title><link>https://www.agolis.xyz/posts/openshift-node-disk-space-missing/</link><pubDate>Wed, 04 Sep 2019 15:25:51 +0200</pubDate><guid>https://www.agolis.xyz/posts/openshift-node-disk-space-missing/</guid><description>&lt;p&gt;Filesystem usage displayed by &lt;code&gt;df&lt;/code&gt; does not match total usage displayed by &lt;code&gt;du&lt;/code&gt;,
e.g. 24 GB vs. ~4.7G:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[root@server1 /]# df -h /
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel_server1-root 27G 24G 2.7G 90% /

[root@server1 /]# du -shx * --exclude proc --exclude sys | sort -h
0 bin
0 dev
0 home
0 lib
0 lib64
0 media
0 mnt
0 sbin
0 secrets
0 srv
4.0K tmp
13M opt
50M etc
182M root
187M boot
429M run
1.5G var
2.3G usr
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Display human readable size from lsof output:&lt;/p&gt;</description></item><item><title>Ansible and Hashicorp Better Together</title><link>https://www.agolis.xyz/posts/ansible-and-hashicorp-better-together/</link><pubDate>Wed, 04 Sep 2019 08:54:15 +0200</pubDate><guid>https://www.agolis.xyz/posts/ansible-and-hashicorp-better-together/</guid><description>&lt;p&gt;How to call Ansible during provisioning by Terraform:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=-gKTeT3BgHE"&gt;https://www.youtube.com/watch?v=-gKTeT3BgHE&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Transcript:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.hashicorp.com/resources/ansible-terraform-better-together"&gt;https://www.hashicorp.com/resources/ansible-terraform-better-together&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Blue Green Deployment across K8S version using PX-Motion | Portworx</title><link>https://www.agolis.xyz/posts/blue-green-deployment-k8s-pwx/</link><pubDate>Tue, 03 Sep 2019 09:44:05 +0200</pubDate><guid>https://www.agolis.xyz/posts/blue-green-deployment-k8s-pwx/</guid><description>&lt;h2 id="exploring-px-motion-how-to-perform-blue-green-deployments-for-stateful-workloads-across-kubernetes-versions"&gt;Exploring PX-Motion: How to perform Blue-Green deployments for stateful workloads across Kubernetes versions&lt;/h2&gt;
&lt;p&gt;Demo of blue-green deployment across two different k8s clusters using Portworx&amp;rsquo;s PX-Motion:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://portworx.com/perform-blue-green-deployments-stateful-workloads-across-kubernetes-versions/"&gt;https://portworx.com/perform-blue-green-deployments-stateful-workloads-across-kubernetes-versions/&lt;/a&gt;&lt;/p&gt;</description></item><item><title>TED Talks</title><link>https://www.agolis.xyz/posts/ted-talks/</link><pubDate>Wed, 28 Aug 2019 16:51:31 +0200</pubDate><guid>https://www.agolis.xyz/posts/ted-talks/</guid><description>&lt;p&gt;Some interesting TED talks:&lt;/p&gt;
&lt;p&gt;Thorium can give humanity clean, pollution free energy | Kirk Sorensen | TEDxColoradoSprings&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=kybenSq0KPo"&gt;https://www.youtube.com/watch?v=kybenSq0KPo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;How to green the world&amp;rsquo;s deserts and reverse climate change | Allan Savory&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=vpTHi7O66pI"&gt;https://www.youtube.com/watch?v=vpTHi7O66pI&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Restoring the ancient Caledonian Forest Alan Watson Featherstone TEDxFindhorn&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=nAGHUkby2Is"&gt;https://www.youtube.com/watch?v=nAGHUkby2Is&lt;/a&gt;&lt;/p&gt;</description></item></channel></rss>