<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Docs on Panic! At The Terminal</title>
    <link>https://blog.nousiainen.xyz/docs/</link>
    <description>Recent content in Docs on Panic! At The Terminal</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Mon, 23 Mar 2026 10:38:04 +0200</lastBuildDate>
    <atom:link href="https://blog.nousiainen.xyz/docs/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Fail2ban SSH Protection on RHEL9: Installation and Configuration Guide</title>
      <link>https://blog.nousiainen.xyz/docs/fail2ban-ssh-protection-guide/</link>
      <pubDate>Mon, 28 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://blog.nousiainen.xyz/docs/fail2ban-ssh-protection-guide/</guid>
      <description>&lt;h1 id=&#34;fail2ban-ssh-protection-on-rhel9-installation-and-configuration-guide&#34;&gt;&#xA;  Fail2ban SSH Protection on RHEL9: Installation and Configuration Guide&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#fail2ban-ssh-protection-on-rhel9-installation-and-configuration-guide&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Fail2ban is an essential security tool that helps protect your Linux server from brute force attacks and automated bot spam targeting SSH and other services. By monitoring log files and automatically banning IP addresses that show signs of malicious activity, fail2ban acts as an intrusion prevention system that significantly enhances your server&amp;rsquo;s security posture.&lt;/p&gt;&#xA;&lt;h2 id=&#34;installation&#34;&gt;&#xA;  Installation&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#installation&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Install fail2ban and firewalld integration&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dnf install fail2ban fail2ban-firewalld&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Enable and start the service&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl enable fail2ban --now&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;basic-configuration&#34;&gt;&#xA;  Basic Configuration&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#basic-configuration&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;1-create-local-configuration-files&#34;&gt;&#xA;  1. Create Local Configuration Files&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#1-create-local-configuration-files&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Never edit the default configuration files directly. Instead, create local copies that won&amp;rsquo;t be overwritten during updates:&lt;/p&gt;</description>
    </item>
    <item>
      <title>In-Place Upgrade from RHEL 9 to RHEL 10 Using Leapp</title>
      <link>https://blog.nousiainen.xyz/docs/rhel9-to-rhel10-upgrade/</link>
      <pubDate>Thu, 24 Jul 2025 12:00:00 +0200</pubDate>
      <guid>https://blog.nousiainen.xyz/docs/rhel9-to-rhel10-upgrade/</guid>
      <description>&lt;h1 id=&#34;in-place-upgrade-from-rhel-9-to-rhel-10-using-leapp&#34;&gt;&#xA;  In-Place Upgrade from RHEL 9 to RHEL 10 Using Leapp&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#in-place-upgrade-from-rhel-9-to-rhel-10-using-leapp&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;p&gt;This guide walks through the process of upgrading from RHEL 9 to RHEL 10 in place, without requiring a complete system reinstallation.&lt;/p&gt;&#xA;&lt;h2 id=&#34;current-system-status&#34;&gt;&#xA;  Current System Status&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#current-system-status&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s what my lab&amp;rsquo;s test VM looks like:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;user@test ~&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;$ hostnamectl&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; Static hostname: test.home.arpa&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       Icon name: computer-vm&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         Chassis: vm 🖴&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      Machine ID: dec9d730df4f4e629ba20d02aed02f03&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         Boot ID: 67e690ef7fbe45edb112a82dcdf72a97&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Virtualization: kvm&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Operating System: Red Hat Enterprise Linux 9.6 &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;Plow&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     CPE OS Name: cpe:/o:redhat:enterprise_linux:9::baseos&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          Kernel: Linux 5.14.0-570.28.1.el9_6.x86_64&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Architecture: x86-64&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; Hardware Vendor: Red Hat&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Hardware Model: KVM&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Firmware Version: 1.16.3-4.el9&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We can see we&amp;rsquo;re currently running RHEL 9.6 on a KVM virtual machine.&lt;/p&gt;</description>
    </item>
    <item>
      <title>SELinux Troubleshooting</title>
      <link>https://blog.nousiainen.xyz/docs/selinux-comprehensive-guide/</link>
      <pubDate>Wed, 23 Jul 2025 10:00:00 +0200</pubDate>
      <guid>https://blog.nousiainen.xyz/docs/selinux-comprehensive-guide/</guid>
      <description>&lt;h1 id=&#34;selinux-troubleshooting&#34;&gt;&#xA;  SELinux Troubleshooting&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#selinux-troubleshooting&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s a little guide on how to find if SELinux is blocking something and how to add an exception to the policy.&lt;/p&gt;&#xA;&lt;h2 id=&#34;selinux-modes&#34;&gt;&#xA;  SELinux Modes&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#selinux-modes&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;SELinux operates in three modes:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Check SELinux status and mode&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sestatus&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;understanding-the-three-modes&#34;&gt;&#xA;  Understanding the Three Modes&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#understanding-the-three-modes&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Enforcing: SELinux policy is enforced&lt;/li&gt;&#xA;&lt;li&gt;Permissive: SELinux policy violations are logged but not blocked&lt;/li&gt;&#xA;&lt;li&gt;Disabled: SELinux is completely disabled&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;check-if-selinux-is-the-problem&#34;&gt;&#xA;  Check if SELinux is the problem&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#check-if-selinux-is-the-problem&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Temporarily set to permissive mode and test&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;setenforce &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Test your application&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# If it works now, SELinux was blocking it&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;setenforce &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;troubleshooting-workflow&#34;&gt;&#xA;  Troubleshooting Workflow&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#troubleshooting-workflow&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;When an application fails and you are certain that SELinux is blocking it, e.g. you turned SELinux off or into permissive mode and the application worked, you can do the following:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Resolving Git Submodule Tracking Issues</title>
      <link>https://blog.nousiainen.xyz/docs/git-submodule-tracking-issues/</link>
      <pubDate>Sat, 19 Jul 2025 21:30:00 +0300</pubDate>
      <guid>https://blog.nousiainen.xyz/docs/git-submodule-tracking-issues/</guid>
      <description>&lt;h1 id=&#34;resolving-git-submodule-tracking-issues&#34;&gt;&#xA;  Resolving Git Submodule Tracking Issues&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#resolving-git-submodule-tracking-issues&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;the-problem&#34;&gt;&#xA;  The Problem&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#the-problem&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;I recently encountered a frustrating Git issue with my Hugo blog setup. I had installed the &lt;a href=&#34;https://github.com/alex-shpak/hugo-book&#34;&gt;Hugo Book theme&lt;/a&gt; as a Git submodule for my static site, but for some reason there were a bunch of changed files showing up in the theme&amp;rsquo;s directory even though I had never run &lt;code&gt;git submodule update&lt;/code&gt; or made any intentional changes to it. At the time, I didn&amp;rsquo;t really understand how submodules work, so I tried adding it to &lt;code&gt;.gitignore&lt;/code&gt; thinking that would solve the problem.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to Restore a Broken KVM VM from Backup</title>
      <link>https://blog.nousiainen.xyz/docs/kvm-vm-restore-from-backup/</link>
      <pubDate>Fri, 18 Jul 2025 20:00:00 +0300</pubDate>
      <guid>https://blog.nousiainen.xyz/docs/kvm-vm-restore-from-backup/</guid>
      <description>&lt;h1 id=&#34;how-to-restore-a-broken-kvm-vm-from-backup&#34;&gt;&#xA;  How to Restore a Broken KVM VM from Backup&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#how-to-restore-a-broken-kvm-vm-from-backup&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Sometimes things go wrong with virtual machines — maybe a filesystem corruption or a bad update. When that happens, restoring from a backup is your best friend.&lt;/p&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s how I restored my broken KVM VM disk image using weekly backups stored on a NAS share.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-situation&#34;&gt;&#xA;  The situation&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#the-situation&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;I have a VM called &lt;code&gt;runner.home.arpa&lt;/code&gt; running on KVM, and its disk got corrupted. The VM disk images live at &lt;code&gt;/var/lib/libvirt/images/&lt;/code&gt;, and my backups are stored on a NAS mounted at &lt;code&gt;/mnt/backups/runner.home.arpa/&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Docker Instance Upgrades with Ansible</title>
      <link>https://blog.nousiainen.xyz/docs/docker-upgrades/</link>
      <pubDate>Wed, 16 Jul 2025 18:23:20 +0200</pubDate>
      <guid>https://blog.nousiainen.xyz/docs/docker-upgrades/</guid>
      <description>&lt;h1 id=&#34;docker-instance-upgrades-with-ansible&#34;&gt;&#xA;  Docker Instance Upgrades with Ansible&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#docker-instance-upgrades-with-ansible&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;p&gt;This guide shows how to automate Docker container upgrades using Ansible playbooks instead of manual updates. By automating this process, you ensure consistency, reduce errors, and save time when updating multiple Docker instances across your infrastructure.&lt;/p&gt;&#xA;&lt;h2 id=&#34;infrastructure-overview&#34;&gt;&#xA;  Infrastructure Overview&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#infrastructure-overview&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;My homelab includes these Docker-based services:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Nginx Proxy Manager&lt;/strong&gt; (proxy.home.arpa) - Reverse proxy with SSL&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Healthchecks&lt;/strong&gt; (health.home.arpa) - Monitoring service&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Home Assistant&lt;/strong&gt; (hass.home.arpa) - Home automation platform&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Bitwarden&lt;/strong&gt; (bit.home.arpa) - Password manager&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;ansible-playbook-structure&#34;&gt;&#xA;  Ansible Playbook Structure&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#ansible-playbook-structure&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;host-configuration&#34;&gt;&#xA;  Host Configuration&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#host-configuration&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;p&gt;The playbook targets specific hosts with Docker services:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Infrastructure as Code with Ansible Automation Platform</title>
      <link>https://blog.nousiainen.xyz/docs/ansible-automation-platform-iac-setup/</link>
      <pubDate>Sun, 13 Jul 2025 15:00:00 +0300</pubDate>
      <guid>https://blog.nousiainen.xyz/docs/ansible-automation-platform-iac-setup/</guid>
      <description>&lt;h1 id=&#34;infrastructure-as-code-for-ansible-automation-platform-setup&#34;&gt;&#xA;  Infrastructure as Code for Ansible Automation Platform Setup&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#infrastructure-as-code-for-ansible-automation-platform-setup&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;&#xA;  Introduction&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#introduction&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Setting up Ansible Automation Platform (AAP) manually through the web interface is tedious and highly prone to errors.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve written an Ansible playbook that completely automates the setup of my AAP environment, from credentials and projects to job templates and workflow orchestration. So in case I ever need to rebuild the environment from scratch, all I would need to do is just add the project where that playbook is stored, and add a single template by hand and run it. I&amp;rsquo;d do it that way because I don&amp;rsquo;t like running ansible playbooks from the CLI, I always, always use AAP!&lt;/p&gt;</description>
    </item>
    <item>
      <title>SSH Hardening and Automation User Setup with Ansible</title>
      <link>https://blog.nousiainen.xyz/docs/ssh-hardening-ansible/</link>
      <pubDate>Sat, 12 Jul 2025 12:00:00 +0300</pubDate>
      <guid>https://blog.nousiainen.xyz/docs/ssh-hardening-ansible/</guid>
      <description>&lt;h1 id=&#34;ssh-hardening-and-automation-user-setup-with-ansible&#34;&gt;&#xA;  SSH Hardening and Automation User Setup with Ansible&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#ssh-hardening-and-automation-user-setup-with-ansible&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s a little post about how I do SSH hardening for my RHEL9 homelab and how I ensure that the Ansible automation user is properly set. The playbook stems from an incident I had in Red Hat Insights where it was reported that I had an SSH configuration that allowed legacy ciphers. It was also adviced to create a crypto policy that disables weak algorithms.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Automating KVM Backups with Ansible</title>
      <link>https://blog.nousiainen.xyz/docs/backing-up-kvm/</link>
      <pubDate>Sat, 12 Jul 2025 10:00:00 +0300</pubDate>
      <guid>https://blog.nousiainen.xyz/docs/backing-up-kvm/</guid>
      <description>&lt;h1 id=&#34;automating-kvm-homelab-backups-with-ansible&#34;&gt;&#xA;  Automating KVM Homelab Backups with Ansible&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#automating-kvm-homelab-backups-with-ansible&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;p&gt;When you&amp;rsquo;re running a dozen virtual machines in your homelab, manual backups quickly become a nightmare.&lt;/p&gt;&#xA;&lt;p&gt;In this post, I&amp;rsquo;ll walk you through my Ansible-based backup strategy for my KVM homelab. It automatically backs up all VMs by shutting them down gracefully, copying their disk images and configurations to a NAS, and bringing them back online.&lt;/p&gt;&#xA;&lt;h2 id=&#34;backup-strategy&#34;&gt;&#xA;  Backup Strategy&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#backup-strategy&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;My backup strategy uses Ansible to orchestrate the entire process:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Automated Network Monitoring: Adding Servers to LibreNMS with Ansible</title>
      <link>https://blog.nousiainen.xyz/docs/guide-librenms-ansible/</link>
      <pubDate>Mon, 07 Jul 2025 14:00:00 +0300</pubDate>
      <guid>https://blog.nousiainen.xyz/docs/guide-librenms-ansible/</guid>
      <description>&lt;h1 id=&#34;automated-network-monitoring-adding-servers-to-librenms-with-ansible&#34;&gt;&#xA;  Automated Network Monitoring: Adding Servers to LibreNMS with Ansible&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#automated-network-monitoring-adding-servers-to-librenms-with-ansible&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Adding servers to LibreNMS by hand is tedious, and should be done by automation. In this post, I&amp;rsquo;ll show you how I&amp;rsquo;ve automated the entire process of configuring SNMP and adding servers to LibreNMS using Ansible.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-workflow&#34;&gt;&#xA;  The Workflow&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#the-workflow&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Basically what the playbook does is:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Install and configure SNMP&lt;/li&gt;&#xA;&lt;li&gt;Set up necessary firewall rules&lt;/li&gt;&#xA;&lt;li&gt;Add the server to LibreNMS&lt;/li&gt;&#xA;&lt;li&gt;Add it to the correct device group.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;the-playbook&#34;&gt;&#xA;  The Playbook&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#the-playbook&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;step-1-installing-snmp-components&#34;&gt;&#xA;  Step 1: Installing SNMP Components&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#step-1-installing-snmp-components&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;Ensure snmp is installed&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;ansible.builtin.dnf&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;net-snmp&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;net-snmp-utils&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;state&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;present&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;net-snmp&lt;/code&gt; package is needed for the SNMP daemon.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Optimizing KVM Virtual Machines with Tuned Profiles</title>
      <link>https://blog.nousiainen.xyz/docs/kvm-vm-tuning-ansible/</link>
      <pubDate>Mon, 07 Jul 2025 12:00:00 +0300</pubDate>
      <guid>https://blog.nousiainen.xyz/docs/kvm-vm-tuning-ansible/</guid>
      <description>&lt;h1 id=&#34;optimizing-kvm-virtual-machines-with-tuned-profiles&#34;&gt;&#xA;  Optimizing KVM Virtual Machines with Tuned Profiles&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#optimizing-kvm-virtual-machines-with-tuned-profiles&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;p&gt;The &lt;code&gt;tuned&lt;/code&gt; service on Red Hat-based systems provides pre-configured performance profiles that can significantly improve your VM performance with minimal effort.&lt;/p&gt;&#xA;&lt;p&gt;In this post, I&amp;rsquo;ll show you how to optimize your KVM VMs using tuned profiles and automate the entire process with Ansible.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-playbook&#34;&gt;&#xA;  The Playbook&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#the-playbook&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Since I manage dozens of VMs in my homelab, doing this manually would be tedious. Instead, I use this Ansible playbook to apply tuned optimization to all my VMs:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Automating RHEL Server Updates with Ansible</title>
      <link>https://blog.nousiainen.xyz/docs/rhel-server-updates-ansible/</link>
      <pubDate>Sat, 05 Jul 2025 16:00:00 +0300</pubDate>
      <guid>https://blog.nousiainen.xyz/docs/rhel-server-updates-ansible/</guid>
      <description>&lt;h1 id=&#34;automating-rhel-server-updates-with-ansible&#34;&gt;&#xA;  Automating RHEL Server Updates with Ansible&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#automating-rhel-server-updates-with-ansible&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;&#xA;  Introduction&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#introduction&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;I hate updating my servers manually so I&amp;rsquo;ve set up this playbook to run updates. This was probably the first playbook I ever wrote for my home lab, and it&amp;rsquo;s been running automatically for years now on a weekly schedule every Friday night through AAP (Ansible Automation Platform).&lt;/p&gt;&#xA;&lt;p&gt;This guide shows you how to automate RHEL (and other yum/dnf based distros like Fedora, CentOS etc.) server updates using Ansible, including proper reboot handling.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Setting up BIND9 for Internal DNS on RHEL9</title>
      <link>https://blog.nousiainen.xyz/docs/bind9-internal-setup-guide/</link>
      <pubDate>Thu, 03 Jul 2025 20:00:00 +0300</pubDate>
      <guid>https://blog.nousiainen.xyz/docs/bind9-internal-setup-guide/</guid>
      <description>&lt;h1 id=&#34;setting-up-bind9-for-internal-dns-on-rhel9&#34;&gt;&#xA;  Setting up BIND9 for Internal DNS on RHEL9&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#setting-up-bind9-for-internal-dns-on-rhel9&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;p&gt;This guide covers setting up BIND9/named for internal reverse/forward DNS resolution on a RHEL9 server. Unlike public authoritative DNS servers, internal DNS servers provide recursive resolution for your internal network and handle local domain queries.&lt;/p&gt;&#xA;&lt;p&gt;All IP addresses, network ranges, and hostnames in this guide are examples. Replace them with your actual values.&lt;/p&gt;&#xA;&lt;p&gt;For the entirety of the guide we&amp;rsquo;ll be running every single command as root.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Setting up BIND9 for Public DNS on RHEL9</title>
      <link>https://blog.nousiainen.xyz/docs/bind9-external-setup-guide/</link>
      <pubDate>Thu, 03 Jul 2025 18:00:00 +0300</pubDate>
      <guid>https://blog.nousiainen.xyz/docs/bind9-external-setup-guide/</guid>
      <description>&lt;h1 id=&#34;setting-up-bind9-for-public-dns-on-rhel9&#34;&gt;&#xA;  Setting up BIND9 for Public DNS on RHEL9&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#setting-up-bind9-for-public-dns-on-rhel9&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;p&gt;This guide covers setting up BIND9/named as an authoritative public DNS server on RHEL9. Unlike internal DNS servers that provide recursive resolution, public authoritative DNS servers are responsible for answering queries about domains you own and control.&lt;/p&gt;&#xA;&lt;p&gt;This setup includes security hardening measures such as proper logging and zone transfer restrictions to protect your DNS infrastructure from abuse.&lt;/p&gt;&#xA;&lt;p&gt;All IP addresses, domain names, and server configurations in this guide are examples. Replace them with your actual values.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Installing Red Hat Identity Management (IPA) without DNS on RHEL9</title>
      <link>https://blog.nousiainen.xyz/docs/redhat-idm-install-guide/</link>
      <pubDate>Thu, 03 Jul 2025 16:00:00 +0300</pubDate>
      <guid>https://blog.nousiainen.xyz/docs/redhat-idm-install-guide/</guid>
      <description>&lt;h1 id=&#34;installing-red-hat-identity-management-ipa-without-dns-on-rhel9&#34;&gt;&#xA;  Installing Red Hat Identity Management (IPA) without DNS on RHEL9&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#installing-red-hat-identity-management-ipa-without-dns-on-rhel9&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Red Hat Identity Management (IdM) provides centralized authentication, authorization, and account information by storing data about users, groups, hosts, and other objects necessary to manage the security aspects of a network of computers. This guide covers installing IdM/IPA server without the integrated DNS service on RHEL9.&lt;/p&gt;&#xA;&lt;p&gt;This guide demonstrates setting up a high-availability IPA deployment with two servers:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Automated KVM VM Provisioning with Ansible and OSBuild on RHEL9</title>
      <link>https://blog.nousiainen.xyz/docs/automated-vm-provisioning-with-ansible-and-osbuild/</link>
      <pubDate>Thu, 03 Jul 2025 14:00:00 +0300</pubDate>
      <guid>https://blog.nousiainen.xyz/docs/automated-vm-provisioning-with-ansible-and-osbuild/</guid>
      <description>&lt;h1 id=&#34;automated-kvm-vm-provisioning-with-ansible-and-osbuild-on-rhel9&#34;&gt;&#xA;  Automated KVM VM Provisioning with Ansible and OSBuild on RHEL9&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#automated-kvm-vm-provisioning-with-ansible-and-osbuild-on-rhel9&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;&#xA;  Introduction&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#introduction&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;When I started looking into automating my homelab VM provisioning, I was surprised by the lack of examples combining Ansible with OSBuild for KVM environments. Not many tutorials focus on KVM, so I wanted something that used Red Hat&amp;rsquo;s tooling - as I run a RHEL homelab.&lt;/p&gt;&#xA;&lt;p&gt;I used to provision my homelab virtual machines by hand and eventually I got tired of doing it since I like to tinker around a lot and constantly add new VMs. So, I decided to automate the process using the combination of Ansible and OSBuild.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Setting Up Pre-commit Hooks</title>
      <link>https://blog.nousiainen.xyz/docs/precommit-hooks/</link>
      <pubDate>Thu, 03 Jul 2025 12:00:00 +0300</pubDate>
      <guid>https://blog.nousiainen.xyz/docs/precommit-hooks/</guid>
      <description>&lt;h1 id=&#34;setting-up-pre-commit-hooks&#34;&gt;&#xA;  Setting Up Pre-commit hooks&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#setting-up-pre-commit-hooks&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-are-they&#34;&gt;&#xA;  What are they?&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#what-are-they&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Pre-commit hooks are automated scripts that run before each commit, helping you catch issues early and maintain consistent code quality.&lt;/p&gt;&#xA;&lt;h2 id=&#34;steps&#34;&gt;&#xA;  Steps&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#steps&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Installing and configuring pre-commit&lt;/li&gt;&#xA;&lt;li&gt;Setting up hooks for markdown files&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;installation&#34;&gt;&#xA;  Installation&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#installation&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;First, install pre-commit using pip:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pip install pre-commit&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;configuration&#34;&gt;&#xA;  Configuration&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#configuration&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Create a &lt;code&gt;.pre-commit-config.yaml&lt;/code&gt; file in your repository root:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;repos&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  - &lt;span style=&#34;color:#f92672&#34;&gt;repo&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;https://github.com/pre-commit/pre-commit-hooks&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;rev&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;v4.4.0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;hooks&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f92672&#34;&gt;id&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;trailing-whitespace&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f92672&#34;&gt;id&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;end-of-file-fixer&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f92672&#34;&gt;id&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;check-yaml&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f92672&#34;&gt;id&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;check-added-large-files&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f92672&#34;&gt;id&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;check-case-conflict&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#f92672&#34;&gt;id&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;check-merge-conflict&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;what-each-hook-does&#34;&gt;&#xA;  What Each Hook Does&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#what-each-hook-does&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;basic-hooks&#34;&gt;&#xA;  Basic Hooks&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#basic-hooks&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;trailing-whitespace&lt;/strong&gt;: Removes trailing whitespace from lines&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;end-of-file-fixer&lt;/strong&gt;: Ensures files end with a newline&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;check-yaml&lt;/strong&gt;: Validates YAML syntax&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;check-added-large-files&lt;/strong&gt;: Prevents accidentally committing large files&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;check-case-conflict&lt;/strong&gt;: Catches case conflicts that would cause issues on case-insensitive filesystems&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;check-merge-conflict&lt;/strong&gt;: Detects merge conflict markers&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;For a complete list of all available hooks, check out the &lt;a href=&#34;https://github.com/pre-commit/pre-commit-hooks&#34;&gt;pre-commit-hooks repository&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to setup Ansible Vault</title>
      <link>https://blog.nousiainen.xyz/docs/ansible-vault-guide/</link>
      <pubDate>Thu, 03 Jul 2025 10:00:00 +0300</pubDate>
      <guid>https://blog.nousiainen.xyz/docs/ansible-vault-guide/</guid>
      <description>&lt;h1 id=&#34;how-to-setup-ansible-vault&#34;&gt;&#xA;  How to setup Ansible Vault&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#how-to-setup-ansible-vault&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s a little guide on how I setup Ansible Vault for my Ansible playbook repository. It&amp;rsquo;s surprisingly simple and now all of my secrets are encrypted.&lt;/p&gt;&#xA;&lt;h2 id=&#34;setting-up-ansible-vault&#34;&gt;&#xA;  Setting Up Ansible Vault&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#setting-up-ansible-vault&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;1-create-the-directory-structure&#34;&gt;&#xA;  1. Create the Directory Structure&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#1-create-the-directory-structure&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;p&gt;First, create the standard Ansible directory structure for group variables:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir -p group_vars/all&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;2-create-your-vault-file&#34;&gt;&#xA;  2. Create Your Vault File&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#2-create-your-vault-file&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Create a vault file to store your encrypted credentials:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Use ansible-lint with Vault Files</title>
      <link>https://blog.nousiainen.xyz/docs/ansible-lint-vault/</link>
      <pubDate>Mon, 30 Jun 2025 18:46:13 +0300</pubDate>
      <guid>https://blog.nousiainen.xyz/docs/ansible-lint-vault/</guid>
      <description>&lt;h1 id=&#34;use-ansible-lint-with-vault-files&#34;&gt;&#xA;  Use ansible-lint with Vault Files&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#use-ansible-lint-with-vault-files&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;why-i-wrote-this-post&#34;&gt;&#xA;  Why I wrote this post&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#why-i-wrote-this-post&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;I decided to write this post because I struggled to find clear, practical examples of how to make &lt;code&gt;ansible-lint&lt;/code&gt; work with Ansible Vault files in CI/CD environments. While searching for solutions, I found &lt;a href=&#34;https://github.com/ansible/ansible-lint/discussions/3899&#34;&gt;a GitHub discussion&lt;/a&gt; where someone was asking the exact same question I had.&lt;/p&gt;&#xA;&lt;p&gt;The &lt;a href=&#34;https://ansible.readthedocs.io/projects/lint/usage/#vaults&#34;&gt;official ansible-lint documentation&lt;/a&gt; mentions that decrypting Ansible Vault in CI is possible, but frustratingly, it doesn&amp;rsquo;t provide any actual examples of how to implement it. After some trial and error, I figured out a working solution that I want to share.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Enable EPEL Repository on RHEL9</title>
      <link>https://blog.nousiainen.xyz/docs/epel/</link>
      <pubDate>Tue, 03 Jun 2025 17:53:34 +0300</pubDate>
      <guid>https://blog.nousiainen.xyz/docs/epel/</guid>
      <description>&lt;h1 id=&#34;enable-epel-repository-on-rhel-9&#34;&gt;&#xA;  Enable EPEL Repository on RHEL 9&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#enable-epel-repository-on-rhel-9&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;p&gt;The EPEL repository provides packages that are not included in the standard RHEL repositories, such as &lt;code&gt;htop&lt;/code&gt; and &lt;code&gt;vim&lt;/code&gt; for example.&lt;/p&gt;&#xA;&lt;h2 id=&#34;prerequisites&#34;&gt;&#xA;  Prerequisites&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#prerequisites&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Before installing EPEL, you need to enable the CodeReady Builder repository, which provides dependencies for many EPEL packages.&lt;/p&gt;&#xA;&lt;h2 id=&#34;installation-steps&#34;&gt;&#xA;  Installation Steps&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#installation-steps&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;enable-codeready-builder-repository&#34;&gt;&#xA;  Enable codeready builder repository&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#enable-codeready-builder-repository&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;subscription-manager repos --enable codeready-builder-for-rhel-9-&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;arch&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;-rpms&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;install-epel-release&#34;&gt;&#xA;  Install epel-release&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#install-epel-release&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;verification&#34;&gt;&#xA;  Verification&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#verification&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;After installation, you can verify that EPEL is enabled by listing available repositories:&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to Make a New Post on Hugo</title>
      <link>https://blog.nousiainen.xyz/docs/hugo-post/</link>
      <pubDate>Tue, 25 Mar 2025 18:32:04 +0200</pubDate>
      <guid>https://blog.nousiainen.xyz/docs/hugo-post/</guid>
      <description>&lt;h1 id=&#34;creating-new-posts-in-hugo&#34;&gt;&#xA;  Creating New Posts in Hugo&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#creating-new-posts-in-hugo&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Hugo is a fast and flexible static site generator written in Go. Creating new posts is straightforward once you understand the basic workflow. This guide is mostly for myself since I don&amp;rsquo;t always remember how the process goes.&lt;/p&gt;&#xA;&lt;h2 id=&#34;step-by-step-process&#34;&gt;&#xA;  Step-by-Step Process&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#step-by-step-process&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;1-navigate-to-your-hugo-site-directory&#34;&gt;&#xA;  1. Navigate to your Hugo site directory&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#1-navigate-to-your-hugo-site-directory&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/var/lib/snapd/void/blog&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;2-create-a-new-post-using-hugo-cli&#34;&gt;&#xA;  2. Create a new post using Hugo CLI&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#2-create-a-new-post-using-hugo-cli&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hugo new content content/docs/hugo-post.md&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;3-edit-the-post-content&#34;&gt;&#xA;  3. Edit the post content&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#3-edit-the-post-content&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim content/docs/hugo-post.md&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Edit the front matter (title, date, draft status) and add your content in Markdown.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Extending LVM Partitions</title>
      <link>https://blog.nousiainen.xyz/docs/linux-partitions/</link>
      <pubDate>Mon, 04 Nov 2024 18:58:46 +0200</pubDate>
      <guid>https://blog.nousiainen.xyz/docs/linux-partitions/</guid>
      <description>&lt;h1 id=&#34;extending-lvm-partitions&#34;&gt;&#xA;  Extending LVM Partitions&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#extending-lvm-partitions&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;p&gt;This guide walks you through extending LVM partitions when you&amp;rsquo;ve added new disk space to your system.&lt;/p&gt;&#xA;&lt;h2 id=&#34;lvm-structure&#34;&gt;&#xA;  LVM Structure&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#lvm-structure&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;LVM operates with three main components:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Physical Volumes (PV)&lt;/strong&gt;: The actual disk partitions&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Volume Groups (VG)&lt;/strong&gt;: Collections of physical volumes&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Logical Volumes (LV)&lt;/strong&gt;: The volumes you mount and use&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;common-scenario&#34;&gt;&#xA;  Common Scenario&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#common-scenario&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;You&amp;rsquo;ve added disk space to a virtual machine and need to extend the root filesystem. This is a common requirement in virtualized environments where storage needs grow over time.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux Cheat Sheet - System Administration Commands</title>
      <link>https://blog.nousiainen.xyz/docs/linux-cheat-sheet/</link>
      <pubDate>Mon, 04 Nov 2024 17:58:47 +0200</pubDate>
      <guid>https://blog.nousiainen.xyz/docs/linux-cheat-sheet/</guid>
      <description>&lt;h1 id=&#34;linux-system-administration-cheat-sheet&#34;&gt;&#xA;  Linux System Administration Cheat Sheet&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#linux-system-administration-cheat-sheet&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;p&gt;This is a curated list of Linux commands for myself that I&amp;rsquo;ve kept written down over the span of five years into my career in IT. I use this often when I can&amp;rsquo;t remember spesific commands when in a rush.&lt;/p&gt;&#xA;&lt;h2 id=&#34;quick-reference-categories&#34;&gt;&#xA;  Quick Reference Categories&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#quick-reference-categories&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;User Management &amp;amp; SSH&lt;/strong&gt;: Setting up users and SSH access&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Ansible&lt;/strong&gt;: Automation and configuration management&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Git&lt;/strong&gt;: Version control operations&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;File Operations&lt;/strong&gt;: rsync, grep, and file management&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;SELinux&lt;/strong&gt;: Security context management&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Network Configuration&lt;/strong&gt;: nmcli and network setup&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;System Monitoring&lt;/strong&gt;: Process and resource monitoring&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Package Management&lt;/strong&gt;: RHEL/CentOS package operations&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Virtualization&lt;/strong&gt;: KVM/virsh commands&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Containers&lt;/strong&gt;: Docker and Podman operations&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Troubleshooting&lt;/strong&gt;: Network, DNS, and system diagnostics&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;user-management--ssh&#34;&gt;&#xA;  User Management &amp;amp; SSH&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#user-management--ssh&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#add ansible user to server&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;useradd ansible&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;passwd ansible&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;usermod -aG wheel ansible&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir -p /home/ansible/.ssh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chmod &lt;span style=&#34;color:#ae81ff&#34;&gt;700&lt;/span&gt; /home/ansible/.ssh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chown ansible:ansible /home/ansible/.ssh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ssh-rsa...&amp;#34;&lt;/span&gt; | sudo tee /home/ansible/.ssh/authorized_keys&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chmod &lt;span style=&#34;color:#ae81ff&#34;&gt;600&lt;/span&gt; /home/ansible/.ssh/authorized_keys&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chown ansible:ansible /home/ansible/.ssh/authorized_keys&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#show octal permissions of file&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;stat authorized_keys&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;ansible&#34;&gt;&#xA;  Ansible&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#ansible&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#run ansible playbook in vscode as ansible user&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;eval &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;ssh-agent&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh-add ansible_id_rsa&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ansible-playbook playbook.yml --user ansible --private-key .ssh/ansible_id_rsa --inventory inventory.ini&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;git&#34;&gt;&#xA;  Git&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#git&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#git cheat sheet&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git init&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git status&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git add .&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git commit -m &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Commit message&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git remote add origin &amp;lt;url&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git push -u origin &amp;lt;branch&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git rm -r --cached public/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#show what&amp;#39;s modified in detail&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git diff&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git diff themes/hugo-book&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git diff --submodule&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;diff themes/hugo-book&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#submodule operations&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git submodule status&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git rm --cached themes/hugo-book&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;file-operations&#34;&gt;&#xA;  File Operations&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#file-operations&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#show rsync progress&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rsync -avh --progress /var/lib/libvirt/images/mc.home.arpa.qcow2 /mnt/backups/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#use inverse grep to exclude things&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;df -Th | grep -v &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tmpfs|squashfs&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#find string in files&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;grep -i &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;keeper&amp;#39;&lt;/span&gt; -R /etc/apt&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#find string in compressed files&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;zgrep -i &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;connected&amp;#34;&lt;/span&gt; *.log.gz&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#pipe command output as argument&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rpm -qa | grep htop | xargs rpm -e&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#show available disk space nicely formatted&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;du -hs /* | sort -hr | head&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#create a file filled with zeroes (1024M)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dd &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/dev/zero of&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/tmp/file.txt count&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1024&lt;/span&gt; bs&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1024&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#grep multiple terms&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rpm -qa | grep -Ei &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;fuse-libs|libcurl|python36&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#display filetree of the root folder and another folder (with a depth of 1 and hidden files)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tree . themes/hugo-book/ -L &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; -a&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#download multiple files&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget -i urls.txt -P files/ --progress&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;bar&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;selinux&#34;&gt;&#xA;  SELinux&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#selinux&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#check and fix what SELinux is blocking&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tail /var/log/audit/audit.log&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;grep &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;1675516978.657:437&amp;#34;&lt;/span&gt; /var/log/audit/audit.log | audit2why&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;grep &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;nginx&amp;#34;&lt;/span&gt; /var/log/audit/audit.log | audit2allow -M nginx&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ls nginx.pp&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;semodule -i nginx.pp&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#find SELinux errors (requires policycoreutils-python-utils)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;audit2why &amp;lt; /var/log/audit/audit.log&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;network-configuration&#34;&gt;&#xA;  Network Configuration&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#network-configuration&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#nmcli add backup vlan to NIC team&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nmcli connection add type vlan con-name backup dev team0 id &lt;span style=&#34;color:#ae81ff&#34;&gt;2186&lt;/span&gt; ip4 10.215.159.196/29  ipv4.never-default yes +ipv4.routes &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;81.175.254.0/24 10.215.159.193&amp;#34;&lt;/span&gt;  ipv6.method ignore&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#nmcli add another NIC to regular VM (no bond)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mcli con add con-name &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;grpc&amp;#34;&lt;/span&gt; ifname ens162 type ethernet ip4 172.20.13.132/26 ipv4.method manual ipv6.method ignore ipv4.never-default yes +ipv4.routes &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;172.20.13.128/26 172.20.13.129&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#nmcli list devices&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nmcli device status&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#add proxy to session&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;export http_proxy&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;http://proxy.home.arpa:8080&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;export https_proxy&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;http://wproxy.home.arpa:8080&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;export PATH&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$HOME&lt;span style=&#34;color:#e6db74&#34;&gt;/.local/bin:&lt;/span&gt;$PATH&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#test web proxy connection&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -I https://google.com/ -x proxy.home.arpa:8080&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# located in /etc/yum.conf&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# proxy=http://wproxy.dnaip.fi:8080&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -L -O https://github.com/healthchecks/healthchecks/archive/refs/heads/master.zip -x proxy.home.arpa:8080&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;system-monitoring&#34;&gt;&#xA;  System Monitoring&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#system-monitoring&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#check what&amp;#39;s using CPU&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ps -eo pid,ppid,cmd,%mem,%cpu --sort&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;-%cpu| head&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#show processes with PID for /proc&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ps -xj&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#display process tree&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ps -e --forest&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#list of commands you use most often&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;history | awk &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;{a[$2]++}END{for(i in a){print a[i] &amp;#34; &amp;#34; i}}&amp;#39;&lt;/span&gt; | sort -rn | head&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#view journalctl for spesific program&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;journalctl -eu named -f -l&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#show what ports host is listening to&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;netstat -tulpn | grep LISTEN&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;package-management&#34;&gt;&#xA;  Package Management&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#package-management&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#rhel subs-manager commands&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;subscription-manager status&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;subscription-manager list --consumed&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;subscription-manager refresh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;subscription-manager attach --auto&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;subscription-manager status&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dnf repolist -v&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#rhel satellite rejoin&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;subscription-manager status&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;subscription-manager release&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;subscription-manager repos --list-enabled&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;subscription-manager unregister&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;subscription-manager register --org&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;asd&amp;#39;&lt;/span&gt; --activationkey&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;activation-key&amp;#39;&lt;/span&gt; --force --release&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&amp;lt;7Server,8,9&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;subscription-manager attach --auto&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;subscription-manager repos --enable&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;rhel-6-server-optional-rpms&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#check which packages were installed from yum history&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum history&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum history info &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#show which package provides the command &amp;#39;netstat&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum whatprovides netstat&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;virtualization&#34;&gt;&#xA;  Virtualization&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#virtualization&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#get IP addresses of KVM VMs&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;virsh list | awk &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt; | xargs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#Connect to KVM with virt-manager&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;virt-manager --connect qemu+ssh://root@kvm.home.arpa/system&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#create a checkpoint (snapshot) of a VM&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;virsh snapshot-create-as test.home.arpa checkpoint-name --description &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Checkpoint before update&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#list all checkpoints for a VM&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;virsh snapshot-list test.home.arpa&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#revert VM to a checkpoint&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;virsh snapshot-revert test.home.arpa checkpoint-name&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#delete a checkpoint&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;virsh snapshot-delete test.home.arpa checkpoint-name&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#create checkpoint with memory state (live snapshot)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;virsh snapshot-create-as test.home.arpa checkpoint-name --description &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Live checkpoint&amp;#34;&lt;/span&gt; --memspec file&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/var/lib/libvirt/qemu/save/test.home.arpa.save&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;containers&#34;&gt;&#xA;  Containers&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#containers&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#podman cheat sheet&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;podman build ./Dockerfile -t yt-dlp:latest&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;podman images&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;podman rmi 8121a9f5303b&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;podman run --name youtube -dt yt-dlp:latest&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;podman ps&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#kubectl&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl get nodes&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl apply -f nginx.yaml&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl get deploy -A&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl delete deploy nginx -n default&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl get services&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl logs nginx-deployment-78c9ff5d49-cmbdn&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#docker install&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dnf -y install dnf-plugins-core&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#docker cheat sheet&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker ps -a&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker exec -ti awx_task /bin/bash&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker stats&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker-compose up -d&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker-compose down -d&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker-compose logs nginx&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker-compose config&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker images&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker system prune --all&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#update docker compose containers&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker compose pull&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker compose up -d --force-recreate&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;troubleshooting&#34;&gt;&#xA;  Troubleshooting&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#troubleshooting&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#check which DNS server offers results&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dig 97.94.87.in-addr.arpa NS +short&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#list all DNS records using dig (requires bind-utils)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dig +nocmd example.com any +multiline +noall +answer&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#TXT record lookup via dig&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dig -t txt lenovo.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#test UDP port 53&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nc -vz -u 1.1.1.1 &lt;span style=&#34;color:#ae81ff&#34;&gt;53&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#test TCP port 22&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nc -zv 10.10.10.100 &lt;span style=&#34;color:#ae81ff&#34;&gt;22&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#tcpdump examples&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tcpdump -i ens160 dst port &lt;span style=&#34;color:#ae81ff&#34;&gt;5544&lt;/span&gt; and host 10.10.10.150 -vvv&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tcpdump tcp -X -i ens192 dst port &lt;span style=&#34;color:#ae81ff&#34;&gt;514&lt;/span&gt; and host 10.10.10.10 -w /tmp/mycap.pcap -vvv&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tcpdump tcp -X -i ens192 dst 10.10.10.10 -w /tmp/mycap.pcap -vvv&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#ping flooding with max packet size&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ping -f -l &lt;span style=&#34;color:#ae81ff&#34;&gt;65536&lt;/span&gt; -s &lt;span style=&#34;color:#ae81ff&#34;&gt;1500&lt;/span&gt; 10.10.10.9&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#ngrep show port&amp;#39;s traffic&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ngrep -d any port &lt;span style=&#34;color:#ae81ff&#34;&gt;25&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#simulate syslog messages (UDP) via netcat&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;test&amp;#39;&lt;/span&gt; | nc -u 10.10.10.50 &lt;span style=&#34;color:#ae81ff&#34;&gt;5555&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#scan all TCP and UDP ports&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nmap -sU -sT -p0-65535 10.0.0.1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;fun--novelty&#34;&gt;&#xA;  Fun &amp;amp; Novelty&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#fun--novelty&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#novelty&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh chat.shazow.net&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;telnet mapscii.me&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fortune | cowsay&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat greeting.txt | boxes -d diamonds -a c&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://blog.nousiainen.xyz/docs/powershell-vscode-precommit/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://blog.nousiainen.xyz/docs/powershell-vscode-precommit/</guid>
      <description>&lt;h1 id=&#34;automating-powershell-code-formatting-with-pre-commit-hooks&#34;&gt;&#xA;  Automating PowerShell Code Formatting with Pre-Commit Hooks&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#automating-powershell-code-formatting-with-pre-commit-hooks&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;the-problem&#34;&gt;&#xA;  The Problem&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#the-problem&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;If you&amp;rsquo;re working on a PowerShell project with multiple developers, you&amp;rsquo;ve probably experienced the pain of inconsistent code formatting. One developer uses tabs, another uses spaces. Braces are sometimes on the same line, sometimes on a new line. It&amp;rsquo;s a mess, and code reviews become debates about formatting instead of logic.&lt;/p&gt;&#xA;&lt;p&gt;VS Code&amp;rsquo;s PowerShell extension has a great &amp;ldquo;Format Document&amp;rdquo; feature, but let&amp;rsquo;s be honest—developers forget to use it.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
