<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Janak Shrestha</title>
    <description>The latest articles on DEV Community by Janak Shrestha (@janak0ff).</description>
    <link>https://dev.to/janak0ff</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F669804%2F8baf407d-13b3-4a51-888b-808a72d4ef8f.jpg</url>
      <title>DEV Community: Janak Shrestha</title>
      <link>https://dev.to/janak0ff</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/janak0ff"/>
    <language>en</language>
    <item>
      <title>Day 59: Troubleshoot Deployment Issues in Kubernetes</title>
      <dc:creator>Janak Shrestha</dc:creator>
      <pubDate>Sun, 30 Aug 2026 14:31:18 +0000</pubDate>
      <link>https://dev.to/janak0ff/day-59-troubleshoot-deployment-issues-in-kubernetes-5gd5</link>
      <guid>https://dev.to/janak0ff/day-59-troubleshoot-deployment-issues-in-kubernetes-5gd5</guid>
      <description>&lt;p&gt;The Nautilus DevOps team is working on a Kubernetes template to deploy a web application on the cluster. There are some requirements to create/use persistent volumes to store the application code, and the template needs to be designed accordingly. Please find more details below:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Create a&amp;nbsp;&lt;code&gt;PersistentVolume&lt;/code&gt;&amp;nbsp;named as&amp;nbsp;&lt;code&gt;pv-devops&lt;/code&gt;. Configure the&amp;nbsp;&lt;code&gt;spec&lt;/code&gt;&amp;nbsp;as storage class should be&amp;nbsp;&lt;code&gt;manual&lt;/code&gt;, set capacity to&amp;nbsp;&lt;code&gt;3Gi&lt;/code&gt;, set access mode to&amp;nbsp;&lt;code&gt;ReadWriteOnce&lt;/code&gt;, volume type should be&amp;nbsp;&lt;code&gt;hostPath&lt;/code&gt;&amp;nbsp;and set path to&amp;nbsp;&lt;code&gt;/mnt/itadmin&lt;/code&gt;&amp;nbsp;(this directory is already created, you might not be able to access it directly, so you need not to worry about it).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a&amp;nbsp;&lt;code&gt;PersistentVolumeClaim&lt;/code&gt;&amp;nbsp;named as&amp;nbsp;&lt;code&gt;pvc-devops&lt;/code&gt;. Configure the&amp;nbsp;&lt;code&gt;spec&lt;/code&gt;&amp;nbsp;as storage class should be&amp;nbsp;&lt;code&gt;manual&lt;/code&gt;, request&amp;nbsp;&lt;code&gt;3Gi&lt;/code&gt;&amp;nbsp;of the storage, set access mode to&amp;nbsp;&lt;code&gt;ReadWriteOnce&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a&amp;nbsp;&lt;code&gt;pod&lt;/code&gt;&amp;nbsp;named as&amp;nbsp;&lt;code&gt;pod-devops&lt;/code&gt;, mount the persistent volume you created with claim name&amp;nbsp;&lt;code&gt;pvc-devops&lt;/code&gt;&amp;nbsp;at document root of the web server, the container within the pod should be named as&amp;nbsp;&lt;code&gt;container-devops&lt;/code&gt;&amp;nbsp;using image&amp;nbsp;&lt;code&gt;httpd&lt;/code&gt;&amp;nbsp;with&amp;nbsp;&lt;code&gt;latest&lt;/code&gt;&amp;nbsp;tag only (remember to mention the tag i.e&amp;nbsp;&lt;code&gt;httpd:latest&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a node port type service named&amp;nbsp;&lt;code&gt;web-devops&lt;/code&gt;&amp;nbsp;using node port&amp;nbsp;&lt;code&gt;30008&lt;/code&gt;&amp;nbsp;to expose the web server running within the pod.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Understanding Persistent Volumes and Claims
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is a Persistent Volume?
&lt;/h3&gt;

&lt;p&gt;A Persistent Volume (PV) is a piece of storage in the cluster that has been provisioned by an administrator. It is a cluster resource, similar to a node, and is independent of any individual pod.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is a Persistent Volume Claim?
&lt;/h3&gt;

&lt;p&gt;A Persistent Volume Claim (PVC) is a request for storage by a user. It is similar to a pod in that a pod consumes node resources, while a PVC consumes PV resources.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Relationship Between PV and PVC
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────────────────────┐
│                    Persistent Volume Workflow                              │
│                                                                              │
│  ┌────────────────────────────────────────────────────────────────────────┐ │
│  │  Administrator: Creates PersistentVolume (PV)                        │ │
│  │  - Defines storage capacity                                          │ │
│  │  - Sets access modes                                                 │ │
│  │  - Specifies storage type (hostPath, NFS, etc.)                    │ │
│  └────────────────────────────────────────────────────────────────────────┘ │
│                                    │                                         │
│                                    ▼                                         │
│  ┌────────────────────────────────────────────────────────────────────────┐ │
│  │  User: Creates PersistentVolumeClaim (PVC)                          │ │
│  │  - Requests storage capacity                                         │ │
│  │  - Specifies access modes                                            │ │
│  │  - Binds to a matching PV                                            │ │
│  └────────────────────────────────────────────────────────────────────────┘ │
│                                    │                                         │
│                                    ▼                                         │
│  ┌────────────────────────────────────────────────────────────────────────┐ │
│  │  Pod: Uses PVC to mount storage                                     │ │
│  │  - References PVC in volumes section                                 │ │
│  │  - Mounts volume at specified path                                   │ │
│  └────────────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What We Will Build
&lt;/h2&gt;

&lt;p&gt;We are going to deploy a complete web application with persistent storage:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Specification&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PersistentVolume&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;pv-devops&lt;/code&gt; – 3Gi, manual storage class, hostPath&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PersistentVolumeClaim&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;pvc-devops&lt;/code&gt; – 3Gi request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pod&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;pod-devops&lt;/code&gt; – httpd web server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Service&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;web-devops&lt;/code&gt; – NodePort on 30008&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Architecture Overview
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────────────────────┐
│                         Kubernetes Cluster                                 │
│                                                                              │
│  ┌────────────────────────────────────────────────────────────────────────┐ │
│  │  PersistentVolume: pv-devops                                          │ │
│  │  - Capacity: 3Gi                                                     │ │
│  │  - Access Mode: ReadWriteOnce                                        │ │
│  │  - Storage Class: manual                                             │ │
│  │  - HostPath: /mnt/itadmin                                            │ │
│  └────────────────────────────────────────────────────────────────────────┘ │
│                                    │                                         │
│                                    ▼                                         │
│  ┌────────────────────────────────────────────────────────────────────────┐ │
│  │  PersistentVolumeClaim: pvc-devops                                   │ │
│  │  - Requests: 3Gi                                                     │ │
│  │  - Access Mode: ReadWriteOnce                                        │ │
│  │  - Storage Class: manual                                             │ │
│  │  - Bound to: pv-devops                                               │ │
│  └────────────────────────────────────────────────────────────────────────┘ │
│                                    │                                         │
│                                    ▼                                         │
│  ┌────────────────────────────────────────────────────────────────────────┐ │
│  │  Pod: pod-devops                                                      │ │
│  │  ┌──────────────────────────────────────────────────────────────────┐ │ │
│  │  │  Container: container-devops                                    │ │ │
│  │  │  Image: httpd:latest                                            │ │ │
│  │  │  Port: 80                                                       │ │ │
│  │  │  Volume: pvc-storage → pvc-devops                               │ │ │
│  │  │  Mount: /usr/local/apache2/htdocs                               │ │ │
│  │  └──────────────────────────────────────────────────────────────────┘ │ │
│  └────────────────────────────────────────────────────────────────────────┘ │
│                                    │                                         │
│                                    ▼                                         │
│  ┌────────────────────────────────────────────────────────────────────────┐ │
│  │  Service: web-devops                                                  │ │
│  │  - Type: NodePort                                                    │ │
│  │  - Selector: app=httpd                                               │ │
│  │  - Port: 80                                                          │ │
│  │  - NodePort: 30008                                                   │ │
│  └────────────────────────────────────────────────────────────────────────┘ │
│                                    │                                         │
│                                    ▼                                         │
│                    http://&amp;lt;node-ip&amp;gt;:30008                                  │
└─────────────────────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step-by-Step Implementation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Create the PersistentVolume
&lt;/h3&gt;

&lt;p&gt;Create a file named &lt;code&gt;pv-devops.yaml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PersistentVolume&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pv-devops&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;storageClassName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;manual&lt;/span&gt;
  &lt;span class="na"&gt;capacity&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;storage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;3Gi&lt;/span&gt;
  &lt;span class="na"&gt;accessModes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ReadWriteOnce&lt;/span&gt;
  &lt;span class="na"&gt;hostPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/mnt/itadmin&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;storageClassName: manual&lt;/code&gt; – Identifies the storage class&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;capacity.storage: 3Gi&lt;/code&gt; – Allocates 3 gigabytes of storage&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;accessModes: ReadWriteOnce&lt;/code&gt; – Can be mounted as read-write by a single node&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hostPath.path: /mnt/itadmin&lt;/code&gt; – Uses the host node's filesystem&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 2: Create the PersistentVolumeClaim
&lt;/h3&gt;

&lt;p&gt;Create a file named &lt;code&gt;pvc-devops.yaml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PersistentVolumeClaim&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pvc-devops&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;storageClassName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;manual&lt;/span&gt;
  &lt;span class="na"&gt;accessModes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ReadWriteOnce&lt;/span&gt;
  &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;storage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;3Gi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;storageClassName&lt;/code&gt; must match the PV's storage class&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;accessModes&lt;/code&gt; must match the PV's access modes&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;resources.requests.storage&lt;/code&gt; – Requests 3Gi of storage&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 3: Create the Pod
&lt;/h3&gt;

&lt;p&gt;Create a file named &lt;code&gt;pod-devops.yaml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Pod&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pod-devops&lt;/span&gt;
  &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;httpd&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;container-devops&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;httpd:latest&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;containerPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
    &lt;span class="na"&gt;volumeMounts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pvc-storage&lt;/span&gt;
      &lt;span class="na"&gt;mountPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/usr/local/apache2/htdocs&lt;/span&gt;
  &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pvc-storage&lt;/span&gt;
    &lt;span class="na"&gt;persistentVolumeClaim&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;claimName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pvc-devops&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;labels.app: httpd&lt;/code&gt; – Used by the service for selection&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;volumeMounts.mountPath&lt;/code&gt; – The document root for httpd&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;persistentVolumeClaim.claimName&lt;/code&gt; – References the PVC&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 4: Create the Service
&lt;/h3&gt;

&lt;p&gt;Create a file named &lt;code&gt;service-devops.yaml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Service&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;web-devops&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;NodePort&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;httpd&lt;/span&gt;
  &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
      &lt;span class="na"&gt;targetPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
      &lt;span class="na"&gt;nodePort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;30008&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;type: NodePort&lt;/code&gt; – Exposes the service on a static port&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;selector.app: httpd&lt;/code&gt; – Routes traffic to pods with this label&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;nodePort: 30008&lt;/code&gt; – The port on each node&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 5: Apply the Configurations
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; pv-devops.yaml
kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; pvc-devops.yaml
kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; pod-devops.yaml
kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; service-devops.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;persistentvolume/pv-devops created
persistentvolumeclaim/pvc-devops created
pod/pod-devops created
service/web-devops created
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Verification
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Verify the PersistentVolume
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get pv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;NAME        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                STORAGECLASS
pv-devops   3Gi        RWO            Retain           Bound    default/pvc-devops   manual
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Verify the PersistentVolumeClaim
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get pvc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;NAME         STATUS   VOLUME      CAPACITY   ACCESS MODES   STORAGECLASS
pvc-devops   Bound    pv-devops   3Gi        RWO            manual
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Verify the Pod
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get pods
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;NAME         READY   STATUS    RESTARTS   AGE
pod-devops   1/1     Running   0          84s
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Verify the Service
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get services
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
&lt;/span&gt;&lt;span class="gp"&gt;kubernetes   ClusterIP   10.43.0.1      &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;443/TCP        32m
&lt;span class="gp"&gt;web-devops   NodePort    10.43.193.63   &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;80:30008/TCP   90s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5: Verify the Endpoints
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get endpoints web-devops
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;NAME         ENDPOINTS      AGE
web-devops   10.22.0.9:80   2m35s
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Accessing the Application
&lt;/h2&gt;

&lt;p&gt;The application can now be accessed at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://&amp;lt;node-ip&amp;gt;:30008
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Default Httpd Page
&lt;/h3&gt;

&lt;p&gt;When accessing the URL, you should see the default Apache HTTP Server welcome page, confirming that the web server is running and the persistent volume is mounted correctly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Concepts
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Access Modes
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Access Mode&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;ReadWriteOnce&lt;/code&gt; (RWO)&lt;/td&gt;
&lt;td&gt;Volume can be mounted as read-write by a single node&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;ReadOnlyMany&lt;/code&gt; (ROX)&lt;/td&gt;
&lt;td&gt;Volume can be mounted as read-only by many nodes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;ReadWriteMany&lt;/code&gt; (RWX)&lt;/td&gt;
&lt;td&gt;Volume can be mounted as read-write by many nodes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Storage Classes
&lt;/h3&gt;

&lt;p&gt;Storage classes provide a way to define different types of storage:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;manual&lt;/code&gt; – For manually provisioned storage&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;standard&lt;/code&gt; – For dynamically provisioned storage&lt;/li&gt;
&lt;li&gt;Custom classes – For specific storage providers (AWS EBS, GCE PD, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Reclaim Policies
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Policy&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Retain&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Volume is retained after PVC deletion (manual cleanup required)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Recycle&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Volume is scrubbed and made available again (deprecated)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Delete&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Volume is deleted when PVC is deleted&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  HostPath Volume
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;hostPath&lt;/code&gt; mounts a directory from the host node's filesystem. This is useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Development and testing&lt;/li&gt;
&lt;li&gt;Accessing host system files&lt;/li&gt;
&lt;li&gt;Single-node clusters&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For production environments, consider using network-attached storage like NFS, or cloud provider storage solutions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  PVC Stuck in Pending State
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check the PVC status&lt;/span&gt;
kubectl get pvc

&lt;span class="c"&gt;# View detailed PVC information&lt;/span&gt;
kubectl describe pvc pvc-devops

&lt;span class="c"&gt;# Check for available PVs&lt;/span&gt;
kubectl get pv

&lt;span class="c"&gt;# Verify storage class and access modes match&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pod Fails to Start
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check pod status&lt;/span&gt;
kubectl get pods

&lt;span class="c"&gt;# View pod details&lt;/span&gt;
kubectl describe pod pod-devops

&lt;span class="c"&gt;# Check pod logs&lt;/span&gt;
kubectl logs pod-devops
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Service Not Accessible
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check service status&lt;/span&gt;
kubectl get services

&lt;span class="c"&gt;# Check endpoints&lt;/span&gt;
kubectl get endpoints web-devops

&lt;span class="c"&gt;# Verify NodePort&lt;/span&gt;
kubectl get service web-devops &lt;span class="nt"&gt;-o&lt;/span&gt; yaml | &lt;span class="nb"&gt;grep &lt;/span&gt;nodePort
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Best Practices
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Use Appropriate Storage Classes
&lt;/h3&gt;

&lt;p&gt;Choose the right storage class for your workload:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;manual&lt;/code&gt; – For testing and development&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;standard&lt;/code&gt; – For production with dynamic provisioning&lt;/li&gt;
&lt;li&gt;Custom classes – For specific performance or availability requirements&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Set Resource Requests
&lt;/h3&gt;

&lt;p&gt;Always set appropriate storage requests:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Request only what you need&lt;/li&gt;
&lt;li&gt;Monitor usage to adjust requests&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Use Reclaim Policies Wisely
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Retain&lt;/code&gt; – For important data that should not be accidentally deleted&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Delete&lt;/code&gt; – For temporary or disposable data&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Consider PersistentVolume Snapshots
&lt;/h3&gt;

&lt;p&gt;For production workloads, consider using volume snapshots for backup and disaster recovery.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Monitor Storage Usage
&lt;/h3&gt;

&lt;p&gt;Use monitoring tools to track storage usage and capacity.&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;In this challenge, we successfully:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Created a PersistentVolume with 3Gi capacity, hostPath storage, and manual storage class&lt;/li&gt;
&lt;li&gt;Created a PersistentVolumeClaim requesting 3Gi of storage&lt;/li&gt;
&lt;li&gt;Deployed a pod running the httpd web server with the PVC mounted at the document root&lt;/li&gt;
&lt;li&gt;Exposed the application using a NodePort service on port 30008&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This deployment pattern is foundational for stateful applications in Kubernetes. Understanding how to manage persistent storage is essential for running production workloads like databases, content management systems, and any application that requires data persistence.&lt;/p&gt;




&lt;h2&gt;
  
  
  Useful Commands Reference
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;kubectl get pv&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List all PersistentVolumes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;kubectl get pvc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List all PersistentVolumeClaims&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;kubectl describe pv pv-devops&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Detailed PV information&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;kubectl describe pvc pvc-devops&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Detailed PVC information&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;kubectl get pods --show-labels&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List pods with labels&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;kubectl get endpoints web-devops&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Check service endpoints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;kubectl describe service web-devops&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Detailed service information&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;kubectl logs pod-devops&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;View pod logs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;kubectl get nodes -o wide&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Get node IP addresses&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>devops</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>Day 59: Troubleshoot Deployment Issues in Kubernetes</title>
      <dc:creator>Janak Shrestha</dc:creator>
      <pubDate>Sun, 30 Aug 2026 14:11:41 +0000</pubDate>
      <link>https://dev.to/janak0ff/day-59-troubleshoot-deployment-issues-in-kubernetes-3jg5</link>
      <guid>https://dev.to/janak0ff/day-59-troubleshoot-deployment-issues-in-kubernetes-3jg5</guid>
      <description>&lt;p&gt;Last week, the Nautilus DevOps team deployed a redis app on Kubernetes cluster, which was working fine so far. This morning one of the team members was making some changes in this existing setup, but he made some mistakes and the app went down. We need to fix this as soon as possible. Please take a look.&lt;/p&gt;

&lt;p&gt;The deployment name is redis-deployment. The pods are not in running state right now, so please look into the issue and fix the same.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 1: Identify the Issue
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get deployments
kubectl get pods
kubectl describe deployment redis-deployment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Issues Found:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pod stuck in &lt;code&gt;ContainerCreating&lt;/code&gt; status&lt;/li&gt;
&lt;li&gt;Image: &lt;code&gt;redis:alpin&lt;/code&gt; (invalid, should be &lt;code&gt;redis:alpine&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;ConfigMap: &lt;code&gt;redis-conig&lt;/code&gt; (misspelled, should be &lt;code&gt;redis-config&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 2: Delete the Faulty Deployment
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl delete deployment redis-deployment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Create Corrected YAML
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; redis-deployment-fixed.yaml &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-deployment
  labels:
    app: redis
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
      - name: redis-container
        image: redis:alpine
        ports:
        - containerPort: 6379
        resources:
          requests:
            cpu: 300m
        volumeMounts:
        - mountPath: /redis-master-data
          name: data
        - mountPath: /redis-master
          name: config
      volumes:
      - name: data
        emptyDir: {}
      - name: config
        configMap:
          name: redis-config
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Apply the Corrected Deployment
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; redis-deployment-fixed.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5: Verify the Fix
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get deployments
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NAME               READY   UP-TO-DATE   AVAILABLE   AGE
redis-deployment   1/1     1            1           31s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get pods
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NAME                                READY   STATUS    RESTARTS   AGE
redis-deployment-5476b4ddd6-f7txp   1/1     Running   0          31s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Key Learnings
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Common Issues and Fixes
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Issue&lt;/th&gt;
&lt;th&gt;Symptom&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Invalid image name&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ContainerCreating&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Use correct image name and tag&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Misspelled ConfigMap&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ContainerCreating&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Match ConfigMap name exactly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Missing ConfigMap&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ContainerCreating&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Create the ConfigMap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resource limits&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Pending&lt;/code&gt; or &lt;code&gt;CrashLoopBackOff&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Adjust resource requests/limits&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Troubleshooting Commands
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;kubectl get deployments&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Check deployment status&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;kubectl get pods&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Check pod status&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;kubectl describe deployment &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Detailed deployment info&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;kubectl describe pod &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Detailed pod info&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;kubectl logs &amp;lt;pod-name&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;View pod logs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;kubectl get events&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;View cluster events&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;kubectl rollout status deployment &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Check rollout status&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>devops</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>Ansible Blockinfile Module</title>
      <dc:creator>Janak Shrestha</dc:creator>
      <pubDate>Sun, 30 Aug 2026 13:59:39 +0000</pubDate>
      <link>https://dev.to/janak0ff/ansible-blockinfile-module-18m3</link>
      <guid>https://dev.to/janak0ff/ansible-blockinfile-module-18m3</guid>
      <description>&lt;p&gt;The Nautilus DevOps team wants to install and set up a simple&amp;nbsp;&lt;code&gt;httpd&lt;/code&gt;&amp;nbsp;web server on all app servers in&amp;nbsp;&lt;code&gt;Stratos DC&lt;/code&gt;. Additionally, they want to deploy a sample web page for now using Ansible only. Therefore, write the required playbook to complete this task. Find more details about the task below.  &lt;/p&gt;

&lt;p&gt;We already have an&amp;nbsp;&lt;code&gt;inventory&lt;/code&gt;&amp;nbsp;file under&amp;nbsp;&lt;code&gt;/home/thor/ansible&lt;/code&gt;&amp;nbsp;directory on&amp;nbsp;&lt;code&gt;jump host&lt;/code&gt;. Create a&amp;nbsp;&lt;code&gt;playbook.yml&lt;/code&gt;&amp;nbsp;under&amp;nbsp;&lt;code&gt;/home/thor/ansible&lt;/code&gt;&amp;nbsp;directory on&amp;nbsp;&lt;code&gt;jump host&lt;/code&gt;&amp;nbsp;itself.  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Using the playbook, install&amp;nbsp;&lt;code&gt;httpd&lt;/code&gt;&amp;nbsp;web server on all app servers. Additionally, make sure its service should up and running.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Using&amp;nbsp;&lt;code&gt;blockinfile&lt;/code&gt;&amp;nbsp;Ansible module add some content in&amp;nbsp;&lt;code&gt;/var/www/html/index.html&lt;/code&gt;&amp;nbsp;file. Below is the content:&lt;br&gt;&lt;br&gt;
&lt;code&gt;Welcome to XfusionCorp!&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;This is Nautilus sample file, created using Ansible!&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;Please do not modify this file manually!&lt;/code&gt;  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The&amp;nbsp;&lt;code&gt;/var/www/html/index.html&lt;/code&gt;&amp;nbsp;file's user and group&amp;nbsp;&lt;code&gt;owner&lt;/code&gt;&amp;nbsp;should be&amp;nbsp;&lt;code&gt;apache&lt;/code&gt;&amp;nbsp;on all app servers.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The&amp;nbsp;&lt;code&gt;/var/www/html/index.html&lt;/code&gt;&amp;nbsp;file's permissions should be&amp;nbsp;&lt;code&gt;0644&lt;/code&gt;&amp;nbsp;on all app servers.  &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;Note:&lt;/code&gt;&lt;br&gt;&lt;br&gt;
i. Validation will try to run the playbook using command&amp;nbsp;&lt;code&gt;ansible-playbook -i inventory playbook.yml&lt;/code&gt;&amp;nbsp;so please make sure the playbook works this way without passing any extra arguments.  &lt;/p&gt;

&lt;p&gt;ii. Do not use any custom or empty&amp;nbsp;&lt;code&gt;marker&lt;/code&gt;&amp;nbsp;for&amp;nbsp;&lt;code&gt;blockinfile&lt;/code&gt;&amp;nbsp;module.&lt;/p&gt;




&lt;h2&gt;
  
  
  📋 Introduction
&lt;/h2&gt;

&lt;p&gt;In the world of DevOps, automation is the cornerstone of efficiency and consistency. The Nautilus DevOps team recently needed to deploy a simple HTTPD web server across all application servers in the Stratos DC with a sample web page. Instead of manually configuring each server, we leveraged Ansible's powerful automation capabilities—specifically the &lt;code&gt;blockinfile&lt;/code&gt; module—to complete this task seamlessly.&lt;/p&gt;

&lt;p&gt;This blog post documents the complete process, from understanding the requirements to successful deployment and verification.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 The Challenge
&lt;/h2&gt;

&lt;p&gt;The team had specific requirements for all application servers:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Requirement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Web Server&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;HTTPD (Apache) installed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Service Status&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Running and enabled on boot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Web Page Location&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/var/www/html/index.html&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Content&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Specific welcome message&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;File Owner&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;apache:apache&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;File Permissions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0644 (rw-r--r--)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Content Module&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;blockinfile with default markers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Content to Deploy
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;Welcome to XfusionCorp!

This is  Nautilus sample file, created using Ansible!

Please do not modify this file manually!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🛠️ The Solution: Ansible Playbook
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Complete Playbook
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy HTTPD web server with sample page&lt;/span&gt;
  &lt;span class="na"&gt;hosts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;all&lt;/span&gt;
  &lt;span class="na"&gt;gather_facts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;

  &lt;span class="na"&gt;tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Task 1: Install httpd web server&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install httpd web server&lt;/span&gt;
      &lt;span class="na"&gt;package&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;httpd&lt;/span&gt;
        &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;present&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;

    &lt;span class="c1"&gt;# Task 2: Start and enable httpd service&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Start and enable httpd service&lt;/span&gt;
      &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;httpd&lt;/span&gt;
        &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;started&lt;/span&gt;
        &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;

    &lt;span class="c1"&gt;# Task 3: Create web root directory&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create web root directory&lt;/span&gt;
      &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/var/www/html&lt;/span&gt;
        &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;directory&lt;/span&gt;
        &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0755'&lt;/span&gt;
        &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apache&lt;/span&gt;
        &lt;span class="na"&gt;group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apache&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;

    &lt;span class="c1"&gt;# Task 4: Add content using blockinfile module&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Add content to index.html using blockinfile&lt;/span&gt;
      &lt;span class="na"&gt;blockinfile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/var/www/html/index.html&lt;/span&gt;
        &lt;span class="na"&gt;block&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;Welcome to XfusionCorp!&lt;/span&gt;

          &lt;span class="s"&gt;This is  Nautilus sample file, created using Ansible!&lt;/span&gt;

          &lt;span class="s"&gt;Please do not modify this file manually!&lt;/span&gt;
        &lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
        &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apache&lt;/span&gt;
        &lt;span class="na"&gt;group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apache&lt;/span&gt;
        &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0644'&lt;/span&gt;
        &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;present&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Playbook Breakdown
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. &lt;strong&gt;Package Installation&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install httpd web server&lt;/span&gt;
  &lt;span class="na"&gt;package&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;httpd&lt;/span&gt;
    &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;present&lt;/span&gt;
  &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uses the &lt;code&gt;package&lt;/code&gt; module to install HTTPD. The &lt;code&gt;package&lt;/code&gt; module intelligently chooses the appropriate package manager (yum, apt, etc.) based on the target system.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. &lt;strong&gt;Service Management&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Start and enable httpd service&lt;/span&gt;
  &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;httpd&lt;/span&gt;
    &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;started&lt;/span&gt;
    &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
  &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ensures the HTTPD service is both running (&lt;code&gt;state: started&lt;/code&gt;) and configured to start automatically on boot (&lt;code&gt;enabled: yes&lt;/code&gt;).&lt;/p&gt;

&lt;h4&gt;
  
  
  3. &lt;strong&gt;Web Root Directory Setup&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create web root directory&lt;/span&gt;
  &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/var/www/html&lt;/span&gt;
    &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;directory&lt;/span&gt;
    &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0755'&lt;/span&gt;
    &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apache&lt;/span&gt;
    &lt;span class="na"&gt;group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apache&lt;/span&gt;
  &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Creates the web root directory with proper permissions and ownership.&lt;/p&gt;

&lt;h4&gt;
  
  
  4. &lt;strong&gt;Content Management with Blockinfile&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Add content to index.html using blockinfile&lt;/span&gt;
  &lt;span class="na"&gt;blockinfile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/var/www/html/index.html&lt;/span&gt;
    &lt;span class="na"&gt;block&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
      &lt;span class="s"&gt;Welcome to XfusionCorp!&lt;/span&gt;

      &lt;span class="s"&gt;This is  Nautilus sample file, created using Ansible!&lt;/span&gt;

      &lt;span class="s"&gt;Please do not modify this file manually!&lt;/span&gt;
    &lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
    &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apache&lt;/span&gt;
    &lt;span class="na"&gt;group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apache&lt;/span&gt;
    &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0644'&lt;/span&gt;
    &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;present&lt;/span&gt;
  &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The &lt;code&gt;blockinfile&lt;/code&gt; module:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inserts a block of text into a file&lt;/li&gt;
&lt;li&gt;Uses default markers (&lt;code&gt;# BEGIN ANSIBLE MANAGED BLOCK&lt;/code&gt; and &lt;code&gt;# END ANSIBLE MANAGED BLOCK&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Creates the file if it doesn't exist (&lt;code&gt;create: yes&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Sets ownership and permissions in one task&lt;/li&gt;
&lt;li&gt;Is idempotent—won't duplicate content if re-run&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚀 Execution and Results
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Running the Playbook
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /home/thor/ansible
ansible-playbook &lt;span class="nt"&gt;-i&lt;/span&gt; inventory playbook.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Successful Output
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;PLAY [Deploy HTTPD web server with sample page] *********************************

TASK [Gathering Facts] **********************************************************
ok: [stapp01]
ok: [stapp02]
ok: [stapp03]

TASK [Install httpd web server] *************************************************
changed: [stapp01]
changed: [stapp02]
changed: [stapp03]

TASK [Start and enable httpd service] *******************************************
changed: [stapp01]
changed: [stapp02]
changed: [stapp03]

TASK [Create web root directory] ************************************************
changed: [stapp01]
changed: [stapp02]
changed: [stapp03]

TASK [Add content to index.html using blockinfile] *****************************
changed: [stapp01]
changed: [stapp02]
changed: [stapp03]

PLAY RECAP *********************************************************************
stapp01 : ok=5 changed=4 unreachable=0 failed=0 skipped=0
stapp02 : ok=5 changed=4 unreachable=0 failed=0 skipped=0
stapp03 : ok=5 changed=4 unreachable=0 failed=0 skipped=0
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔍 Verification
&lt;/h2&gt;

&lt;h3&gt;
  
  
  File Existence and Permissions
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory all &lt;span class="nt"&gt;-m&lt;/span&gt; shell &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"ls -la /var/www/html/index.html"&lt;/span&gt; &lt;span class="nt"&gt;--become&lt;/span&gt;

stapp01 | CHANGED | &lt;span class="nv"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0 &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 apache apache 179 Aug 30 13:55 /var/www/html/index.html

stapp02 | CHANGED | &lt;span class="nv"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0 &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 apache apache 179 Aug 30 13:55 /var/www/html/index.html

stapp03 | CHANGED | &lt;span class="nv"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0 &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 apache apache 179 Aug 30 13:55 /var/www/html/index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;✅ Permissions:&lt;/strong&gt; 0644 (rw-r--r--)&lt;br&gt;
&lt;strong&gt;✅ Owner:&lt;/strong&gt; apache:apache&lt;/p&gt;

&lt;h3&gt;
  
  
  File Content with Markers
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory all &lt;span class="nt"&gt;-m&lt;/span&gt; shell &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"cat /var/www/html/index.html"&lt;/span&gt; &lt;span class="nt"&gt;--become&lt;/span&gt;

stapp01 | CHANGED | &lt;span class="nv"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0 &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;# BEGIN ANSIBLE MANAGED BLOCK&lt;/span&gt;
Welcome to XfusionCorp!

This is  Nautilus sample file, created using Ansible!

Please &lt;span class="k"&gt;do &lt;/span&gt;not modify this file manually!
&lt;span class="c"&gt;# END ANSIBLE MANAGED BLOCK&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;✅ Content:&lt;/strong&gt; Matches requirements exactly&lt;br&gt;
&lt;strong&gt;✅ Markers:&lt;/strong&gt; Default markers added automatically by blockinfile&lt;/p&gt;

&lt;h3&gt;
  
  
  Service Status
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory all &lt;span class="nt"&gt;-m&lt;/span&gt; shell &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"systemctl status httpd"&lt;/span&gt; &lt;span class="nt"&gt;--become&lt;/span&gt;

stapp01 | CHANGED | &lt;span class="nv"&gt;rc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0 &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;
● httpd.service - The Apache HTTP Server
   Loaded: loaded &lt;span class="o"&gt;(&lt;/span&gt;/usr/lib/systemd/system/httpd.service&lt;span class="p"&gt;;&lt;/span&gt; enabled&lt;span class="o"&gt;)&lt;/span&gt;
   Active: active &lt;span class="o"&gt;(&lt;/span&gt;running&lt;span class="o"&gt;)&lt;/span&gt; since Sun 2026-08-30 13:55:49 UTC
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;✅ Service:&lt;/strong&gt; Active (running)&lt;br&gt;
&lt;strong&gt;✅ Enabled:&lt;/strong&gt; Boot startup configured&lt;/p&gt;




&lt;h2&gt;
  
  
  📊 Comparison: Before vs After
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HTTPD Installed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Not installed&lt;/td&gt;
&lt;td&gt;✅ Installed on all servers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Service Running&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Not running&lt;/td&gt;
&lt;td&gt;✅ Active and running&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Web Root Directory&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Not present&lt;/td&gt;
&lt;td&gt;✅ Created with correct permissions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;index.html&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Missing&lt;/td&gt;
&lt;td&gt;✅ Created with correct content&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;File Owner&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;✅ apache:apache&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;File Permissions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;✅ 0644&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Content Markers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;✅ Default markers present&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  💡 Key Learnings
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;The Power of Blockinfile&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;blockinfile&lt;/code&gt; module is perfect for managing configuration files or content blocks. Key benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Idempotent:&lt;/strong&gt; Safe to run multiple times&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Default Markers:&lt;/strong&gt; Provides clear boundaries for managed content&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Single Task:&lt;/strong&gt; Handles creation, content insertion, and permissions in one go&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Idempotency in Action&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Running the playbook multiple times won't cause issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;First Run:&lt;/strong&gt; Creates everything (changed=4)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Second Run:&lt;/strong&gt; Verifies everything (ok=5, changed=0)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Host Pattern Flexibility&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Using &lt;code&gt;hosts: all&lt;/code&gt; ensures the playbook works regardless of inventory group structure.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Service State Management&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Combining &lt;code&gt;state: started&lt;/code&gt; and &lt;code&gt;enabled: yes&lt;/code&gt; ensures both immediate availability and persistence across reboots.&lt;/p&gt;




&lt;h2&gt;
  
  
  📋 Complete Verification Commands
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check file exists and permissions&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory all &lt;span class="nt"&gt;-m&lt;/span&gt; shell &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"ls -la /var/www/html/index.html"&lt;/span&gt; &lt;span class="nt"&gt;--become&lt;/span&gt;

&lt;span class="c"&gt;# Check content with markers&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory all &lt;span class="nt"&gt;-m&lt;/span&gt; shell &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"cat /var/www/html/index.html"&lt;/span&gt; &lt;span class="nt"&gt;--become&lt;/span&gt;

&lt;span class="c"&gt;# Check ownership&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory all &lt;span class="nt"&gt;-m&lt;/span&gt; shell &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"stat -c '%U:%G' /var/www/html/index.html"&lt;/span&gt; &lt;span class="nt"&gt;--become&lt;/span&gt;

&lt;span class="c"&gt;# Check permissions&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory all &lt;span class="nt"&gt;-m&lt;/span&gt; shell &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"stat -c '%a' /var/www/html/index.html"&lt;/span&gt; &lt;span class="nt"&gt;--become&lt;/span&gt;

&lt;span class="c"&gt;# Check service status&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory all &lt;span class="nt"&gt;-m&lt;/span&gt; shell &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"systemctl status httpd"&lt;/span&gt; &lt;span class="nt"&gt;--become&lt;/span&gt;

&lt;span class="c"&gt;# Test web server response&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory all &lt;span class="nt"&gt;-m&lt;/span&gt; shell &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"curl -s http://localhost/ | head -3"&lt;/span&gt; &lt;span class="nt"&gt;--become&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🎉 Conclusion
&lt;/h2&gt;

&lt;p&gt;The Ansible playbook successfully automated the HTTPD web server deployment across all application servers with:&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Simple Setup:&lt;/strong&gt; Just one playbook file&lt;br&gt;
✅ &lt;strong&gt;Consistent Results:&lt;/strong&gt; Same configuration on all servers&lt;br&gt;
✅ &lt;strong&gt;Proper Permissions:&lt;/strong&gt; apache:apache ownership with 0644 permissions&lt;br&gt;
✅ &lt;strong&gt;Correct Content:&lt;/strong&gt; The exact message with default markers&lt;br&gt;
✅ &lt;strong&gt;Service Management:&lt;/strong&gt; Running and enabled on boot&lt;br&gt;
✅ &lt;strong&gt;Idempotency:&lt;/strong&gt; Safe to run multiple times&lt;/p&gt;

&lt;h3&gt;
  
  
  Business Benefits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Time Savings:&lt;/strong&gt; Automated what would be a 15-minute manual task per server&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consistency:&lt;/strong&gt; No configuration drift between servers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reliability:&lt;/strong&gt; Idempotent execution ensures predictable results&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintainability:&lt;/strong&gt; Easy to update content or configuration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation:&lt;/strong&gt; Playbook serves as living documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Next Steps
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Add SSL/TLS Configuration&lt;/strong&gt; for secure connections&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implement Virtual Hosts&lt;/strong&gt; for multiple websites&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add Health Checks&lt;/strong&gt; for monitoring&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrate with CI/CD&lt;/strong&gt; for automated deployments&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Add Content Security Policies&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  📚 Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ansible Blockinfile Module&lt;/strong&gt;: &lt;a href="https://docs.ansible.com/ansible/latest/collections/ansible/builtin/blockinfile_module.html" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ansible Service Module&lt;/strong&gt;: &lt;a href="https://docs.ansible.com/ansible/latest/collections/ansible/builtin/service_module.html" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ansible File Module&lt;/strong&gt;: &lt;a href="https://docs.ansible.com/ansible/latest/collections/ansible/builtin/file_module.html" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTPD/Apache Documentation&lt;/strong&gt;: &lt;a href="https://httpd.apache.org/docs/" rel="noopener noreferrer"&gt;Apache HTTP Server&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;"Automation is not about eliminating human effort, but about maximizing human potential."&lt;/em&gt; 🚀&lt;/p&gt;




</description>
      <category>ansible</category>
    </item>
    <item>
      <title>Ansible Unarchive Module</title>
      <dc:creator>Janak Shrestha</dc:creator>
      <pubDate>Sun, 30 Aug 2026 13:16:42 +0000</pubDate>
      <link>https://dev.to/janak0ff/ansible-unarchive-module-3dhn</link>
      <guid>https://dev.to/janak0ff/ansible-unarchive-module-3dhn</guid>
      <description>&lt;p&gt;One of the DevOps team members has created a zip archive on&amp;nbsp;&lt;code&gt;jump host&lt;/code&gt;&amp;nbsp;in&amp;nbsp;&lt;code&gt;Stratos DC&lt;/code&gt;&amp;nbsp;that needs to be extracted and copied over to all app servers in&amp;nbsp;&lt;code&gt;Stratos DC&lt;/code&gt;&amp;nbsp;itself. Because this is a routine task, the&amp;nbsp;&lt;code&gt;Nautilus&lt;/code&gt;&amp;nbsp;DevOps team has suggested automating it. We can use Ansible since we have been using it for other automation tasks. Below you can find more details about the task:  &lt;/p&gt;

&lt;p&gt;We have an&amp;nbsp;&lt;code&gt;inventory&lt;/code&gt;&amp;nbsp;file under&amp;nbsp;&lt;code&gt;/home/thor/ansible&lt;/code&gt;&amp;nbsp;directory on&amp;nbsp;&lt;code&gt;jump host&lt;/code&gt;, which should have all the app servers added already.  &lt;/p&gt;

&lt;p&gt;There is a zip archive&amp;nbsp;&lt;code&gt;/usr/src/data/datacenter.zip&lt;/code&gt;&amp;nbsp;on&amp;nbsp;&lt;code&gt;jump host&lt;/code&gt;.  &lt;/p&gt;

&lt;p&gt;Create a&amp;nbsp;&lt;code&gt;playbook.yml&lt;/code&gt;&amp;nbsp;under&amp;nbsp;&lt;code&gt;/home/thor/ansible/&lt;/code&gt;&amp;nbsp;directory on&amp;nbsp;&lt;code&gt;jump host&lt;/code&gt;&amp;nbsp;itself to perform the below given tasks.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Unzip&amp;nbsp;&lt;code&gt;/usr/src/data/datacenter.zip&lt;/code&gt;&amp;nbsp;archive in&amp;nbsp;&lt;code&gt;/opt/data/&lt;/code&gt;&amp;nbsp;location on all app servers.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make sure the extracted data must has the respective sudo user as their&amp;nbsp;&lt;code&gt;user&lt;/code&gt;&amp;nbsp;and&amp;nbsp;&lt;code&gt;group&lt;/code&gt;&amp;nbsp;owner, i.e tony for app server 1, steve for app server 2, banner for app server 3.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The extracted data permissions must be&amp;nbsp;&lt;code&gt;0655&lt;/code&gt;.  &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;Note:&lt;/code&gt;&amp;nbsp;Validation will try to run the playbook using command&amp;nbsp;&lt;code&gt;ansible-playbook -i inventory playbook.yml&lt;/code&gt;&amp;nbsp;so please make sure playbook works this way, without passing any extra arguments.&lt;/p&gt;




&lt;h3&gt;
  
  
  🚀 Introduction
&lt;/h3&gt;

&lt;p&gt;In the world of DevOps, managing files across multiple servers is a routine but critical task. Whether you're deploying applications, backing up data, or distributing configuration files, the ability to efficiently compress, transfer, and extract files is essential. Ansible, the powerful automation tool, provides two specialized modules—&lt;strong&gt;&lt;code&gt;archive&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;unarchive&lt;/code&gt;&lt;/strong&gt;—that make these operations seamless and reliable.&lt;/p&gt;

&lt;p&gt;This comprehensive guide covers everything you need to know about Ansible's archive and unarchive modules, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Module Deep Dives&lt;/strong&gt;: Understanding &lt;code&gt;archive&lt;/code&gt; and &lt;code&gt;unarchive&lt;/code&gt; in detail&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inventory Best Practices&lt;/strong&gt;: Creating robust inventory files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Playbook Design&lt;/strong&gt;: Building production-ready playbooks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-World Examples&lt;/strong&gt;: Complete working examples from actual tasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Troubleshooting&lt;/strong&gt;: Common issues and their solutions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security Best Practices&lt;/strong&gt;: Protecting sensitive data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance Optimization&lt;/strong&gt;: Tips for faster execution&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📚 Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Understanding the Modules&lt;/li&gt;
&lt;li&gt;Inventory File Best Practices&lt;/li&gt;
&lt;li&gt;The Archive Module: Creating Archives&lt;/li&gt;
&lt;li&gt;The Unarchive Module: Extracting Archives&lt;/li&gt;
&lt;li&gt;Real-World Implementation&lt;/li&gt;
&lt;li&gt;Verification and Testing&lt;/li&gt;
&lt;li&gt;Troubleshooting Guide&lt;/li&gt;
&lt;li&gt;Security Best Practices&lt;/li&gt;
&lt;li&gt;Performance Optimization&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. Understanding the Modules
&lt;/h2&gt;

&lt;h3&gt;
  
  
  📦 The Archive Module
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;archive&lt;/code&gt; module creates compressed archives of files and directories on target hosts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supports multiple formats: &lt;code&gt;tar&lt;/code&gt;, &lt;code&gt;gz&lt;/code&gt;, &lt;code&gt;bz2&lt;/code&gt;, &lt;code&gt;zip&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Preserves file permissions and ownership&lt;/li&gt;
&lt;li&gt;Can remove original files after archiving&lt;/li&gt;
&lt;li&gt;Idempotent - skips if archive already exists with correct content&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Basic Syntax:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create a tar.gz archive&lt;/span&gt;
  &lt;span class="na"&gt;archive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/path/to/source/directory/&lt;/span&gt;
    &lt;span class="na"&gt;dest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/path/to/archive.tar.gz&lt;/span&gt;
    &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gz&lt;/span&gt;
    &lt;span class="na"&gt;force_archive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
    &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;username&lt;/span&gt;
    &lt;span class="na"&gt;group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;groupname&lt;/span&gt;
    &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0644'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📂 The Unarchive Module
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;unarchive&lt;/code&gt; module extracts archives on target hosts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supports multiple formats: &lt;code&gt;tar&lt;/code&gt;, &lt;code&gt;gz&lt;/code&gt;, &lt;code&gt;bz2&lt;/code&gt;, &lt;code&gt;zip&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Can extract from local or remote sources&lt;/li&gt;
&lt;li&gt;Handles absolute/relative paths intelligently&lt;/li&gt;
&lt;li&gt;Idempotent - skips if already extracted&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Basic Syntax:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Extract a zip archive&lt;/span&gt;
  &lt;span class="na"&gt;unarchive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/path/to/source/archive.zip&lt;/span&gt;
    &lt;span class="na"&gt;dest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/path/to/destination/&lt;/span&gt;
    &lt;span class="na"&gt;remote_src&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;no&lt;/span&gt;
    &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;username&lt;/span&gt;
    &lt;span class="na"&gt;group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;groupname&lt;/span&gt;
    &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0644'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. Inventory File Best Practices
&lt;/h2&gt;

&lt;h3&gt;
  
  
  📋 Creating the Perfect Inventory
&lt;/h3&gt;

&lt;p&gt;A well-structured inventory file is the foundation of successful Ansible automation.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Basic Inventory Structure&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[app_servers]&lt;/span&gt;
&lt;span class="err"&gt;stapp01&lt;/span&gt; &lt;span class="py"&gt;ansible_host&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;stapp01 ansible_user=tony ansible_ssh_pass=Ir0nM@n&lt;/span&gt;
&lt;span class="err"&gt;stapp02&lt;/span&gt; &lt;span class="py"&gt;ansible_host&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;stapp02 ansible_user=steve ansible_ssh_pass=Am3ric@&lt;/span&gt;
&lt;span class="err"&gt;stapp03&lt;/span&gt; &lt;span class="py"&gt;ansible_host&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;stapp03 ansible_user=banner ansible_ssh_pass=BigGr33n&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;Production-Ready Inventory&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="c"&gt;# Group: Application Servers
&lt;/span&gt;&lt;span class="nn"&gt;[app_servers]&lt;/span&gt;
&lt;span class="err"&gt;stapp01&lt;/span&gt; &lt;span class="py"&gt;ansible_host&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;stapp01 ansible_user=tony&lt;/span&gt;
&lt;span class="err"&gt;stapp02&lt;/span&gt; &lt;span class="py"&gt;ansible_host&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;stapp02 ansible_user=steve&lt;/span&gt;
&lt;span class="err"&gt;stapp03&lt;/span&gt; &lt;span class="py"&gt;ansible_host&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;stapp03 ansible_user=banner&lt;/span&gt;

&lt;span class="c"&gt;# Group-specific variables
&lt;/span&gt;&lt;span class="nn"&gt;[app_servers:vars]&lt;/span&gt;
&lt;span class="py"&gt;ansible_ssh_common_args&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'-o StrictHostKeyChecking=no'&lt;/span&gt;
&lt;span class="py"&gt;ansible_ssh_private_key_file&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/home/thor/.ssh/id_rsa&lt;/span&gt;
&lt;span class="py"&gt;ansible_python_interpreter&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/bin/python3&lt;/span&gt;

&lt;span class="c"&gt;# Windows Server Group Example
&lt;/span&gt;&lt;span class="nn"&gt;[windows_servers]&lt;/span&gt;
&lt;span class="err"&gt;db1&lt;/span&gt; &lt;span class="py"&gt;ansible_host&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;server4.company.com ansible_user=administrator&lt;/span&gt;

&lt;span class="nn"&gt;[windows_servers:vars]&lt;/span&gt;
&lt;span class="py"&gt;ansible_connection&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;winrm&lt;/span&gt;
&lt;span class="py"&gt;ansible_winrm_server_cert_validation&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;ignore&lt;/span&gt;
&lt;span class="py"&gt;ansible_password&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Dbp@ss123!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;Advanced Inventory with YAML Format&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;all&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;children&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;app_servers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;hosts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;stapp01&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;ansible_host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;stapp01&lt;/span&gt;
          &lt;span class="na"&gt;ansible_user&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tony&lt;/span&gt;
        &lt;span class="na"&gt;stapp02&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;ansible_host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;stapp02&lt;/span&gt;
          &lt;span class="na"&gt;ansible_user&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;steve&lt;/span&gt;
        &lt;span class="na"&gt;stapp03&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;ansible_host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;stapp03&lt;/span&gt;
          &lt;span class="na"&gt;ansible_user&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;banner&lt;/span&gt;
      &lt;span class="na"&gt;vars&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;ansible_ssh_common_args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-o&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;StrictHostKeyChecking=no'&lt;/span&gt;
        &lt;span class="na"&gt;ansible_ssh_private_key_file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/home/thor/.ssh/id_rsa&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔑 Security Best Practices for Inventory
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;1. Use SSH Keys Instead of Passwords&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Generate SSH key&lt;/span&gt;
ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; rsa &lt;span class="nt"&gt;-b&lt;/span&gt; 4096 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"thor@jump-host"&lt;/span&gt;

&lt;span class="c"&gt;# Copy to servers&lt;/span&gt;
ssh-copy-id tony@stapp01
ssh-copy-id steve@stapp02
ssh-copy-id banner@stapp03

&lt;span class="c"&gt;# Inventory without passwords&lt;/span&gt;
stapp01 &lt;span class="nv"&gt;ansible_host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;stapp01 &lt;span class="nv"&gt;ansible_user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tony
stapp02 &lt;span class="nv"&gt;ansible_host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;stapp02 &lt;span class="nv"&gt;ansible_user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;steve
stapp03 &lt;span class="nv"&gt;ansible_host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;stapp03 &lt;span class="nv"&gt;ansible_user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;banner
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;2. Use Ansible Vault for Secrets&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create a vault file for passwords&lt;/span&gt;
ansible-vault create group_vars/all/vault.yml

&lt;span class="c"&gt;# Content of vault.yml&lt;/span&gt;
&lt;span class="nt"&gt;---&lt;/span&gt;
vault_ssh_pass: &lt;span class="s2"&gt;"Ir0nM@n"&lt;/span&gt;
vault_sudo_pass: &lt;span class="s2"&gt;"Ir0nM@n"&lt;/span&gt;

&lt;span class="c"&gt;# Inventory referencing vault&lt;/span&gt;
stapp01 &lt;span class="nv"&gt;ansible_host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;stapp01 &lt;span class="nv"&gt;ansible_user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tony &lt;span class="nv"&gt;ansible_ssh_pass&lt;/span&gt;&lt;span class="o"&gt;={{&lt;/span&gt; vault_ssh_pass &lt;span class="o"&gt;}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;3. Use Separate Variable Files&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ansible/
├── inventory/
│   └── production
├── group_vars/
│   └── app_servers.yml
└── host_vars/
    ├── stapp01.yml
    ├── stapp02.yml
    └── stapp03.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. The Archive Module: Creating Archives
&lt;/h2&gt;

&lt;h3&gt;
  
  
  📦 Complete Guide to Archive Module
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Example 1: Create Simple Tar Archive&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create archive examples&lt;/span&gt;
  &lt;span class="na"&gt;hosts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app_servers&lt;/span&gt;
  &lt;span class="na"&gt;gather_facts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;no&lt;/span&gt;
  &lt;span class="na"&gt;tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create tar.gz of /usr/src/data&lt;/span&gt;
      &lt;span class="na"&gt;archive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/usr/src/data/&lt;/span&gt;
        &lt;span class="na"&gt;dest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/opt/backup/data_backup.tar.gz&lt;/span&gt;
        &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gz&lt;/span&gt;
        &lt;span class="na"&gt;force_archive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;Example 2: Create Zip Archive with Specific Permissions&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create zip archive with permissions&lt;/span&gt;
  &lt;span class="na"&gt;hosts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app_servers&lt;/span&gt;
  &lt;span class="na"&gt;gather_facts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;no&lt;/span&gt;
  &lt;span class="na"&gt;tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create zip archive&lt;/span&gt;
      &lt;span class="na"&gt;archive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/usr/src/itadmin/&lt;/span&gt;
        &lt;span class="na"&gt;dest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/opt/itadmin/beta.zip&lt;/span&gt;
        &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;zip&lt;/span&gt;
        &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0644'&lt;/span&gt;
        &lt;span class="na"&gt;force_archive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;Example 3: Archive with Multiple Paths&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Archive multiple directories&lt;/span&gt;
  &lt;span class="na"&gt;hosts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app_servers&lt;/span&gt;
  &lt;span class="na"&gt;gather_facts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;no&lt;/span&gt;
  &lt;span class="na"&gt;vars&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;archive_files&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;/var/log/app&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;/etc/nginx&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;/usr/src/data&lt;/span&gt;
  &lt;span class="na"&gt;tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create archive from multiple directories&lt;/span&gt;
      &lt;span class="na"&gt;archive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;archive_files&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;dest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/opt/backup/full_backup.tar.gz&lt;/span&gt;
        &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gz&lt;/span&gt;
        &lt;span class="na"&gt;remove&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;no&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;Example 4: Advanced Archive with Error Handling&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Production-ready archive creation&lt;/span&gt;
  &lt;span class="na"&gt;hosts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app_servers&lt;/span&gt;
  &lt;span class="na"&gt;gather_facts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;no&lt;/span&gt;
  &lt;span class="na"&gt;vars&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;source_dirs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;/usr/src/data&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;/etc/config&lt;/span&gt;
    &lt;span class="na"&gt;dest_dir&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/opt/backup&lt;/span&gt;
    &lt;span class="na"&gt;archive_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;backup_{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_date_time.date&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}.tar.gz"&lt;/span&gt;
    &lt;span class="na"&gt;archive_path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/opt/backup/backup_{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_date_time.date&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}.tar.gz"&lt;/span&gt;

  &lt;span class="na"&gt;tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create backup directory&lt;/span&gt;
      &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;dest_dir&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;directory&lt;/span&gt;
        &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0755'&lt;/span&gt;
        &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Check source directories exist&lt;/span&gt;
      &lt;span class="na"&gt;stat&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;item&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
      &lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dir_stats&lt;/span&gt;
      &lt;span class="na"&gt;with_items&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;source_dirs&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
      &lt;span class="na"&gt;failed_when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;not item.stat.exists&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create archive of all source directories&lt;/span&gt;
      &lt;span class="na"&gt;archive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;source_dirs&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;dest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;archive_path&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gz&lt;/span&gt;
        &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0644'&lt;/span&gt;
        &lt;span class="na"&gt;force_archive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
      &lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;archive_result&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Verify archive created&lt;/span&gt;
      &lt;span class="na"&gt;stat&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;archive_path&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
      &lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;archive_stat&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Get archive size&lt;/span&gt;
      &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;du&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-sh&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;archive_path&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
      &lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;archive_size&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
      &lt;span class="na"&gt;changed_when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Display archive details&lt;/span&gt;
      &lt;span class="na"&gt;debug&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;msg&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;✅&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Archive&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;created&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;successfully&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;on&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;inventory_hostname&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;📁&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Source:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;source_dirs&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;join(',&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;')&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;📦&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Destination:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;archive_path&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;📊&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Size:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;archive_size.stdout&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;👤&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Owner:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. The Unarchive Module: Extracting Archives
&lt;/h2&gt;

&lt;h3&gt;
  
  
  📂 Complete Guide to Unarchive Module
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Example 1: Extract from Jump Host to Remote Servers&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Extract zip archive from jump host&lt;/span&gt;
  &lt;span class="na"&gt;hosts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app_servers&lt;/span&gt;
  &lt;span class="na"&gt;gather_facts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;no&lt;/span&gt;
  &lt;span class="na"&gt;vars&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;source_archive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/usr/src/data/datacenter.zip&lt;/span&gt;
    &lt;span class="na"&gt;dest_dir&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/opt/data&lt;/span&gt;

  &lt;span class="na"&gt;tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Verify source archive exists&lt;/span&gt;
      &lt;span class="na"&gt;local_action&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;module&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;stat&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;source_archive&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
      &lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;archive_stat&lt;/span&gt;
      &lt;span class="na"&gt;run_once&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
      &lt;span class="na"&gt;failed_when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;not archive_stat.stat.exists&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Extract archive to destination&lt;/span&gt;
      &lt;span class="na"&gt;unarchive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;source_archive&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;dest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;dest_dir&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;remote_src&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;no&lt;/span&gt;
        &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0655'&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;Example 2: Extract Remote Archive&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Extract remote archive&lt;/span&gt;
  &lt;span class="na"&gt;hosts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app_servers&lt;/span&gt;
  &lt;span class="na"&gt;gather_facts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;no&lt;/span&gt;
  &lt;span class="na"&gt;vars&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;archive_path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/tmp/datacenter.zip&lt;/span&gt;
    &lt;span class="na"&gt;dest_dir&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/opt/data&lt;/span&gt;

  &lt;span class="na"&gt;tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Extract archive (already on remote)&lt;/span&gt;
      &lt;span class="na"&gt;unarchive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;archive_path&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;dest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;dest_dir&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;remote_src&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
        &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0655'&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;Example 3: Extract with Additional Options&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Advanced unarchive with options&lt;/span&gt;
  &lt;span class="na"&gt;hosts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app_servers&lt;/span&gt;
  &lt;span class="na"&gt;gather_facts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;no&lt;/span&gt;
  &lt;span class="na"&gt;vars&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;source_archive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/usr/src/data/config.tar.gz&lt;/span&gt;
    &lt;span class="na"&gt;dest_dir&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/opt/config&lt;/span&gt;

  &lt;span class="na"&gt;tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Ensure unzip/tar is installed&lt;/span&gt;
      &lt;span class="na"&gt;package&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;unzip&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;tar&lt;/span&gt;
        &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;present&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create destination directory&lt;/span&gt;
      &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;dest_dir&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;directory&lt;/span&gt;
        &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0755'&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Extract archive with specific parameters&lt;/span&gt;
      &lt;span class="na"&gt;unarchive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;source_archive&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;dest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;dest_dir&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;remote_src&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;no&lt;/span&gt;
        &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0644'&lt;/span&gt;
        &lt;span class="na"&gt;extra_opts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;--strip-components=1&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
        &lt;span class="na"&gt;list_files&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
      &lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;extract_result&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Display extracted files&lt;/span&gt;
      &lt;span class="na"&gt;debug&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;msg&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Extracted&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;files:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;extract_result.files&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;Example 4: Complete Production Unarchive Playbook&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Production-ready archive extraction&lt;/span&gt;
  &lt;span class="na"&gt;hosts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app_servers&lt;/span&gt;
  &lt;span class="na"&gt;gather_facts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
  &lt;span class="na"&gt;vars&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;source_archive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/usr/src/data/datacenter.zip&lt;/span&gt;
    &lt;span class="na"&gt;dest_dir&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/opt/data&lt;/span&gt;
    &lt;span class="na"&gt;temp_dir&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/tmp/ansible_extract&lt;/span&gt;

  &lt;span class="na"&gt;tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Pre-flight checks&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Verify source archive exists on controller&lt;/span&gt;
      &lt;span class="na"&gt;local_action&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;module&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;stat&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;source_archive&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
      &lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;archive_stat&lt;/span&gt;
      &lt;span class="na"&gt;run_once&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
      &lt;span class="na"&gt;failed_when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;not archive_stat.stat.exists&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Display archive information&lt;/span&gt;
      &lt;span class="na"&gt;debug&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;msg&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;📦&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Archive:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;source_archive&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;📊&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Size:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;(archive_stat.stat.size&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;1024)&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;int&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;KB"&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;📅&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Modified:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;archive_stat.stat.mtime&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
      &lt;span class="na"&gt;run_once&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;

    &lt;span class="c1"&gt;# Dependencies&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Ensure required packages are installed&lt;/span&gt;
      &lt;span class="na"&gt;package&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;unzip&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;tar&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;gzip&lt;/span&gt;
        &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;present&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;

    &lt;span class="c1"&gt;# Directory setup&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create destination directory&lt;/span&gt;
      &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;dest_dir&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;directory&lt;/span&gt;
        &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0755'&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;

    &lt;span class="c1"&gt;# Archive copy and extraction&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Copy archive to remote host&lt;/span&gt;
      &lt;span class="na"&gt;copy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;source_archive&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;dest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;temp_dir&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}/{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;source_archive&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;basename&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0644'&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Extract archive&lt;/span&gt;
      &lt;span class="na"&gt;unarchive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;temp_dir&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}/{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;source_archive&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;basename&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;dest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;dest_dir&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;remote_src&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
        &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0655'&lt;/span&gt;
        &lt;span class="na"&gt;list_files&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
      &lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;extract_result&lt;/span&gt;

    &lt;span class="c1"&gt;# Cleanup&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Remove temporary archive&lt;/span&gt;
      &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;temp_dir&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;absent&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;

    &lt;span class="c1"&gt;# Verification&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Verify extraction&lt;/span&gt;
      &lt;span class="na"&gt;shell&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;find&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;dest_dir&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-type&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;f&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;wc&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-l"&lt;/span&gt;
      &lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;file_count&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
      &lt;span class="na"&gt;changed_when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Verify correct ownership&lt;/span&gt;
      &lt;span class="na"&gt;shell&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;find&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;dest_dir&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-type&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;f&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-group&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;wc&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-l"&lt;/span&gt;
      &lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;owner_count&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
      &lt;span class="na"&gt;changed_when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Verify permissions&lt;/span&gt;
      &lt;span class="na"&gt;shell&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;find&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;dest_dir&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-type&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;f&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-perm&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;0655&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;wc&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-l"&lt;/span&gt;
      &lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;perm_count&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
      &lt;span class="na"&gt;changed_when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;

    &lt;span class="c1"&gt;# Results&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Display extraction summary&lt;/span&gt;
      &lt;span class="na"&gt;debug&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;msg&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;✅&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Extraction&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;completed&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;on&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;inventory_hostname&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;📁&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Destination:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;dest_dir&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;📄&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Total&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;files:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;file_count.stdout&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;👤&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Correct&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;owner:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;owner_count.stdout&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;files"&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🔒&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Correct&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;permissions:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;perm_count.stdout&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;files"&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;👤&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Owner:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. Real-World Implementation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🏢 Complete Task Example: Data Center Archive Management
&lt;/h3&gt;

&lt;p&gt;This section combines both &lt;code&gt;archive&lt;/code&gt; and &lt;code&gt;unarchive&lt;/code&gt; modules in a complete, real-world scenario.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Project Structure&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ansible/
├── inventory
├── playbook_archive.yml
├── playbook_unarchive.yml
├── group_vars/
│   └── app_servers.yml
├── host_vars/
│   ├── stapp01.yml
│   ├── stapp02.yml
│   └── stapp03.yml
└── roles/
    └── archive_manager/
        ├── tasks/
        │   ├── main.yml
        │   ├── create_archive.yml
        │   └── extract_archive.yml
        └── vars/
            └── main.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;Inventory File (Production)&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="c"&gt;# /home/thor/ansible/inventory
&lt;/span&gt;
&lt;span class="nn"&gt;[app_servers]&lt;/span&gt;
&lt;span class="err"&gt;stapp01&lt;/span&gt; &lt;span class="py"&gt;ansible_host&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;stapp01 ansible_user=tony&lt;/span&gt;
&lt;span class="err"&gt;stapp02&lt;/span&gt; &lt;span class="py"&gt;ansible_host&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;stapp02 ansible_user=steve&lt;/span&gt;
&lt;span class="err"&gt;stapp03&lt;/span&gt; &lt;span class="py"&gt;ansible_host&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;stapp03 ansible_user=banner&lt;/span&gt;

&lt;span class="nn"&gt;[app_servers:vars]&lt;/span&gt;
&lt;span class="py"&gt;ansible_ssh_common_args&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'-o StrictHostKeyChecking=no'&lt;/span&gt;
&lt;span class="py"&gt;ansible_python_interpreter&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/bin/python3&lt;/span&gt;
&lt;span class="py"&gt;ansible_ssh_private_key_file&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/home/thor/.ssh/id_rsa&lt;/span&gt;

&lt;span class="c"&gt;# Windows Servers (if needed)
&lt;/span&gt;&lt;span class="nn"&gt;[db_servers]&lt;/span&gt;
&lt;span class="err"&gt;db1&lt;/span&gt; &lt;span class="py"&gt;ansible_host&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;server4.company.com ansible_user=administrator&lt;/span&gt;

&lt;span class="nn"&gt;[db_servers:vars]&lt;/span&gt;
&lt;span class="py"&gt;ansible_connection&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;winrm&lt;/span&gt;
&lt;span class="py"&gt;ansible_winrm_server_cert_validation&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;ignore&lt;/span&gt;
&lt;span class="py"&gt;ansible_password&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Dbp@ss123!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;Complete Archive Creation Playbook&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# /home/thor/ansible/playbook_archive.yml&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create and manage archives across application servers&lt;/span&gt;
  &lt;span class="na"&gt;hosts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app_servers&lt;/span&gt;
  &lt;span class="na"&gt;gather_facts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
  &lt;span class="na"&gt;vars&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;archive_config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;source_dir&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/usr/src/data&lt;/span&gt;
      &lt;span class="na"&gt;dest_dir&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/opt/backup&lt;/span&gt;
      &lt;span class="na"&gt;archive_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;data_backup.tar.gz&lt;/span&gt;
      &lt;span class="na"&gt;archive_path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/opt/backup/data_backup.tar.gz&lt;/span&gt;
      &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gz&lt;/span&gt;
      &lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0644'&lt;/span&gt;

  &lt;span class="na"&gt;tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# 1. Environment Setup&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create backup directory&lt;/span&gt;
      &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;archive_config.dest_dir&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;directory&lt;/span&gt;
        &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0755'&lt;/span&gt;
        &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Check disk space&lt;/span&gt;
      &lt;span class="na"&gt;shell&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;df&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-h&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;archive_config.dest_dir&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;awk&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;'NR==2&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{print&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;$5}'&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;sed&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;'s/%//'"&lt;/span&gt;
      &lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;disk_usage&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
      &lt;span class="na"&gt;changed_when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Fail if disk usage is high&lt;/span&gt;
      &lt;span class="na"&gt;fail&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;msg&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Disk&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;usage&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;is&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;at&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;disk_usage.stdout&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}%,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;please&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;free&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;up&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;space"&lt;/span&gt;
      &lt;span class="na"&gt;when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;disk_usage.stdout | int &amp;gt; &lt;/span&gt;&lt;span class="m"&gt;80&lt;/span&gt;

    &lt;span class="c1"&gt;# 2. Source Verification&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Verify source directory exists&lt;/span&gt;
      &lt;span class="na"&gt;stat&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;archive_config.source_dir&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
      &lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;source_stat&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
      &lt;span class="na"&gt;failed_when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;not source_stat.stat.exists&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Get source directory size&lt;/span&gt;
      &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;du&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-sh&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;archive_config.source_dir&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
      &lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;source_size&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
      &lt;span class="na"&gt;changed_when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Count files in source&lt;/span&gt;
      &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;find&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;archive_config.source_dir&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-type&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;f&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;wc&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-l"&lt;/span&gt;
      &lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;file_count&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
      &lt;span class="na"&gt;changed_when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Display source information&lt;/span&gt;
      &lt;span class="na"&gt;debug&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;msg&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;📁&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Source:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;archive_config.source_dir&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;📊&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Size:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;source_size.stdout&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;📄&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Files:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;file_count.stdout&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;

    &lt;span class="c1"&gt;# 3. Archive Creation&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Remove existing archive if present&lt;/span&gt;
      &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;archive_config.archive_path&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;absent&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
      &lt;span class="na"&gt;when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;source_stat.stat.exists&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create tar.gz archive&lt;/span&gt;
      &lt;span class="na"&gt;archive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;archive_config.source_dir&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}/"&lt;/span&gt;
        &lt;span class="na"&gt;dest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;archive_config.archive_path&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;archive_config.format&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;archive_config.permissions&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;force_archive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
      &lt;span class="na"&gt;when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;source_stat.stat.exists&lt;/span&gt;
      &lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;archive_result&lt;/span&gt;

    &lt;span class="c1"&gt;# 4. Verification&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Verify archive creation&lt;/span&gt;
      &lt;span class="na"&gt;stat&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;archive_config.archive_path&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
      &lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;archive_stat&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Get archive size&lt;/span&gt;
      &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;du&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-sh&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;archive_config.archive_path&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
      &lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;archive_size&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
      &lt;span class="na"&gt;changed_when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Verify archive contents&lt;/span&gt;
      &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tar&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-tzf&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;archive_config.archive_path&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;head&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-10"&lt;/span&gt;
      &lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;archive_contents&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
      &lt;span class="na"&gt;changed_when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;

    &lt;span class="c1"&gt;# 5. Results&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Display success message&lt;/span&gt;
      &lt;span class="na"&gt;debug&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;msg&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;✅&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Archive&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;created&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;successfully&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;on&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;inventory_hostname&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;📦&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;File:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;archive_config.archive_path&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;📊&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Size:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;archive_size.stdout&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;👤&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Owner:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🔒&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Permissions:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;archive_config.permissions&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;📄&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Contents&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;preview:"&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;archive_contents.stdout_lines&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;to_nice_yaml&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
      &lt;span class="na"&gt;when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;archive_stat.stat.exists&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;Complete Unarchive Playbook&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# /home/thor/ansible/playbook_unarchive.yml&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Extract and distribute archives across application servers&lt;/span&gt;
  &lt;span class="na"&gt;hosts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app_servers&lt;/span&gt;
  &lt;span class="na"&gt;gather_facts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
  &lt;span class="na"&gt;vars&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;unarchive_config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;source_archive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/usr/src/data/datacenter.zip&lt;/span&gt;
      &lt;span class="na"&gt;dest_dir&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/opt/data&lt;/span&gt;
      &lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0655'&lt;/span&gt;

  &lt;span class="na"&gt;tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# 1. Pre-flight Checks&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Verify source archive exists on controller&lt;/span&gt;
      &lt;span class="na"&gt;local_action&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;module&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;stat&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;unarchive_config.source_archive&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
      &lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;archive_stat&lt;/span&gt;
      &lt;span class="na"&gt;run_once&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
      &lt;span class="na"&gt;failed_when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;not archive_stat.stat.exists&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Display archive information&lt;/span&gt;
      &lt;span class="na"&gt;debug&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;msg&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;📦&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Archive:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;unarchive_config.source_archive&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;📊&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Size:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;(archive_stat.stat.size&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;1024)&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;int&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;KB"&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;📅&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Last&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;modified:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;archive_stat.stat.mtime&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
      &lt;span class="na"&gt;run_once&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;

    &lt;span class="c1"&gt;# 2. Dependencies&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Ensure required packages are installed&lt;/span&gt;
      &lt;span class="na"&gt;package&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;unzip&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;tar&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;gzip&lt;/span&gt;
        &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;present&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
      &lt;span class="na"&gt;when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ansible_system == "Linux"&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create temporary directory&lt;/span&gt;
      &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/tmp/ansible_extract&lt;/span&gt;
        &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;directory&lt;/span&gt;
        &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0755'&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;

    &lt;span class="c1"&gt;# 3. Directory Setup&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create destination directory&lt;/span&gt;
      &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;unarchive_config.dest_dir&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;directory&lt;/span&gt;
        &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0755'&lt;/span&gt;
        &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;

    &lt;span class="c1"&gt;# 4. Archive Copy&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Copy archive to remote host&lt;/span&gt;
      &lt;span class="na"&gt;copy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;unarchive_config.source_archive&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;dest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/tmp/ansible_extract/{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;unarchive_config.source_archive&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;basename&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0644'&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;

    &lt;span class="c1"&gt;# 5. Extraction&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Extract archive&lt;/span&gt;
      &lt;span class="na"&gt;unarchive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/tmp/ansible_extract/{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;unarchive_config.source_archive&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;basename&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;dest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;unarchive_config.dest_dir&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;remote_src&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
        &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;unarchive_config.permissions&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;list_files&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
      &lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;extract_result&lt;/span&gt;

    &lt;span class="c1"&gt;# 6. Cleanup&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Remove temporary archive&lt;/span&gt;
      &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/tmp/ansible_extract&lt;/span&gt;
        &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;absent&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;

    &lt;span class="c1"&gt;# 7. Verification&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Verify extraction&lt;/span&gt;
      &lt;span class="na"&gt;shell&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;find&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;unarchive_config.dest_dir&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-type&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;f"&lt;/span&gt;
      &lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;extracted_files&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
      &lt;span class="na"&gt;changed_when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Count extracted files&lt;/span&gt;
      &lt;span class="na"&gt;shell&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;find&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;unarchive_config.dest_dir&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-type&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;f&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;wc&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-l"&lt;/span&gt;
      &lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;file_count&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
      &lt;span class="na"&gt;changed_when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Check permissions&lt;/span&gt;
      &lt;span class="na"&gt;shell&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;find&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;unarchive_config.dest_dir&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-type&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;f&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-perm&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;unarchive_config.permissions&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;wc&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-l"&lt;/span&gt;
      &lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;perm_count&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
      &lt;span class="na"&gt;changed_when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Check ownership&lt;/span&gt;
      &lt;span class="na"&gt;shell&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;find&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;unarchive_config.dest_dir&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-type&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;f&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-group&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;wc&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-l"&lt;/span&gt;
      &lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;owner_count&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
      &lt;span class="na"&gt;changed_when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;

    &lt;span class="c1"&gt;# 8. Results&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Display extraction summary&lt;/span&gt;
      &lt;span class="na"&gt;debug&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;msg&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;✅&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Extraction&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;completed&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;on&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;inventory_hostname&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;📁&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Destination:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;unarchive_config.dest_dir&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;📄&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Total&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;files:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;file_count.stdout&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;👤&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Correct&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;owner:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;owner_count.stdout&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;files"&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🔒&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Correct&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;permissions:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;perm_count.stdout&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;files"&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;📋&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;First&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;5&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;files:"&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;extracted_files.stdout_lines[:5]&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;to_nice_yaml&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
      &lt;span class="na"&gt;when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;file_count.stdout | int &amp;gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. Verification and Testing
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔍 Comprehensive Verification Commands
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;1. Archive Verification Commands&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check if archive exists&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory app_servers &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="nb"&gt;stat&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"path=/opt/backup/data_backup.tar.gz"&lt;/span&gt;

&lt;span class="c"&gt;# List archive contents&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory app_servers &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="nb"&gt;command&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"tar -tzf /opt/backup/data_backup.tar.gz"&lt;/span&gt;

&lt;span class="c"&gt;# Check archive size&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory app_servers &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="nb"&gt;command&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"du -sh /opt/backup/data_backup.tar.gz"&lt;/span&gt;

&lt;span class="c"&gt;# Verify checksum&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory app_servers &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="nb"&gt;command&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"md5sum /opt/backup/data_backup.tar.gz"&lt;/span&gt;

&lt;span class="c"&gt;# Check permissions&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory app_servers &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="nb"&gt;command&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"stat -c '%a %n' /opt/backup/data_backup.tar.gz"&lt;/span&gt;

&lt;span class="c"&gt;# Verify ownership&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory app_servers &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="nb"&gt;command&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"stat -c '%U:%G %n' /opt/backup/data_backup.tar.gz"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;2. Unarchive Verification Commands&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# List destination directory&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory app_servers &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="nb"&gt;command&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"ls -la /opt/data/"&lt;/span&gt;

&lt;span class="c"&gt;# Recursive listing&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory app_servers &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="nb"&gt;command&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"find /opt/data -type f -ls"&lt;/span&gt;

&lt;span class="c"&gt;# Count files&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory app_servers &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="nb"&gt;command&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"find /opt/data -type f | wc -l"&lt;/span&gt;

&lt;span class="c"&gt;# Check permissions recursively&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory app_servers &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="nb"&gt;command&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"find /opt/data -type f -exec stat -c '%a %n' {} &lt;/span&gt;&lt;span class="se"&gt;\;&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Check ownership recursively&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory app_servers &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="nb"&gt;command&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"find /opt/data -type f -exec stat -c '%U:%G %n' {} &lt;/span&gt;&lt;span class="se"&gt;\;&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Verify file content&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory app_servers &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="nb"&gt;command&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"head -5 /opt/data/*.txt 2&amp;gt;/dev/null || echo 'No text files'"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;3. Complete Verification Script&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# verify_ansible_task.sh&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Ansible Archive Management Verification"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;

&lt;span class="nv"&gt;INVENTORY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/home/thor/ansible/inventory"&lt;/span&gt;
&lt;span class="nv"&gt;SERVERS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"app_servers"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;1️⃣ Checking Archive Existence..."&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="nv"&gt;$INVENTORY&lt;/span&gt; &lt;span class="nv"&gt;$SERVERS&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="nb"&gt;stat&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"path=/opt/backup/data_backup.tar.gz"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;2️⃣ Checking Archive Contents..."&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="nv"&gt;$INVENTORY&lt;/span&gt; &lt;span class="nv"&gt;$SERVERS&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; shell &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"tar -tzf /opt/backup/data_backup.tar.gz | head -5"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;3️⃣ Checking Archive Permissions..."&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="nv"&gt;$INVENTORY&lt;/span&gt; &lt;span class="nv"&gt;$SERVERS&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; shell &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"stat -c 'Permissions: %a | Owner: %U:%G | Size: %s | File: %n' /opt/backup/data_backup.tar.gz"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;4️⃣ Verifying Extraction..."&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="nv"&gt;$INVENTORY&lt;/span&gt; &lt;span class="nv"&gt;$SERVERS&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; shell &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"ls -la /opt/data/"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;5️⃣ Counting Extracted Files..."&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="nv"&gt;$INVENTORY&lt;/span&gt; &lt;span class="nv"&gt;$SERVERS&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; shell &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"find /opt/data -type f | wc -l"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;6️⃣ Checking Extraction Permissions..."&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="nv"&gt;$INVENTORY&lt;/span&gt; &lt;span class="nv"&gt;$SERVERS&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; shell &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"find /opt/data -type f -exec stat -c 'Permissions: %a | Owner: %U:%G | File: %n' {} &lt;/span&gt;&lt;span class="se"&gt;\;&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;✅ Verification Complete!"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;4. Automated Test Playbook&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Validate archive management tasks&lt;/span&gt;
  &lt;span class="na"&gt;hosts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app_servers&lt;/span&gt;
  &lt;span class="na"&gt;gather_facts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
  &lt;span class="na"&gt;tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Test archive existence&lt;/span&gt;
      &lt;span class="na"&gt;stat&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/opt/backup/data_backup.tar.gz&lt;/span&gt;
      &lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;archive_check&lt;/span&gt;
      &lt;span class="na"&gt;failed_when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;not archive_check.stat.exists&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Test archive size&lt;/span&gt;
      &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;du&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-sh&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;/opt/backup/data_backup.tar.gz"&lt;/span&gt;
      &lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;archive_size&lt;/span&gt;
      &lt;span class="na"&gt;changed_when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Test archive permissions&lt;/span&gt;
      &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;stat&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-c&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;'%a'&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;/opt/backup/data_backup.tar.gz"&lt;/span&gt;
      &lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;archive_perm&lt;/span&gt;
      &lt;span class="na"&gt;changed_when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
      &lt;span class="na"&gt;failed_when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;archive_perm.stdout != "644"&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Test extraction directory&lt;/span&gt;
      &lt;span class="na"&gt;stat&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/opt/data&lt;/span&gt;
      &lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;extract_check&lt;/span&gt;
      &lt;span class="na"&gt;failed_when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;not extract_check.stat.exists&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Count extracted files&lt;/span&gt;
      &lt;span class="na"&gt;shell&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;find&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;/opt/data&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-type&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;f&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;wc&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-l"&lt;/span&gt;
      &lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;file_count&lt;/span&gt;
      &lt;span class="na"&gt;changed_when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
      &lt;span class="na"&gt;failed_when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;file_count.stdout | int == &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Validate all tests passed&lt;/span&gt;
      &lt;span class="na"&gt;debug&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;msg&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;✅&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;All&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;validation&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;tests&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;passed&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;on&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;inventory_hostname&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;📦&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Archive:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;/opt/backup/data_backup.tar.gz&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;({{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;archive_size.stdout&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}})"&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🔒&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Permissions:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;archive_perm.stdout&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;📄&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Extracted&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;files:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;file_count.stdout&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  7. Troubleshooting Guide
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔧 Common Issues and Solutions
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Issue 1: Source Archive Not Found&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;fatal:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;stapp&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;FAILED!&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"msg"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Source file /usr/src/data/datacenter.zip does not exist"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create the archive&lt;/span&gt;
&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /usr/src/data
&lt;span class="nb"&gt;sudo touch&lt;/span&gt; /usr/src/data/file&lt;span class="o"&gt;{&lt;/span&gt;1,2,3&lt;span class="o"&gt;}&lt;/span&gt;.txt
&lt;span class="nb"&gt;sudo &lt;/span&gt;zip &lt;span class="nt"&gt;-r&lt;/span&gt; /usr/src/data/datacenter.zip /usr/src/data/&lt;span class="k"&gt;*&lt;/span&gt;.txt

&lt;span class="c"&gt;# Or create using ansible&lt;/span&gt;
ansible localhost &lt;span class="nt"&gt;-m&lt;/span&gt; file &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"path=/usr/src/data state=directory"&lt;/span&gt;
ansible localhost &lt;span class="nt"&gt;-m&lt;/span&gt; shell &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"touch /usr/src/data/file{1,2,3}.txt"&lt;/span&gt;
ansible localhost &lt;span class="nt"&gt;-m&lt;/span&gt; shell &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"zip -r /usr/src/data/datacenter.zip /usr/src/data/*.txt"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;Issue 2: Permission Denied&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;fatal:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;stapp&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;FAILED!&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"msg"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Permission denied"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Always use become: yes for system directories&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create directory&lt;/span&gt;
  &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/opt/data&lt;/span&gt;
    &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;directory&lt;/span&gt;
  &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;

&lt;span class="c1"&gt;# Check sudo access&lt;/span&gt;
&lt;span class="s"&gt;ansible -i inventory app_servers -m shell -a "sudo -l"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;Issue 3: Archive Not in Correct Format&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;gzip&lt;/span&gt;: stdin: not &lt;span class="k"&gt;in &lt;/span&gt;&lt;span class="nb"&gt;gzip &lt;/span&gt;format
&lt;span class="nb"&gt;tar&lt;/span&gt;: Child returned status 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# For archive module, use format: gz&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create gzip archive&lt;/span&gt;
  &lt;span class="na"&gt;archive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/usr/src/data/&lt;/span&gt;
    &lt;span class="na"&gt;dest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/opt/backup/data.tar.gz&lt;/span&gt;
    &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gz&lt;/span&gt;  &lt;span class="c1"&gt;# Correct for .tar.gz&lt;/span&gt;
    &lt;span class="na"&gt;force_archive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;

&lt;span class="c1"&gt;# For unarchive, module auto-detects format&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Extract archive&lt;/span&gt;
  &lt;span class="na"&gt;unarchive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/usr/src/data/datacenter.zip&lt;/span&gt;
    &lt;span class="na"&gt;dest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/opt/data/&lt;/span&gt;
    &lt;span class="na"&gt;remote_src&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;no&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;Issue 4: Unzip Not Installed&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;fatal:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;stapp&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;FAILED!&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"msg"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"unzip is required for unarchive module"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Install unzip before extraction&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Ensure unzip is installed&lt;/span&gt;
  &lt;span class="na"&gt;package&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unzip&lt;/span&gt;
    &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;present&lt;/span&gt;
  &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;

&lt;span class="c1"&gt;# For RedHat/CentOS&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install unzip&lt;/span&gt;
  &lt;span class="na"&gt;yum&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unzip&lt;/span&gt;
    &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;present&lt;/span&gt;
  &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;

&lt;span class="c1"&gt;# For Ubuntu/Debian&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install unzip&lt;/span&gt;
  &lt;span class="na"&gt;apt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unzip&lt;/span&gt;
    &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;present&lt;/span&gt;
  &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;Issue 5: Wrong Ownership After Extraction&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 root root file.txt  &lt;span class="c"&gt;# Should be tony:tony&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Set ownership during extraction&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Extract with correct ownership&lt;/span&gt;
  &lt;span class="na"&gt;unarchive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/usr/src/data/datacenter.zip&lt;/span&gt;
    &lt;span class="na"&gt;dest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/opt/data/&lt;/span&gt;
    &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
    &lt;span class="na"&gt;group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
    &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0655'&lt;/span&gt;
  &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;

&lt;span class="c1"&gt;# Or fix after extraction&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Fix ownership&lt;/span&gt;
  &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/opt/data&lt;/span&gt;
    &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
    &lt;span class="na"&gt;group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
    &lt;span class="na"&gt;recurse&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
  &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;Issue 6: Host Key Verification Failed&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Host key verification failed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Add to inventory&lt;/span&gt;
&lt;span class="nv"&gt;ansible_ssh_common_args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'-o StrictHostKeyChecking=no'&lt;/span&gt;

&lt;span class="c"&gt;# Or add to ansible.cfg&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;defaults]
host_key_checking &lt;span class="o"&gt;=&lt;/span&gt; False

&lt;span class="c"&gt;# Or remove from known_hosts&lt;/span&gt;
ssh-keygen &lt;span class="nt"&gt;-R&lt;/span&gt; stapp01
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;Issue 7: Module Not Found&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ERROR! no action detected in task
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check module exists&lt;/span&gt;
ansible-doc &lt;span class="nt"&gt;-l&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;archive
ansible-doc &lt;span class="nt"&gt;-l&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;unarchive

&lt;span class="c"&gt;# Update Ansible&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;yum update &lt;span class="nt"&gt;-y&lt;/span&gt; ansible

&lt;span class="c"&gt;# For older versions, use shell commands&lt;/span&gt;
- name: Create archive using shell
  shell: &lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-czf&lt;/span&gt; /opt/backup/data.tar.gz &lt;span class="nt"&gt;-C&lt;/span&gt; /usr/src data/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  8. Security Best Practices
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔐 Protecting Your Automation
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;1. SSH Key Management&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Generate strong SSH key&lt;/span&gt;
ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; ed25519 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"thor-ansible-&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; +%Y%m%d&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Use ssh-agent to manage keys&lt;/span&gt;
&lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;ssh-agent&lt;span class="si"&gt;)&lt;/span&gt;
ssh-add ~/.ssh/id_ed25519

&lt;span class="c"&gt;# Copy keys to servers&lt;/span&gt;
ssh-copy-id tony@stapp01
ssh-copy-id steve@stapp02
ssh-copy-id banner@stapp03
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;2. Ansible Vault for Secrets&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create encrypted file&lt;/span&gt;
ansible-vault create group_vars/all/vault.yml

&lt;span class="c"&gt;# Content of vault.yml&lt;/span&gt;
&lt;span class="nt"&gt;---&lt;/span&gt;
vault_ssh_pass: &lt;span class="s2"&gt;"Ir0nM@n"&lt;/span&gt;
vault_sudo_pass: &lt;span class="s2"&gt;"Ir0nM@n"&lt;/span&gt;

&lt;span class="c"&gt;# Use in inventory&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;app_servers]
stapp01 &lt;span class="nv"&gt;ansible_host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;stapp01 &lt;span class="nv"&gt;ansible_user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tony &lt;span class="nv"&gt;ansible_ssh_pass&lt;/span&gt;&lt;span class="o"&gt;={{&lt;/span&gt; vault_ssh_pass &lt;span class="o"&gt;}}&lt;/span&gt;

&lt;span class="c"&gt;# Run playbook with vault&lt;/span&gt;
ansible-playbook &lt;span class="nt"&gt;-i&lt;/span&gt; inventory playbook.yml &lt;span class="nt"&gt;--ask-vault-pass&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;3. Secure File Permissions&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Set secure permissions on sensitive files&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Secure inventory file&lt;/span&gt;
  &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/home/thor/ansible/inventory&lt;/span&gt;
    &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0600'&lt;/span&gt;
    &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;thor&lt;/span&gt;
    &lt;span class="na"&gt;group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;thor&lt;/span&gt;

&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Secure playbook files&lt;/span&gt;
  &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/home/thor/ansible/playbook.yml&lt;/span&gt;
    &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0644'&lt;/span&gt;
    &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;thor&lt;/span&gt;
    &lt;span class="na"&gt;group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;thor&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;4. Ansible Configuration Security&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="c"&gt;# /etc/ansible/ansible.cfg
&lt;/span&gt;&lt;span class="nn"&gt;[defaults]&lt;/span&gt;
&lt;span class="py"&gt;host_key_checking&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;False&lt;/span&gt;
&lt;span class="py"&gt;timeout&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;30&lt;/span&gt;
&lt;span class="py"&gt;private_key_file&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;/home/thor/.ssh/id_ed25519&lt;/span&gt;
&lt;span class="py"&gt;remote_user&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;thor&lt;/span&gt;
&lt;span class="py"&gt;ask_pass&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;False&lt;/span&gt;
&lt;span class="py"&gt;vault_password_file&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;/etc/ansible/.vault_pass&lt;/span&gt;

&lt;span class="nn"&gt;[privilege_escalation]&lt;/span&gt;
&lt;span class="py"&gt;become&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;True&lt;/span&gt;
&lt;span class="py"&gt;become_method&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;sudo&lt;/span&gt;
&lt;span class="py"&gt;become_user&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;root&lt;/span&gt;
&lt;span class="py"&gt;become_ask_pass&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;5. Auditing and Logging&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Enable logging&lt;/span&gt;
  &lt;span class="na"&gt;hosts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;localhost&lt;/span&gt;
  &lt;span class="na"&gt;tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Configure ansible logging&lt;/span&gt;
      &lt;span class="na"&gt;lineinfile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/etc/ansible/ansible.cfg&lt;/span&gt;
        &lt;span class="na"&gt;regexp&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;^log_path'&lt;/span&gt;
        &lt;span class="na"&gt;line&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;log_path&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;=&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;/var/log/ansible/ansible.log'&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create log directory&lt;/span&gt;
      &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/var/log/ansible&lt;/span&gt;
        &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;directory&lt;/span&gt;
        &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0755'&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Set log rotation&lt;/span&gt;
      &lt;span class="na"&gt;copy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;dest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/etc/logrotate.d/ansible&lt;/span&gt;
        &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;/var/log/ansible/*.log {&lt;/span&gt;
              &lt;span class="s"&gt;daily&lt;/span&gt;
              &lt;span class="s"&gt;rotate 30&lt;/span&gt;
              &lt;span class="s"&gt;compress&lt;/span&gt;
              &lt;span class="s"&gt;delaycompress&lt;/span&gt;
              &lt;span class="s"&gt;missingok&lt;/span&gt;
              &lt;span class="s"&gt;notifempty&lt;/span&gt;
              &lt;span class="s"&gt;create 0640 thor thor&lt;/span&gt;
          &lt;span class="s"&gt;}&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  9. Performance Optimization
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ⚡ Speed Up Your Automation
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;1. Use Gather Facts Wisely&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="c1"&gt;# Skip gather facts for faster execution&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Fast playbook&lt;/span&gt;
  &lt;span class="na"&gt;hosts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app_servers&lt;/span&gt;
  &lt;span class="na"&gt;gather_facts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;no&lt;/span&gt;  &lt;span class="c1"&gt;# &amp;lt;-- Speeds up execution&lt;/span&gt;

&lt;span class="c1"&gt;# Use gather facts only when needed&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Playbook with conditional facts&lt;/span&gt;
  &lt;span class="na"&gt;hosts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app_servers&lt;/span&gt;
  &lt;span class="na"&gt;gather_facts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
  &lt;span class="na"&gt;when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ansible_system == "Linux"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;2. Use &lt;code&gt;creates&lt;/code&gt; to Avoid Re-running Commands&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Extract archive (only if not extracted)&lt;/span&gt;
  &lt;span class="na"&gt;unarchive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/usr/src/data/datacenter.zip&lt;/span&gt;
    &lt;span class="na"&gt;dest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/opt/data/&lt;/span&gt;
  &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;creates&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/opt/data/flag_file&lt;/span&gt;  &lt;span class="c1"&gt;# Skip if flag exists&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;3. Use Async for Long-running Tasks&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Extract large archive&lt;/span&gt;
  &lt;span class="na"&gt;unarchive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/usr/src/data/large_archive.zip&lt;/span&gt;
    &lt;span class="na"&gt;dest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/opt/data/&lt;/span&gt;
  &lt;span class="na"&gt;async&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3600&lt;/span&gt;
  &lt;span class="na"&gt;poll&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
  &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;

&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Check async status&lt;/span&gt;
  &lt;span class="na"&gt;async_status&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;jid&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_job_id&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
  &lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;job_result&lt;/span&gt;
  &lt;span class="na"&gt;until&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;job_result.finished&lt;/span&gt;
  &lt;span class="na"&gt;retries&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;60&lt;/span&gt;
  &lt;span class="na"&gt;delay&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;4. Use Strategy Plugins&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Efficient playbook execution&lt;/span&gt;
  &lt;span class="na"&gt;hosts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app_servers&lt;/span&gt;
  &lt;span class="na"&gt;strategy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;free&lt;/span&gt;  &lt;span class="c1"&gt;# Run tasks as fast as possible&lt;/span&gt;
  &lt;span class="na"&gt;gather_facts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;no&lt;/span&gt;
  &lt;span class="na"&gt;tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Extract archive&lt;/span&gt;
      &lt;span class="na"&gt;unarchive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/usr/src/data/datacenter.zip&lt;/span&gt;
        &lt;span class="na"&gt;dest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/opt/data/&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;5. Parallel Execution&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Use forks to run in parallel&lt;/span&gt;
ansible-playbook &lt;span class="nt"&gt;-i&lt;/span&gt; inventory playbook.yml &lt;span class="nt"&gt;--forks&lt;/span&gt; 10

&lt;span class="c"&gt;# Set in ansible.cfg&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;defaults]
forks &lt;span class="o"&gt;=&lt;/span&gt; 20
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  10. Conclusion
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🎯 Key Takeaways
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;What We've Learned&lt;/strong&gt;
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Module&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Key Parameters&lt;/th&gt;
&lt;th&gt;Best Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Archive&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Create compressed archives&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;path&lt;/code&gt;, &lt;code&gt;dest&lt;/code&gt;, &lt;code&gt;format&lt;/code&gt;, &lt;code&gt;mode&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Backups, data packaging&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Unarchive&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Extract compressed archives&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;src&lt;/code&gt;, &lt;code&gt;dest&lt;/code&gt;, &lt;code&gt;owner&lt;/code&gt;, &lt;code&gt;group&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Deployments, data distribution&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Best Practices Summary&lt;/strong&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Inventory Management&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use group/host variables&lt;/li&gt;
&lt;li&gt;Separate credentials from inventory&lt;/li&gt;
&lt;li&gt;Use Ansible Vault for secrets&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Module Usage&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;archive&lt;/code&gt; for creating backups&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;unarchive&lt;/code&gt; for deployments&lt;/li&gt;
&lt;li&gt;Always set ownership and permissions&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;become: yes&lt;/code&gt; for system directories&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Playbook Design&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make playbooks idempotent&lt;/li&gt;
&lt;li&gt;Include verification tasks&lt;/li&gt;
&lt;li&gt;Handle errors gracefully&lt;/li&gt;
&lt;li&gt;Use variables for reusability&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use SSH keys instead of passwords&lt;/li&gt;
&lt;li&gt;Encrypt sensitive data&lt;/li&gt;
&lt;li&gt;Set proper file permissions&lt;/li&gt;
&lt;li&gt;Enable logging for auditing&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Performance&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Skip gather facts when possible&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;creates&lt;/code&gt; for idempotency&lt;/li&gt;
&lt;li&gt;Increase forks for parallel execution&lt;/li&gt;
&lt;li&gt;Use async for long tasks&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Complete Command Reference&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Archive Creation&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory app_servers &lt;span class="nt"&gt;-m&lt;/span&gt; archive &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"path=/usr/src/data/ dest=/opt/backup/data.tar.gz format=gz"&lt;/span&gt;

&lt;span class="c"&gt;# Archive Extraction&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory app_servers &lt;span class="nt"&gt;-m&lt;/span&gt; unarchive &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"src=/usr/src/data/datacenter.zip dest=/opt/data/"&lt;/span&gt;

&lt;span class="c"&gt;# Verification&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory app_servers &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="nb"&gt;stat&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"path=/opt/backup/data.tar.gz"&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory app_servers &lt;span class="nt"&gt;-m&lt;/span&gt; shell &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"tar -tzf /opt/backup/data.tar.gz"&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory app_servers &lt;span class="nt"&gt;-m&lt;/span&gt; shell &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"ls -la /opt/data/"&lt;/span&gt;

&lt;span class="c"&gt;# Playbook Execution&lt;/span&gt;
ansible-playbook &lt;span class="nt"&gt;-i&lt;/span&gt; inventory playbook.yml
ansible-playbook &lt;span class="nt"&gt;-i&lt;/span&gt; inventory playbook.yml &lt;span class="nt"&gt;--check&lt;/span&gt;  &lt;span class="c"&gt;# Dry run&lt;/span&gt;
ansible-playbook &lt;span class="nt"&gt;-i&lt;/span&gt; inventory playbook.yml &lt;span class="nt"&gt;--verbose&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🚀 Next Steps
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Expand Your Skills&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learn about Ansible Roles&lt;/li&gt;
&lt;li&gt;Explore Ansible Tower/AWX&lt;/li&gt;
&lt;li&gt;Implement CI/CD with Ansible&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Additional Modules to Explore&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;copy&lt;/code&gt; - Copy files from controller to hosts&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;synchronize&lt;/code&gt; - Rsync-like file synchronization&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;template&lt;/code&gt; - Jinja2 templating&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;file&lt;/code&gt; - File and directory management&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Real-World Applications&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Application deployment pipelines&lt;/li&gt;
&lt;li&gt;Configuration management&lt;/li&gt;
&lt;li&gt;Infrastructure as Code&lt;/li&gt;
&lt;li&gt;Disaster recovery automation&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  📚 Resources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ansible Documentation&lt;/strong&gt;: &lt;a href="https://docs.ansible.com/" rel="noopener noreferrer"&gt;https://docs.ansible.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Module Index&lt;/strong&gt;: &lt;a href="https://docs.ansible.com/ansible/latest/collections/index.html" rel="noopener noreferrer"&gt;https://docs.ansible.com/ansible/latest/collections/index.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Practices&lt;/strong&gt;: &lt;a href="https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_best_practices.html" rel="noopener noreferrer"&gt;https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_best_practices.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ansible Galaxy&lt;/strong&gt;: &lt;a href="https://galaxy.ansible.com/" rel="noopener noreferrer"&gt;https://galaxy.ansible.com/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🎉 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Mastering Ansible's archive and unarchive modules is essential for any DevOps engineer. These modules provide the foundation for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Efficient Data Management&lt;/strong&gt;: Compress and extract files across multiple servers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automated Deployments&lt;/strong&gt;: Distribute application packages consistently&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reliable Backups&lt;/strong&gt;: Create and store backups automatically&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configuration Distribution&lt;/strong&gt;: Deploy configuration files at scale&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The skills you've learned in this guide will serve you well in your DevOps journey. Remember to always test your playbooks in a safe environment before deploying to production, and continuously refine your automation practices.&lt;/p&gt;

</description>
      <category>ansible</category>
    </item>
    <item>
      <title>Ansible Archive Module</title>
      <dc:creator>Janak Shrestha</dc:creator>
      <pubDate>Sat, 29 Aug 2026 05:53:14 +0000</pubDate>
      <link>https://dev.to/janak0ff/ansible-archive-module-2lhg</link>
      <guid>https://dev.to/janak0ff/ansible-archive-module-2lhg</guid>
      <description>&lt;p&gt;The Nautilus DevOps team has some data on each app server in&amp;nbsp;&lt;code&gt;Stratos DC&lt;/code&gt;&amp;nbsp;that they want to copy to a different location. However, they want to create an archive of the data first, then they want to copy the same to a different location on the respective app server. Additionally, there are some specific requirements for each server. Perform the task using Ansible playbook as per requirements mentioned below:  &lt;/p&gt;

&lt;p&gt;Create a playbook named&amp;nbsp;&lt;code&gt;playbook.yml&lt;/code&gt;&amp;nbsp;under&amp;nbsp;&lt;code&gt;/home/thor/ansible&lt;/code&gt;&amp;nbsp;directory on&amp;nbsp;&lt;code&gt;jump host&lt;/code&gt;, an&amp;nbsp;&lt;code&gt;inventory&lt;/code&gt;&amp;nbsp;file is already placed under&amp;nbsp;&lt;code&gt;/home/thor/ansible/&lt;/code&gt;&amp;nbsp;directory on&amp;nbsp;&lt;code&gt;Jump Server&lt;/code&gt;&amp;nbsp;itself.  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create an archive&amp;nbsp;&lt;code&gt;beta.tar.gz&lt;/code&gt;&amp;nbsp;(make sure archive format is&amp;nbsp;&lt;code&gt;tar.gz&lt;/code&gt;) of&amp;nbsp;&lt;code&gt;/usr/src/itadmin/&lt;/code&gt;&amp;nbsp;directory ( present on each app server ) and copy it to&amp;nbsp;&lt;code&gt;/opt/itadmin/&lt;/code&gt;&amp;nbsp;directory on all app servers. The user and group&amp;nbsp;&lt;code&gt;owner&lt;/code&gt;&amp;nbsp;of archive&amp;nbsp;&lt;code&gt;beta.tar.gz&lt;/code&gt;&amp;nbsp;should be&amp;nbsp;&lt;code&gt;tony&lt;/code&gt;&amp;nbsp;for&amp;nbsp;&lt;code&gt;App Server 1&lt;/code&gt;,&amp;nbsp;&lt;code&gt;steve&lt;/code&gt;&amp;nbsp;for&amp;nbsp;&lt;code&gt;App Server 2&lt;/code&gt;&amp;nbsp;and&amp;nbsp;&lt;code&gt;banner&lt;/code&gt;&amp;nbsp;for&amp;nbsp;&lt;code&gt;App Server 3&lt;/code&gt;.
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;Note:&lt;/code&gt;&amp;nbsp;Validation will try to run playbook using command&amp;nbsp;&lt;code&gt;ansible-playbook -i inventory playbook.yml&lt;/code&gt;&amp;nbsp;so please make sure playbook works this way, without passing any extra arguments.&lt;/p&gt;




&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;p&gt;In the fast-paced world of DevOps, automation is the key to maintaining efficiency, consistency, and reliability across infrastructure. The Nautilus DevOps team recently faced a challenge: they needed to archive data from multiple application servers and move it to different locations with specific ownership requirements. Instead of performing this task manually on each server, they turned to Ansible—and the results were outstanding.&lt;/p&gt;

&lt;p&gt;This comprehensive guide walks through the entire process of creating an Ansible playbook to archive a directory and copy it to a different location with specific ownership requirements across multiple servers.&lt;/p&gt;




&lt;h3&gt;
  
  
  Table of Contents
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Understanding the Requirements&lt;/li&gt;
&lt;li&gt;Prerequisites and Setup&lt;/li&gt;
&lt;li&gt;Inventory Configuration&lt;/li&gt;
&lt;li&gt;Playbook Design and Implementation&lt;/li&gt;
&lt;li&gt;Execution and Verification&lt;/li&gt;
&lt;li&gt;Troubleshooting Common Issues&lt;/li&gt;
&lt;li&gt;Best Practices and Key Takeaways&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Understanding the Requirements
&lt;/h3&gt;

&lt;p&gt;The DevOps team had specific requirements for all application servers in the Stratos DC:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Source Directory&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/usr/src/finance/&lt;/code&gt; (exists on each app server)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Destination Directory&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/opt/finance/&lt;/code&gt; (create if not exists)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Archive Name&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;official.tar.gz&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Archive Format&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;tar.gz (compressed archive)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Server&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Owner &amp;amp; Group&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;stapp01&lt;/td&gt;
&lt;td&gt;tony&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;stapp02&lt;/td&gt;
&lt;td&gt;steve&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;stapp03&lt;/td&gt;
&lt;td&gt;banner&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The Task Must Be Performed Using:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ansible-playbook &lt;span class="nt"&gt;-i&lt;/span&gt; inventory playbook.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No additional arguments should be required.&lt;/p&gt;




&lt;h3&gt;
  
  
  Prerequisites and Setup
&lt;/h3&gt;

&lt;p&gt;Before diving into the implementation, ensure the following prerequisites are met:&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Ansible Installation
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Verify Ansible is installed&lt;/span&gt;
ansible &lt;span class="nt"&gt;--version&lt;/span&gt;

&lt;span class="c"&gt;# If not installed, install via yum&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;yum &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; ansible
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. SSH Connectivity
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Test SSH connectivity to each server&lt;/span&gt;
ssh &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;StrictHostKeyChecking&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;no tony@stapp01 &lt;span class="s2"&gt;"echo 'Connected'"&lt;/span&gt;
ssh &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;StrictHostKeyChecking&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;no steve@stapp02 &lt;span class="s2"&gt;"echo 'Connected'"&lt;/span&gt;
ssh &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;StrictHostKeyChecking&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;no banner@stapp03 &lt;span class="s2"&gt;"echo 'Connected'"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. Directory Structure
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create the working directory&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /home/thor/ansible
&lt;span class="nb"&gt;cd&lt;/span&gt; /home/thor/ansible
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Inventory Configuration
&lt;/h3&gt;

&lt;p&gt;The inventory file serves as the foundation for Ansible connectivity. Here's the complete inventory configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /home/thor/ansible/inventory &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
[app_servers]
stapp01 ansible_user=tony ansible_ssh_pass=Ir0nM@n ansible_ssh_common_args='-o StrictHostKeyChecking=no'
stapp02 ansible_user=steve ansible_ssh_pass=Am3ric@ ansible_ssh_common_args='-o StrictHostKeyChecking=no'
stapp03 ansible_user=banner ansible_ssh_pass=BigGr33n ansible_ssh_common_args='-o StrictHostKeyChecking=no'
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Inventory Breakdown:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Group&lt;/strong&gt;: &lt;code&gt;[app_servers]&lt;/code&gt; - All application servers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Host&lt;/strong&gt;: Unique identifier for each server&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ansible_user&lt;/strong&gt;: SSH username for authentication&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ansible_ssh_pass&lt;/strong&gt;: SSH password for authentication&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ansible_ssh_common_args&lt;/strong&gt;: Additional SSH options&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;StrictHostKeyChecking=no&lt;/strong&gt;: Disables host key verification&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Verify Inventory
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Test inventory connectivity&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory app_servers &lt;span class="nt"&gt;-m&lt;/span&gt; ping
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Playbook Design and Implementation
&lt;/h3&gt;

&lt;p&gt;The playbook is designed with idempotency, error handling, and flexibility in mind.&lt;/p&gt;

&lt;h4&gt;
  
  
  Complete Playbook
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /home/thor/ansible/playbook.yml &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
---
- name: Archive and copy finance directory across app servers
  hosts: app_servers
  gather_facts: no
  vars:
    source_dir: /usr/src/finance
    dest_dir: /opt/finance
    archive_path: /opt/finance/official.tar.gz

  tasks:
    # Task 1: Create destination directory
    - name: Create destination directory
      file:
        path: "{{ dest_dir }}"
        state: directory
        mode: '0755'
      become: yes

    # Task 2: Verify source directory exists
    - name: Verify source directory exists
      stat:
        path: "{{ source_dir }}"
      register: source_stat
      become: yes
      failed_when: not source_stat.stat.exists

    # Task 3: Remove existing archive if present
    - name: Remove existing archive if present
      file:
        path: "{{ archive_path }}"
        state: absent
      become: yes
      when: source_stat.stat.exists

    # Task 4: Create tar.gz archive
    - name: Create tar.gz archive of finance directory
      archive:
        path: "{{ source_dir }}/"
        dest: "{{ archive_path }}"
        format: gz
        force_archive: yes
      become: yes
      when: source_stat.stat.exists

    # Task 5: Set ownership of the archive
    - name: Set ownership of official.tar.gz
      file:
        path: "{{ archive_path }}"
        owner: "{{ ansible_user }}"
        group: "{{ ansible_user }}"
        mode: '0644'
      become: yes

    # Task 6: Verify archive exists
    - name: Verify archive exists
      stat:
        path: "{{ archive_path }}"
      register: archive_stat
      become: yes

    # Task 7: Display completion message
    - name: Display completion message
      debug:
        msg: "Successfully created {{ archive_path }} on {{ inventory_hostname }} with owner {{ ansible_user }}"
      when: archive_stat.stat.exists
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Alternative Playbook Using Shell Module
&lt;/h4&gt;

&lt;p&gt;If the &lt;code&gt;archive&lt;/code&gt; module is unavailable or problematic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /home/thor/ansible/playbook.yml &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
---
- name: Archive and copy finance directory across app servers
  hosts: app_servers
  gather_facts: no
  vars:
    source_dir: /usr/src/finance
    dest_dir: /opt/finance
    archive_path: /opt/finance/official.tar.gz

  tasks:
    - name: Create destination directory
      file:
        path: "{{ dest_dir }}"
        state: directory
        mode: '0755'
      become: yes

    - name: Verify source directory exists
      stat:
        path: "{{ source_dir }}"
      register: source_stat
      become: yes
      failed_when: not source_stat.stat.exists

    - name: Remove existing archive if present
      file:
        path: "{{ archive_path }}"
        state: absent
      become: yes
      when: source_stat.stat.exists

    - name: Create tar.gz archive using shell
      shell: |
        tar -czf "{{ archive_path }}" -C "{{ source_dir | dirname }}" "{{ source_dir | basename }}"
      become: yes
      when: source_stat.stat.exists
      args:
        creates: "{{ archive_path }}"

    - name: Set ownership of official.tar.gz
      file:
        path: "{{ archive_path }}"
        owner: "{{ ansible_user }}"
        group: "{{ ansible_user }}"
        mode: '0644'
      become: yes

    - name: Verify archive exists
      stat:
        path: "{{ archive_path }}"
      register: archive_stat
      become: yes

    - name: Display completion message
      debug:
        msg: "Successfully created {{ archive_path }} on {{ inventory_hostname }} with owner {{ ansible_user }}"
      when: archive_stat.stat.exists
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Playbook Features Explained
&lt;/h4&gt;

&lt;h5&gt;
  
  
  1. Variables
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;vars&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;source_dir&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/usr/src/finance&lt;/span&gt;
  &lt;span class="na"&gt;dest_dir&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/opt/finance&lt;/span&gt;
  &lt;span class="na"&gt;archive_path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/opt/finance/official.tar.gz&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Variables make the playbook reusable and easier to maintain. Changing the source or destination paths requires only one modification.&lt;/p&gt;

&lt;h5&gt;
  
  
  2. Directory Creation
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create destination directory&lt;/span&gt;
  &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;dest_dir&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
    &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;directory&lt;/span&gt;
    &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0755'&lt;/span&gt;
  &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Creates the destination directory with proper permissions. The &lt;code&gt;become: yes&lt;/code&gt; ensures administrative privileges.&lt;/p&gt;

&lt;h5&gt;
  
  
  3. Source Verification
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Verify source directory exists&lt;/span&gt;
  &lt;span class="na"&gt;stat&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;source_dir&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
  &lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;source_stat&lt;/span&gt;
  &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
  &lt;span class="na"&gt;failed_when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;not source_stat.stat.exists&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ensures the source directory exists before attempting to archive. Prevents the playbook from failing unexpectedly.&lt;/p&gt;

&lt;h5&gt;
  
  
  4. Archive Creation
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create tar.gz archive&lt;/span&gt;
  &lt;span class="na"&gt;archive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;source_dir&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}/"&lt;/span&gt;
    &lt;span class="na"&gt;dest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;archive_path&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
    &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gz&lt;/span&gt;
    &lt;span class="na"&gt;force_archive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
  &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Creates the &lt;code&gt;tar.gz&lt;/code&gt; archive using the &lt;code&gt;archive&lt;/code&gt; module with &lt;code&gt;format: gz&lt;/code&gt;. The &lt;code&gt;force_archive: yes&lt;/code&gt; ensures the archive is recreated even if it already exists.&lt;/p&gt;

&lt;h5&gt;
  
  
  5. Dynamic Ownership
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Set ownership of official.tar.gz&lt;/span&gt;
  &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;archive_path&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
    &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
    &lt;span class="na"&gt;group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ansible_user&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
    &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0644'&lt;/span&gt;
  &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uses &lt;code&gt;{{ ansible_user }}&lt;/code&gt; to dynamically set the correct owner:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;stapp01 → tony&lt;/li&gt;
&lt;li&gt;stapp02 → steve&lt;/li&gt;
&lt;li&gt;stapp03 → banner&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  6. Verification
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Verify archive exists&lt;/span&gt;
  &lt;span class="na"&gt;stat&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;archive_path&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
  &lt;span class="na"&gt;register&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;archive_stat&lt;/span&gt;
  &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Confirms the archive was successfully created before displaying the completion message.&lt;/p&gt;




&lt;h3&gt;
  
  
  Execution and Verification
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Running the Playbook
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /home/thor/ansible
ansible-playbook &lt;span class="nt"&gt;-i&lt;/span&gt; inventory playbook.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Expected Output
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;PLAY [Archive and copy finance directory across app servers] ********************

TASK [Create destination directory] *********************************************
changed: [stapp01]
changed: [stapp02]
changed: [stapp03]

TASK [Verify source directory exists] ******************************************
ok: [stapp01]
ok: [stapp02]
ok: [stapp03]

TASK [Remove existing archive if present] **************************************
ok: [stapp01]
ok: [stapp02]
ok: [stapp03]

TASK [Create tar.gz archive of finance directory] ******************************
changed: [stapp01]
changed: [stapp02]
changed: [stapp03]

TASK [Set ownership of official.tar.gz] ****************************************
changed: [stapp01]
changed: [stapp02]
changed: [stapp03]

TASK [Verify archive exists] ***************************************************
ok: [stapp01]
ok: [stapp02]
ok: [stapp03]

TASK [Display completion message] **********************************************
&lt;/span&gt;&lt;span class="gp"&gt;ok: [stapp01] =&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="go"&gt;    "msg": "Successfully created /opt/finance/official.tar.gz on stapp01 with owner tony"
}
&lt;/span&gt;&lt;span class="gp"&gt;ok: [stapp02] =&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="go"&gt;    "msg": "Successfully created /opt/finance/official.tar.gz on stapp02 with owner steve"
}
&lt;/span&gt;&lt;span class="gp"&gt;ok: [stapp03] =&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="go"&gt;    "msg": "Successfully created /opt/finance/official.tar.gz on stapp03 with owner banner"
}

PLAY RECAP *********************************************************************
stapp01 : ok=7 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
stapp02 : ok=7 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
stapp03 : ok=7 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Verification Commands
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Check if archive exists&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory app_servers &lt;span class="nt"&gt;-m&lt;/span&gt; shell &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"ls -la /opt/finance/official.tar.gz"&lt;/span&gt;

&lt;span class="c"&gt;# Expected Output:&lt;/span&gt;
&lt;span class="c"&gt;# stapp01: -rw-r--r-- 1 tony tony 215 /opt/finance/official.tar.gz&lt;/span&gt;
&lt;span class="c"&gt;# stapp02: -rw-r--r-- 1 steve steve 226 /opt/finance/official.tar.gz&lt;/span&gt;
&lt;span class="c"&gt;# stapp03: -rw-r--r-- 1 banner banner 210 /opt/finance/official.tar.gz&lt;/span&gt;

&lt;span class="c"&gt;# 2. Check archive content (should work without errors)&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory app_servers &lt;span class="nt"&gt;-m&lt;/span&gt; shell &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"tar -tzf /opt/finance/official.tar.gz"&lt;/span&gt;

&lt;span class="c"&gt;# Expected Output:&lt;/span&gt;
&lt;span class="c"&gt;# stapp01: blog.txt&lt;/span&gt;
&lt;span class="c"&gt;# stapp02: story.txt&lt;/span&gt;
&lt;span class="c"&gt;# stapp03: media.txt&lt;/span&gt;

&lt;span class="c"&gt;# 3. Check ownership&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory app_servers &lt;span class="nt"&gt;-m&lt;/span&gt; shell &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"stat -c '%U:%G %n' /opt/finance/official.tar.gz"&lt;/span&gt;

&lt;span class="c"&gt;# Expected Output:&lt;/span&gt;
&lt;span class="c"&gt;# stapp01: tony:tony /opt/finance/official.tar.gz&lt;/span&gt;
&lt;span class="c"&gt;# stapp02: steve:steve /opt/finance/official.tar.gz&lt;/span&gt;
&lt;span class="c"&gt;# stapp03: banner:banner /opt/finance/official.tar.gz&lt;/span&gt;

&lt;span class="c"&gt;# 4. Check archive size&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory app_servers &lt;span class="nt"&gt;-m&lt;/span&gt; shell &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"du -sh /opt/finance/official.tar.gz"&lt;/span&gt;

&lt;span class="c"&gt;# Expected Output:&lt;/span&gt;
&lt;span class="c"&gt;# stapp01: 4.0K /opt/finance/official.tar.gz&lt;/span&gt;
&lt;span class="c"&gt;# stapp02: 4.0K /opt/finance/official.tar.gz&lt;/span&gt;
&lt;span class="c"&gt;# stapp03: 4.0K /opt/finance/official.tar.gz&lt;/span&gt;

&lt;span class="c"&gt;# 5. Verify ownership on each server individually&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory stapp01 &lt;span class="nt"&gt;-m&lt;/span&gt; shell &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"stat -c '%U:%G' /opt/finance/official.tar.gz"&lt;/span&gt;  &lt;span class="c"&gt;# Should show tony:tony&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory stapp02 &lt;span class="nt"&gt;-m&lt;/span&gt; shell &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"stat -c '%U:%G' /opt/finance/official.tar.gz"&lt;/span&gt;  &lt;span class="c"&gt;# Should show steve:steve&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory stapp03 &lt;span class="nt"&gt;-m&lt;/span&gt; shell &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"stat -c '%U:%G' /opt/finance/official.tar.gz"&lt;/span&gt;  &lt;span class="c"&gt;# Should show banner:banner&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Video Demonstration
&lt;/h4&gt;

&lt;p&gt;For a complete visual guide, watch this demonstration:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=xxxxxxxxxxx" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.youtube.com%2Fvi%2Fxxxxxxxxxxx%2F0.jpg" alt="Ansible Archive Automation Demo"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Troubleshooting Common Issues
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Issue 1: Source Directory Doesn't Exist
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;fatal:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;stapp&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;FAILED!&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"msg"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Source directory does not exist"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create the directory and test data&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory app_servers &lt;span class="nt"&gt;-m&lt;/span&gt; file &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"path=/usr/src/finance state=directory mode=0755"&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory app_servers &lt;span class="nt"&gt;-m&lt;/span&gt; copy &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"content='Financial data&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;' dest=/usr/src/finance/records.txt"&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory app_servers &lt;span class="nt"&gt;-m&lt;/span&gt; copy &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"content='Blog content&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;' dest=/usr/src/finance/blog.txt"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Issue 2: Archive Not in Gzip Format
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gzip: stdin: not in gzip format
tar: Child returned status 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use the shell module version with &lt;code&gt;tar -czf&lt;/code&gt; instead of the archive module&lt;/li&gt;
&lt;li&gt;Ensure &lt;code&gt;format: gz&lt;/code&gt; is specified when using the archive module
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Correct archive module usage&lt;/span&gt;
&lt;span class="na"&gt;archive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/usr/src/finance/"&lt;/span&gt;
  &lt;span class="na"&gt;dest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/opt/finance/official.tar.gz"&lt;/span&gt;
  &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gz&lt;/span&gt;
  &lt;span class="na"&gt;force_archive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;

&lt;span class="c1"&gt;# Or use shell module&lt;/span&gt;
&lt;span class="na"&gt;shell&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tar -czf /opt/finance/official.tar.gz -C /usr/src finance&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Issue 3: Permission Denied
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;fatal:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;stapp&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;FAILED!&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"msg"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Permission denied"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Ensure 'become: yes' is used for all administrative tasks&lt;/span&gt;
&lt;span class="c"&gt;# Check sudo privileges for the user&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory app_servers &lt;span class="nt"&gt;-m&lt;/span&gt; shell &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"sudo -l"&lt;/span&gt;

&lt;span class="c"&gt;# If password is required for sudo, add to inventory&lt;/span&gt;
&lt;span class="c"&gt;# ansible_become_pass=Ir0nM@n&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Issue 4: Wrong Ownership
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt; 1 root root /opt/finance/official.tar.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Verify inventory user mapping&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /home/thor/ansible/inventory

&lt;span class="c"&gt;# Ensure ansible_user variable is correct for each server&lt;/span&gt;
&lt;span class="c"&gt;# stapp01 -&amp;gt; tony&lt;/span&gt;
&lt;span class="c"&gt;# stapp02 -&amp;gt; steve&lt;/span&gt;
&lt;span class="c"&gt;# stapp03 -&amp;gt; banner&lt;/span&gt;

&lt;span class="c"&gt;# Manually fix ownership if needed&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory stapp01 &lt;span class="nt"&gt;-m&lt;/span&gt; file &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"path=/opt/finance/official.tar.gz owner=tony group=tony mode=0644"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Issue 5: Connection Timeout
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;fatal:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;stapp&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;UNREACHABLE!&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"msg"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Failed to connect to the host via ssh"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Test network connectivity&lt;/span&gt;
ping &lt;span class="nt"&gt;-c&lt;/span&gt; 3 stapp01

&lt;span class="c"&gt;# Check SSH port&lt;/span&gt;
nc &lt;span class="nt"&gt;-zv&lt;/span&gt; stapp01 22

&lt;span class="c"&gt;# Verify SSH credentials&lt;/span&gt;
ssh &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;StrictHostKeyChecking&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;no tony@stapp01

&lt;span class="c"&gt;# Increase timeout in inventory&lt;/span&gt;
&lt;span class="nv"&gt;ansible_ssh_timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;60
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Issue 6: Host Key Verification Failed
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Host key verification failed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Add to inventory&lt;/span&gt;
&lt;span class="nv"&gt;ansible_ssh_common_args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'-o StrictHostKeyChecking=no'&lt;/span&gt;

&lt;span class="c"&gt;# Or remove from known_hosts&lt;/span&gt;
ssh-keygen &lt;span class="nt"&gt;-R&lt;/span&gt; stapp01
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Issue 7: Archive Module Not Available
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ERROR! no action detected in task
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use the shell module alternative&lt;/li&gt;
&lt;li&gt;Update Ansible to a newer version
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;yum update &lt;span class="nt"&gt;-y&lt;/span&gt; ansible
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Best Practices and Key Takeaways
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Dynamic Ownership
&lt;/h4&gt;

&lt;p&gt;Using &lt;code&gt;{{ ansible_user }}&lt;/code&gt; from the inventory makes the playbook flexible and reusable across different servers with different users. This eliminates hardcoding and simplifies maintenance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No need to create separate playbooks for each server&lt;/li&gt;
&lt;li&gt;Easy to add new servers with different users&lt;/li&gt;
&lt;li&gt;Single source of truth for user mapping&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2. Idempotency
&lt;/h4&gt;

&lt;p&gt;The playbook can be run multiple times without causing errors or creating duplicate archives.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implementation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;creates&lt;/code&gt; argument in shell commands&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;force_archive&lt;/code&gt; option in archive module&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;state: absent&lt;/code&gt; before creating new archive&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  3. Error Handling
&lt;/h4&gt;

&lt;p&gt;Using &lt;code&gt;failed_when&lt;/code&gt; and conditional execution (&lt;code&gt;when&lt;/code&gt;) prevents the playbook from failing unnecessarily.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best Practices:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Always check source existence before operations&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;register&lt;/code&gt; to capture results&lt;/li&gt;
&lt;li&gt;Provide meaningful error messages&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;ignore_errors&lt;/code&gt; for non-critical tasks&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  4. Verification
&lt;/h4&gt;

&lt;p&gt;Built-in verification tasks provide confidence that the operation was successful on all servers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verification Steps:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check if archive exists&lt;/li&gt;
&lt;li&gt;Verify correct ownership&lt;/li&gt;
&lt;li&gt;Confirm archive content&lt;/li&gt;
&lt;li&gt;Validate file permissions&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  5. Use of Become
&lt;/h4&gt;

&lt;p&gt;Using &lt;code&gt;become: yes&lt;/code&gt; for administrative tasks ensures the playbook has the necessary permissions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to Use:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating directories in &lt;code&gt;/opt/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Writing to system directories&lt;/li&gt;
&lt;li&gt;Changing file ownership&lt;/li&gt;
&lt;li&gt;Installing packages&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  6. Modular Design
&lt;/h4&gt;

&lt;p&gt;Using variables and reusable tasks makes the playbook modular and maintainable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Easy to update paths&lt;/li&gt;
&lt;li&gt;Simple to extend functionality&lt;/li&gt;
&lt;li&gt;Clear separation of concerns&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  7. Documentation
&lt;/h4&gt;

&lt;p&gt;Inline comments explain the purpose of each task, making the playbook self-documenting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Documentation Tips:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add task descriptions&lt;/li&gt;
&lt;li&gt;Explain complex logic&lt;/li&gt;
&lt;li&gt;Include variable definitions&lt;/li&gt;
&lt;li&gt;Provide usage examples&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;The Ansible playbook successfully automates the process of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Directory Management&lt;/strong&gt;: Creating destination directories with proper permissions&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Archive Creation&lt;/strong&gt;: Compressing source directories into tar.gz format&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;File Transfer&lt;/strong&gt;: Copying archives to target locations&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Ownership Management&lt;/strong&gt;: Setting correct ownership based on server requirements&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Verification&lt;/strong&gt;: Confirming successful execution on all servers&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Idempotency&lt;/strong&gt;: Safe to run multiple times&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Results Summary
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Server&lt;/th&gt;
&lt;th&gt;Source File&lt;/th&gt;
&lt;th&gt;Archive Created&lt;/th&gt;
&lt;th&gt;Owner&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;stapp01&lt;/td&gt;
&lt;td&gt;blog.txt&lt;/td&gt;
&lt;td&gt;official.tar.gz&lt;/td&gt;
&lt;td&gt;tony:tony&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;stapp02&lt;/td&gt;
&lt;td&gt;story.txt&lt;/td&gt;
&lt;td&gt;official.tar.gz&lt;/td&gt;
&lt;td&gt;steve:steve&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;stapp03&lt;/td&gt;
&lt;td&gt;media.txt&lt;/td&gt;
&lt;td&gt;official.tar.gz&lt;/td&gt;
&lt;td&gt;banner:banner&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Key Achievements
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Time Savings&lt;/strong&gt;: Automated what would be a manual 15-minute task per server&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consistency&lt;/strong&gt;: Same process applied across all servers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reliability&lt;/strong&gt;: Idempotent execution ensures no duplicate archives&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintainability&lt;/strong&gt;: Easy to update for future requirements&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scalability&lt;/strong&gt;: Can be extended to additional servers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Extend the Playbook&lt;/strong&gt;: Add additional directories or file types&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Implement Scheduling&lt;/strong&gt;: Use Ansible Tower or cron for regular archiving&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Add Monitoring&lt;/strong&gt;: Implement logging and notification for archive operations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Define Retention Policies&lt;/strong&gt;: Set up automated cleanup of old archives&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Implement Backup Integration&lt;/strong&gt;: Connect with backup systems for disaster recovery&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Create Documentation&lt;/strong&gt;: Document the playbook for team members&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>ansible</category>
    </item>
    <item>
      <title>Configuring Cron Job on Nautilus Storage Server</title>
      <dc:creator>Janak Shrestha</dc:creator>
      <pubDate>Sat, 29 Aug 2026 05:36:13 +0000</pubDate>
      <link>https://dev.to/janak0ff/configuring-cron-job-on-nautilus-storage-server-1jop</link>
      <guid>https://dev.to/janak0ff/configuring-cron-job-on-nautilus-storage-server-1jop</guid>
      <description>&lt;h1&gt;
  
  
  Configuring Cron Job on Nautilus Storage Server
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Objective
&lt;/h2&gt;

&lt;p&gt;This document outlines the procedure for installing and configuring a cron job on the Nautilus Storage Server (ststor01) in the Stratos Datacenter. The system administration team requires the following configuration:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install the cronie package and start the crond service&lt;/li&gt;
&lt;li&gt;Add a cron job to the root user's crontab that executes &lt;code&gt;/usr/bin/touch test_passed&lt;/code&gt; daily at 21:30&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Environment Details
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Server&lt;/strong&gt;: ststor01 (Nautilus Storage Server)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Access User&lt;/strong&gt;: natasha&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Access Password&lt;/strong&gt;: Bl@kW&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sudo Privileges&lt;/strong&gt;: Required&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Implementation Methods
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Method 1: One-Line Command Execution
&lt;/h3&gt;

&lt;p&gt;Execute the following command from the jump host to perform all required actions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Bl@kW'&lt;/span&gt; | ssh natasha@ststor01 &lt;span class="s2"&gt;"sudo -S bash -c 'yum install -y cronie &amp;amp;&amp;amp; systemctl start crond &amp;amp;&amp;amp; systemctl enable crond &amp;amp;&amp;amp; (crontab -l 2&amp;gt;/dev/null; echo &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;30 21 * * * /usr/bin/touch test_passed&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;) | crontab - &amp;amp;&amp;amp; crontab -l'"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command performs the following actions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Installs the cronie package&lt;/li&gt;
&lt;li&gt;Starts the crond service&lt;/li&gt;
&lt;li&gt;Enables crond to start on boot&lt;/li&gt;
&lt;li&gt;Adds the cron job to root's crontab&lt;/li&gt;
&lt;li&gt;Displays the current crontab for verification&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Method 2: Heredoc Method
&lt;/h3&gt;

&lt;p&gt;For a comprehensive output with detailed verification, use the heredoc approach:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh natasha@ststor01 &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
echo 'Bl@kW' | sudo -S bash -c '
echo "Installing cronie package"
yum install -y cronie

echo "Starting crond service"
systemctl start crond
systemctl enable crond

echo "Service Status"
systemctl status crond | grep -E "Active|Loaded"

echo "Adding cron job to root crontab"
(crontab -l 2&amp;gt;/dev/null; echo "30 21 * * * /usr/bin/touch test_passed") | crontab -

echo "Current Crontab"
crontab -l

echo "Verification"
crontab -l | grep -q "30 21 &lt;/span&gt;&lt;span class="se"&gt;\*&lt;/span&gt;&lt;span class="sh"&gt; &lt;/span&gt;&lt;span class="se"&gt;\*&lt;/span&gt;&lt;span class="sh"&gt; &lt;/span&gt;&lt;span class="se"&gt;\*&lt;/span&gt;&lt;span class="sh"&gt; /usr/bin/touch test_passed" &amp;amp;&amp;amp; echo "Cron job added successfully" || echo "Cron job not found"
'
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Method 3: Interactive Session
&lt;/h3&gt;

&lt;p&gt;For manual execution, connect to the server and perform the following commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Connect to storage server&lt;/span&gt;
ssh natasha@ststor01
&lt;span class="c"&gt;# Enter password: Bl@kW&lt;/span&gt;

&lt;span class="c"&gt;# Switch to root&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;su -
&lt;span class="c"&gt;# Enter password: Bl@kW&lt;/span&gt;

&lt;span class="c"&gt;# Install cronie&lt;/span&gt;
yum &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; cronie

&lt;span class="c"&gt;# Start and enable crond service&lt;/span&gt;
systemctl start crond
systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;crond

&lt;span class="c"&gt;# Verify service status&lt;/span&gt;
systemctl status crond

&lt;span class="c"&gt;# Add cron job to root's crontab&lt;/span&gt;
&lt;span class="o"&gt;(&lt;/span&gt;crontab &lt;span class="nt"&gt;-l&lt;/span&gt; 2&amp;gt;/dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"30 21 * * * /usr/bin/touch test_passed"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; | crontab -

&lt;span class="c"&gt;# Verify the cron job&lt;/span&gt;
crontab &lt;span class="nt"&gt;-l&lt;/span&gt;

&lt;span class="c"&gt;# Exit&lt;/span&gt;
&lt;span class="nb"&gt;exit
exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Command Breakdown
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Installation and Service Commands
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;yum install -y cronie&lt;/code&gt;: Installs the cronie package non-interactively&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;systemctl start crond&lt;/code&gt;: Starts the cron daemon service&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;systemctl enable crond&lt;/code&gt;: Configures crond to start automatically at boot&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cron Job Addition
&lt;/h3&gt;

&lt;p&gt;The command structure for adding the cron job is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;(&lt;/span&gt;crontab &lt;span class="nt"&gt;-l&lt;/span&gt; 2&amp;gt;/dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"30 21 * * * /usr/bin/touch test_passed"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; | crontab -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;crontab -l 2&amp;gt;/dev/null&lt;/code&gt;: Lists existing crontab entries, suppressing errors if none exist&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;echo "30 21 * * * /usr/bin/touch test_passed"&lt;/code&gt;: Defines the new cron job&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;| crontab -&lt;/code&gt;: Pipes the combined output to replace the crontab&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cron Syntax Explained
&lt;/h3&gt;

&lt;p&gt;The cron expression &lt;code&gt;30 21 * * *&lt;/code&gt; consists of:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Position&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Minute&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;At 30 minutes past the hour&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hour&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;At 21:00 (9:30 PM)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Day of Month&lt;/td&gt;
&lt;td&gt;*&lt;/td&gt;
&lt;td&gt;Every day of the month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Month&lt;/td&gt;
&lt;td&gt;*&lt;/td&gt;
&lt;td&gt;Every month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Day of Week&lt;/td&gt;
&lt;td&gt;*&lt;/td&gt;
&lt;td&gt;Every day of the week&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The command &lt;code&gt;/usr/bin/touch test_passed&lt;/code&gt; updates the timestamp of the file &lt;code&gt;test_passed&lt;/code&gt; in the current working directory (root's home directory by default).&lt;/p&gt;

&lt;h2&gt;
  
  
  Verification Procedures
&lt;/h2&gt;

&lt;p&gt;After configuration, verify the setup using these commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Verify cronie installation&lt;/span&gt;
rpm &lt;span class="nt"&gt;-qa&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;cronie

&lt;span class="c"&gt;# Verify crond service status&lt;/span&gt;
systemctl status crond

&lt;span class="c"&gt;# Verify crond is enabled on boot&lt;/span&gt;
systemctl is-enabled crond

&lt;span class="c"&gt;# View root's crontab&lt;/span&gt;
crontab &lt;span class="nt"&gt;-l&lt;/span&gt;

&lt;span class="c"&gt;# Verify the specific cron job exists&lt;/span&gt;
crontab &lt;span class="nt"&gt;-l&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"30 21"&lt;/span&gt;

&lt;span class="c"&gt;# Check cron logs for activity&lt;/span&gt;
&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/cron

&lt;span class="c"&gt;# Check system logs for cron activity&lt;/span&gt;
journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; crond | &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-20&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Expected Output
&lt;/h2&gt;

&lt;p&gt;Upon successful execution, the system should display:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Package cronie-1.5.2-4.el8.x86_64 already installed and latest version
Nothing to do

Created symlink from /etc/systemd/system/multi-user.target.wants/crond.service to /usr/lib/systemd/system/crond.service.

● crond.service - Command Scheduler
&lt;/span&gt;&lt;span class="gp"&gt;   Loaded: loaded (/usr/lib/systemd/system/crond.service;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;enabled&lt;span class="p"&gt;;&lt;/span&gt; vendor preset: enabled&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;   Active: active (running) since Sat 2026-07-19 10:00:00 UTC;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;1min ago
&lt;span class="go"&gt; Main PID: 1234 (crond)
    Tasks: 1 (limit: 512)
   Memory: 1.2M
   CGroup: /system.slice/crond.service
           └─1234 /usr/sbin/crond -n

30 21 * * * /usr/bin/touch test_passed
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Alternative Approaches
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Method 1: Direct Crontab Editing
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Open root's crontab in editor&lt;/span&gt;
crontab &lt;span class="nt"&gt;-e&lt;/span&gt;

&lt;span class="c"&gt;# Add this line:&lt;/span&gt;
30 21 &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; /usr/bin/touch test_passed

&lt;span class="c"&gt;# Save and exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Method 2: Using /etc/crontab
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Add to system-wide crontab&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"30 21 * * * root /usr/bin/touch test_passed"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/crontab
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Method 3: Using Cron Directory
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create a file in cron.d directory&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"30 21 * * * root /usr/bin/touch test_passed"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /etc/cron.d/test_passed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Method 4: Preserving Existing Crontab
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Backup existing crontab, add new job, restore&lt;/span&gt;
crontab &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /tmp/crontab_backup 2&amp;gt;/dev/null
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"30 21 * * * /usr/bin/touch test_passed"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /tmp/crontab_backup
crontab /tmp/crontab_backup
&lt;span class="nb"&gt;rm&lt;/span&gt; /tmp/crontab_backup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Issue 1: Package Not Found
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Search for available cron packages&lt;/span&gt;
yum search cronie

&lt;span class="c"&gt;# Try alternative package names&lt;/span&gt;
yum &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; vixie-cron crontabs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Issue 2: Service Start Failure
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check service logs&lt;/span&gt;
journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; crond &lt;span class="nt"&gt;-n&lt;/span&gt; 50

&lt;span class="c"&gt;# Reload systemd&lt;/span&gt;
systemctl daemon-reload

&lt;span class="c"&gt;# Check service unit file&lt;/span&gt;
systemctl &lt;span class="nb"&gt;cat &lt;/span&gt;crond
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Issue 3: Crontab Command Not Found
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install crontabs package&lt;/span&gt;
yum &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; crontabs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Issue 4: Cron Job Not Executing
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Verify crond is running&lt;/span&gt;
systemctl status crond

&lt;span class="c"&gt;# Check logs for errors&lt;/span&gt;
&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/cron

&lt;span class="c"&gt;# Verify command path&lt;/span&gt;
which &lt;span class="nb"&gt;touch&lt;/span&gt;

&lt;span class="c"&gt;# Use absolute path in cron command&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Issue 5: Permission Denied
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Use sudo for all operations&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;crontab &lt;span class="nt"&gt;-e&lt;/span&gt;

&lt;span class="c"&gt;# Or switch to root&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;su -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Issue 6: File Not Created
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Use absolute path in command&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"30 21 * * * /usr/bin/touch /root/test_passed"&lt;/span&gt; | crontab -

&lt;span class="c"&gt;# Verify working directory&lt;/span&gt;
crontab &lt;span class="nt"&gt;-l&lt;/span&gt; | &lt;span class="nb"&gt;grep touch&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Cron Locations Reference
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Location&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/etc/crontab&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;System-wide crontab file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/etc/cron.d/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Directory for system crontab files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/etc/cron.hourly/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Scripts executed every hour&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/etc/cron.daily/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Scripts executed daily&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/etc/cron.weekly/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Scripts executed weekly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/etc/cron.monthly/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Scripts executed monthly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/var/spool/cron/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;User-specific crontab files&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Automated Script
&lt;/h2&gt;

&lt;p&gt;For repeatable deployments, save this as &lt;code&gt;setup_cron.sh&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Configuring Cron Job on Storage Server"&lt;/span&gt;

ssh natasha@ststor01 &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
echo 'Bl@kW' | sudo -S bash -c '
echo "Installing cronie"
yum install -y cronie

echo "Starting and enabling crond"
systemctl start crond
systemctl enable crond

echo "Service Status"
systemctl status crond | grep -E "Active|Loaded"

echo "Adding cron job"
(crontab -l 2&amp;gt;/dev/null; echo "30 21 * * * /usr/bin/touch test_passed") | crontab -

echo "Current Crontab"
crontab -l

echo "Verification"
crontab -l | grep -q "30 21 &lt;/span&gt;&lt;span class="se"&gt;\*&lt;/span&gt;&lt;span class="sh"&gt; &lt;/span&gt;&lt;span class="se"&gt;\*&lt;/span&gt;&lt;span class="sh"&gt; &lt;/span&gt;&lt;span class="se"&gt;\*&lt;/span&gt;&lt;span class="sh"&gt; /usr/bin/touch test_passed" &amp;amp;&amp;amp; echo "Cron job added successfully" || echo "Cron job not found"
'
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make the script executable and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x setup_cron.sh
./setup_cron.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;The cron job has been successfully configured on the Nautilus Storage Server (ststor01) with the following specifications:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Package&lt;/strong&gt;: cronie installed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service&lt;/strong&gt;: crond running and enabled on boot&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cron Job&lt;/strong&gt;: &lt;code&gt;30 21 * * * /usr/bin/touch test_passed&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Schedule&lt;/strong&gt;: Every day at 21:30 (9:30 PM)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Command&lt;/strong&gt;: Updates timestamp on &lt;code&gt;test_passed&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User&lt;/strong&gt;: Root user's crontab&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Status&lt;/strong&gt;: Verified and active&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The configuration has been completed successfully, and the cron job will execute daily at the specified time. The system logs can be monitored to confirm the execution of the cron job.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Creating User Mohammed on App Server 3 in Stratos Datacenter</title>
      <dc:creator>Janak Shrestha</dc:creator>
      <pubDate>Sat, 29 Aug 2026 05:34:25 +0000</pubDate>
      <link>https://dev.to/janak0ff/creating-user-mohammed-on-app-server-3-in-stratos-datacenter-3p6h</link>
      <guid>https://dev.to/janak0ff/creating-user-mohammed-on-app-server-3-in-stratos-datacenter-3p6h</guid>
      <description>&lt;h1&gt;
  
  
  Creating User Mohammed on App Server 3 in Stratos Datacenter
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Objective
&lt;/h2&gt;

&lt;p&gt;This document outlines the procedure for creating a new user account on App Server 3 (stapp03) in the Stratos Datacenter. The system administration team has specified the following requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Username: mohammed&lt;/li&gt;
&lt;li&gt;UID: 1403&lt;/li&gt;
&lt;li&gt;Home Directory: /opt/mohammed&lt;/li&gt;
&lt;li&gt;Primary Group: nautilus_admin_users&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Environment Details
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Server&lt;/strong&gt;: stapp03 (App Server 3)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Access User&lt;/strong&gt;: banner&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Access Password&lt;/strong&gt;: BigGr33n&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sudo Privileges&lt;/strong&gt;: Required&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Implementation Methods
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Method 1: One-Line Command Execution
&lt;/h3&gt;

&lt;p&gt;Execute the following command from the jump host to create the user and group with a single command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'BigGr33n'&lt;/span&gt; | ssh banner@stapp03 &lt;span class="s2"&gt;"sudo -S bash -c 'groupadd nautilus_admin_users 2&amp;gt;/dev/null; useradd -u 1403 -d /opt/mohammed -m -g nautilus_admin_users mohammed 2&amp;gt;/dev/null; id mohammed; groups mohammed; ls -ld /opt/mohammed'"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command performs the following actions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creates the group nautilus_admin_users if it does not already exist&lt;/li&gt;
&lt;li&gt;Creates the user mohammed with UID 1403, home directory /opt/mohammed, and sets nautilus_admin_users as the primary group&lt;/li&gt;
&lt;li&gt;Displays verification information for the newly created user&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Method 2: Heredoc Method
&lt;/h3&gt;

&lt;p&gt;For a more comprehensive output with detailed verification, use the heredoc approach:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh banner@stapp03 &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
echo 'BigGr33n' | sudo -S bash -c '
echo "Creating group nautilus_admin_users"
groupadd nautilus_admin_users 2&amp;gt;/dev/null || echo "Group already exists"

echo "Creating user mohammed"
useradd -u 1403 -d /opt/mohammed -m -g nautilus_admin_users mohammed 2&amp;gt;/dev/null || echo "User already exists"

echo "Verification Results:"
echo "User Details:"
id mohammed

echo "Home Directory:"
ls -ld /opt/mohammed

echo "Group Membership:"
groups mohammed

echo "User Entry in /etc/passwd:"
grep mohammed /etc/passwd

echo "Group Entry in /etc/group:"
grep nautilus_admin_users /etc/group
'
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Method 3: Interactive Session
&lt;/h3&gt;

&lt;p&gt;For manual execution, connect to the server and perform the following commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Connect to App Server 3&lt;/span&gt;
ssh banner@stapp03
&lt;span class="c"&gt;# Enter password: BigGr33n&lt;/span&gt;

&lt;span class="c"&gt;# Switch to root&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;su -
&lt;span class="c"&gt;# Enter password: BigGr33n&lt;/span&gt;

&lt;span class="c"&gt;# Create the group&lt;/span&gt;
groupadd nautilus_admin_users

&lt;span class="c"&gt;# Create the user with specified parameters&lt;/span&gt;
useradd &lt;span class="nt"&gt;-u&lt;/span&gt; 1403 &lt;span class="nt"&gt;-d&lt;/span&gt; /opt/mohammed &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; nautilus_admin_users mohammed

&lt;span class="c"&gt;# Verify the creation&lt;/span&gt;
&lt;span class="nb"&gt;id &lt;/span&gt;mohammed
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-ld&lt;/span&gt; /opt/mohammed
&lt;span class="nb"&gt;groups &lt;/span&gt;mohammed
&lt;span class="nb"&gt;grep &lt;/span&gt;mohammed /etc/passwd
&lt;span class="nb"&gt;grep &lt;/span&gt;nautilus_admin_users /etc/group

&lt;span class="c"&gt;# Exit&lt;/span&gt;
&lt;span class="nb"&gt;exit
exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Command Breakdown
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;useradd&lt;/code&gt; command uses the following parameters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-u 1403&lt;/code&gt;: Sets the user ID to 1403&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-d /opt/mohammed&lt;/code&gt;: Specifies the home directory location&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-m&lt;/code&gt;: Creates the home directory if it does not exist&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-g nautilus_admin_users&lt;/code&gt;: Sets the primary group&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mohammed&lt;/code&gt;: The username&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Verification Procedures
&lt;/h2&gt;

&lt;p&gt;After creating the user, verify the configuration using these commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Verify user exists and UID is correct&lt;/span&gt;
&lt;span class="nb"&gt;id &lt;/span&gt;mohammed

&lt;span class="c"&gt;# Verify home directory exists and ownership&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-ld&lt;/span&gt; /opt/mohammed

&lt;span class="c"&gt;# Verify group membership&lt;/span&gt;
&lt;span class="nb"&gt;groups &lt;/span&gt;mohammed

&lt;span class="c"&gt;# Verify user entry in system files&lt;/span&gt;
&lt;span class="nb"&gt;grep &lt;/span&gt;mohammed /etc/passwd

&lt;span class="c"&gt;# Verify group exists&lt;/span&gt;
getent group nautilus_admin_users
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Expected Output
&lt;/h2&gt;

&lt;p&gt;Upon successful execution, the system should display:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;uid=1403(mohammed) gid=1404(nautilus_admin_users) groups=1404(nautilus_admin_users)
drwx------ 2 mohammed nautilus_admin_users 4096 Jul 19 10:00 /opt/mohammed
mohammed : nautilus_admin_users
mohammed:x:1403:1404::/opt/mohammed:/bin/bash
nautilus_admin_users:x:1404:mohammed
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Alternative Approaches
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Manual Home Directory Creation
&lt;/h3&gt;

&lt;p&gt;If the home directory needs to be created separately:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /opt/mohammed
useradd &lt;span class="nt"&gt;-u&lt;/span&gt; 1403 &lt;span class="nt"&gt;-d&lt;/span&gt; /opt/mohammed &lt;span class="nt"&gt;-g&lt;/span&gt; nautilus_admin_users mohammed
&lt;span class="nb"&gt;chown &lt;/span&gt;mohammed:nautilus_admin_users /opt/mohammed
&lt;span class="nb"&gt;chmod &lt;/span&gt;700 /opt/mohammed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Modifying an Existing User
&lt;/h3&gt;

&lt;p&gt;If the user already exists, update their configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;usermod &lt;span class="nt"&gt;-u&lt;/span&gt; 1403 &lt;span class="nt"&gt;-d&lt;/span&gt; /opt/mohammed &lt;span class="nt"&gt;-g&lt;/span&gt; nautilus_admin_users mohammed
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /opt/mohammed
&lt;span class="nb"&gt;chown &lt;/span&gt;mohammed:nautilus_admin_users /opt/mohammed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Setting User Shell
&lt;/h3&gt;

&lt;p&gt;To specify a custom shell for the user:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;useradd &lt;span class="nt"&gt;-u&lt;/span&gt; 1403 &lt;span class="nt"&gt;-d&lt;/span&gt; /opt/mohammed &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; nautilus_admin_users &lt;span class="nt"&gt;-s&lt;/span&gt; /bin/bash mohammed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  User Already Exists
&lt;/h3&gt;

&lt;p&gt;If the user already exists, modify the existing user account:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;usermod &lt;span class="nt"&gt;-u&lt;/span&gt; 1403 &lt;span class="nt"&gt;-d&lt;/span&gt; /opt/mohammed &lt;span class="nt"&gt;-g&lt;/span&gt; nautilus_admin_users mohammed
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /opt/mohammed
&lt;span class="nb"&gt;chown &lt;/span&gt;mohammed:nautilus_admin_users /opt/mohammed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Group Already Exists
&lt;/h3&gt;

&lt;p&gt;If the group already exists, proceed with user creation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;useradd &lt;span class="nt"&gt;-u&lt;/span&gt; 1403 &lt;span class="nt"&gt;-d&lt;/span&gt; /opt/mohammed &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; nautilus_admin_users mohammed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Permission Issues
&lt;/h3&gt;

&lt;p&gt;Ensure proper sudo privileges:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;su -
&lt;span class="c"&gt;# or use sudo with the command&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;useradd &lt;span class="nt"&gt;-u&lt;/span&gt; 1403 &lt;span class="nt"&gt;-d&lt;/span&gt; /opt/mohammed &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; nautilus_admin_users mohammed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Invalid UID Error
&lt;/h3&gt;

&lt;p&gt;Verify the UID is valid and not in use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;: &lt;span class="nt"&gt;-f3&lt;/span&gt; /etc/passwd | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Home Directory Not Created
&lt;/h3&gt;

&lt;p&gt;Create and set permissions manually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /opt/mohammed
&lt;span class="nb"&gt;chown &lt;/span&gt;mohammed:nautilus_admin_users /opt/mohammed
&lt;span class="nb"&gt;chmod &lt;/span&gt;700 /opt/mohammed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Security Considerations
&lt;/h2&gt;

&lt;p&gt;After creating the user, consider implementing these additional security measures:&lt;/p&gt;

&lt;h3&gt;
  
  
  Set User Password
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;passwd mohammed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configure Password Expiry
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;chage &lt;span class="nt"&gt;-E&lt;/span&gt; 2027-12-31 mohammed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Set Appropriate Home Directory Permissions
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod &lt;/span&gt;700 /opt/mohammed
&lt;span class="nb"&gt;chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; mohammed:nautilus_admin_users /opt/mohammed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Restrict Shell Access
&lt;/h3&gt;

&lt;p&gt;For service accounts, set a restricted shell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;usermod &lt;span class="nt"&gt;-s&lt;/span&gt; /sbin/nologin mohammed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Automated Script
&lt;/h2&gt;

&lt;p&gt;For repeatable deployments, save this as &lt;code&gt;create_user.sh&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Creating User mohammed on App Server 3"&lt;/span&gt;

ssh banner@stapp03 &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
echo 'BigGr33n' | sudo -S bash -c '
groupadd nautilus_admin_users 2&amp;gt;/dev/null
useradd -u 1403 -d /opt/mohammed -m -g nautilus_admin_users mohammed 2&amp;gt;/dev/null

echo "Verification Results:"
id mohammed
ls -ld /opt/mohammed
groups mohammed
grep mohammed /etc/passwd
grep nautilus_admin_users /etc/group
'
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make the script executable and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x create_user.sh
./create_user.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;The user mohammed has been successfully created on App Server 3 (stapp03) in the Stratos Datacenter. The configuration includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Username: mohammed&lt;/li&gt;
&lt;li&gt;UID: 1403&lt;/li&gt;
&lt;li&gt;Home Directory: /opt/mohammed&lt;/li&gt;
&lt;li&gt;Primary Group: nautilus_admin_users&lt;/li&gt;
&lt;li&gt;Shell: /bin/bash (default)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The home directory has been created with appropriate ownership and permissions. The user is now ready for use on App Server 3 with all specified requirements satisfied. Verification commands confirm the user exists, the UID is correct, the home directory is properly configured, and the user is a member of the correct group.&lt;/p&gt;

</description>
      <category>linux</category>
    </item>
    <item>
      <title>SElinux Installation and Configuration</title>
      <dc:creator>Janak Shrestha</dc:creator>
      <pubDate>Sat, 29 Aug 2026 05:29:11 +0000</pubDate>
      <link>https://dev.to/janak0ff/selinux-installation-and-configuration-5aca</link>
      <guid>https://dev.to/janak0ff/selinux-installation-and-configuration-5aca</guid>
      <description>&lt;p&gt;Following a security audit, the xFusionCorp Industries security team has opted to enhance application and server security with SELinux. To initiate testing, the following requirements have been established for App server 2 in the Stratos Datacenter:&lt;/p&gt;

&lt;p&gt;Install the required SELinux packages.&lt;/p&gt;

&lt;p&gt;Permanently disable SELinux for the time being; it will be re-enabled after necessary configuration changes.&lt;/p&gt;

&lt;p&gt;No need to reboot the server, as a scheduled maintenance reboot is already planned for tonight.&lt;/p&gt;

&lt;p&gt;Disregard the current status of SELinux via the command line; the final status after the reboot should be disabled.&lt;/p&gt;




&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Connect to App Server 2 (stapp02)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh steve@stapp02
&lt;span class="c"&gt;# Password: Am3ric@&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Switch to root or use sudo
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;su -
&lt;span class="c"&gt;# Password: Am3ric@&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Install SELinux packages (if not already installed)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check if SELinux packages are installed&lt;/span&gt;
rpm &lt;span class="nt"&gt;-qa&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;selinux

&lt;span class="c"&gt;# Install SELinux packages&lt;/span&gt;
yum &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; selinux-policy selinux-policy-targeted libselinux-utils
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Check current SELinux status
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check current SELinux status&lt;/span&gt;
getenforce
sestatus
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5: Permanently disable SELinux
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Edit the SELinux configuration file&lt;/span&gt;
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'s/SELINUX=enforcing/SELINUX=disabled/g'&lt;/span&gt; /etc/selinux/config
&lt;span class="c"&gt;# or&lt;/span&gt;
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'s/SELINUX=permissive/SELINUX=disabled/g'&lt;/span&gt; /etc/selinux/config

&lt;span class="c"&gt;# If SELINUX line doesn't exist, add it&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="s2"&gt;"^SELINUX="&lt;/span&gt; /etc/selinux/config &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"SELINUX=disabled"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/selinux/config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 6: Verify the configuration
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check the config file&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/selinux/config

&lt;span class="c"&gt;# Verify SELINUX is set to disabled&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"^SELINUX="&lt;/span&gt; /etc/selinux/config

&lt;span class="c"&gt;# Current status (will still show enforcing/permissive until reboot)&lt;/span&gt;
getenforce
sestatus
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 7: Set SELinux to permissive mode (optional, for testing)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# This makes the system permissive until reboot&lt;/span&gt;
setenforce 0

&lt;span class="c"&gt;# Verify it's now permissive&lt;/span&gt;
getenforce
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Complete One-Line Commands
&lt;/h2&gt;

&lt;h3&gt;
  
  
  From jump host with password:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Am3ric@'&lt;/span&gt; | ssh steve@stapp02 &lt;span class="s2"&gt;"sudo -S bash -c 'yum install -y selinux-policy selinux-policy-targeted libselinux-utils &amp;amp;&amp;amp; sed -i &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;s/SELINUX=enforcing/SELINUX=disabled/g&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; /etc/selinux/config &amp;amp;&amp;amp; sed -i &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;s/SELINUX=permissive/SELINUX=disabled/g&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; /etc/selinux/config &amp;amp;&amp;amp; grep SELINUX= /etc/selinux/config'"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Using heredoc (Recommended):
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh steve@stapp02 &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
echo 'Am3ric@' | sudo -S bash -c '
echo "=== Installing SELinux packages ==="
yum install -y selinux-policy selinux-policy-targeted libselinux-utils

echo ""
echo "=== Current SELinux status ==="
getenforce
sestatus

echo ""
echo "=== Configuring SELinux to be disabled ==="
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
sed -i "s/SELINUX=permissive/SELINUX=disabled/g" /etc/selinux/config

# Ensure SELINUX is set to disabled
if ! grep -q "^SELINUX=disabled" /etc/selinux/config; then
    sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config
fi

echo ""
echo "=== Verifying configuration ==="
grep "^SELINUX=" /etc/selinux/config

echo ""
echo "=== Setting SELinux to permissive mode (current session) ==="
setenforce 0

echo ""
echo "=== Current SELinux status (will be permissive until reboot) ==="
getenforce

echo ""
echo "✅ SELinux has been permanently disabled"
echo "⚠️  Current status: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;getenforce&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt; (will change to disabled after reboot)"
echo "ℹ️  Configuration file: /etc/selinux/config"
echo "ℹ️  SELINUX=disabled will take effect after reboot"
'
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step-by-Step Interactive Commands
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Connect to stapp02&lt;/span&gt;
ssh steve@stapp02
&lt;span class="c"&gt;# Enter password: Am3ric@&lt;/span&gt;

&lt;span class="c"&gt;# Become root&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;su -
&lt;span class="c"&gt;# Enter password: Am3ric@&lt;/span&gt;

&lt;span class="c"&gt;# Step 1: Check if SELinux packages are installed&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== Checking SELinux packages ==="&lt;/span&gt;
rpm &lt;span class="nt"&gt;-qa&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;selinux

&lt;span class="c"&gt;# Step 2: Install SELinux packages&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== Installing SELinux packages ==="&lt;/span&gt;
yum &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; selinux-policy selinux-policy-targeted libselinux-utils

&lt;span class="c"&gt;# Step 3: Check current SELinux status&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== Current SELinux status ==="&lt;/span&gt;
getenforce
sestatus

&lt;span class="c"&gt;# Step 4: View current SELinux config&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== Current SELinux config ==="&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/selinux/config

&lt;span class="c"&gt;# Step 5: Permanently disable SELinux&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== Disabling SELinux permanently ==="&lt;/span&gt;
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'s/SELINUX=enforcing/SELINUX=disabled/g'&lt;/span&gt; /etc/selinux/config
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'s/SELINUX=permissive/SELINUX=disabled/g'&lt;/span&gt; /etc/selinux/config

&lt;span class="c"&gt;# If the line doesn't exist, add it&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="s2"&gt;"^SELINUX="&lt;/span&gt; /etc/selinux/config&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"SELINUX=disabled"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/selinux/config
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# Step 6: Verify the configuration&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== Verified SELinux config ==="&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"^SELINUX="&lt;/span&gt; /etc/selinux/config

&lt;span class="c"&gt;# Step 7: Set SELinux to permissive for current session (optional)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== Setting SELinux to permissive mode (current session) ==="&lt;/span&gt;
setenforce 0

&lt;span class="c"&gt;# Step 8: Check current status&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== Current SELinux status ==="&lt;/span&gt;
getenforce
sestatus

&lt;span class="c"&gt;# Step 9: Show final configuration&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== Final configuration ==="&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"SELINUX is set to: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; ^SELINUX&lt;span class="o"&gt;=&lt;/span&gt; /etc/selinux/config | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nt"&gt;-f2&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Current SELinux mode: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;getenforce&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Exit back&lt;/span&gt;
&lt;span class="nb"&gt;exit
exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Expected Output
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;root@stapp02 ~]# yum &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; selinux-policy selinux-policy-targeted libselinux-utils
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Package selinux-policy-3.14.3-80.el8.noarch already installed and latest version
Package selinux-policy-targeted-3.14.3-80.el8.noarch already installed and latest version
Package libselinux-utils-2.9-5.el8.x86_64 already installed and latest version
Nothing to &lt;span class="k"&gt;do&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt;root@stapp02 ~]# getenforce
Enforcing

&lt;span class="o"&gt;[&lt;/span&gt;root@stapp02 ~]# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Memory protection checking:     actual &lt;span class="o"&gt;(&lt;/span&gt;secure&lt;span class="o"&gt;)&lt;/span&gt;
Max kernel policy version:      33

&lt;span class="o"&gt;[&lt;/span&gt;root@stapp02 ~]# &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'s/SELINUX=enforcing/SELINUX=disabled/g'&lt;/span&gt; /etc/selinux/config

&lt;span class="o"&gt;[&lt;/span&gt;root@stapp02 ~]# &lt;span class="nb"&gt;grep&lt;/span&gt; ^SELINUX&lt;span class="o"&gt;=&lt;/span&gt; /etc/selinux/config
&lt;span class="nv"&gt;SELINUX&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;disabled

&lt;span class="o"&gt;[&lt;/span&gt;root@stapp02 ~]# setenforce 0
&lt;span class="o"&gt;[&lt;/span&gt;root@stapp02 ~]# getenforce
Permissive

&lt;span class="o"&gt;[&lt;/span&gt;root@stapp02 ~]# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   permissive
Mode from config file:          disabled
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Memory protection checking:     actual &lt;span class="o"&gt;(&lt;/span&gt;secure&lt;span class="o"&gt;)&lt;/span&gt;
Max kernel policy version:      33
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Alternative Methods
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Method 1: Using echo to overwrite (if using a different approach)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Update the config file directly&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"SELINUX=disabled"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /etc/selinux/config
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"SELINUXTYPE=targeted"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/selinux/config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Method 2: Using sed with backup
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create backup and modify&lt;/span&gt;
&lt;span class="nb"&gt;cp&lt;/span&gt; /etc/selinux/config /etc/selinux/config.backup
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'s/SELINUX=enforcing/SELINUX=disabled/g'&lt;/span&gt; /etc/selinux/config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Method 3: Using awk to replace
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'/^SELINUX=/ {print "SELINUX=disabled"; next} {print}'&lt;/span&gt; /etc/selinux/config &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /tmp/selinux_config
&lt;span class="nb"&gt;mv&lt;/span&gt; /tmp/selinux_config /etc/selinux/config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Method 4: Using systemd to disable SELinux (alternative)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Add kernel parameter to disable SELinux&lt;/span&gt;
grubby &lt;span class="nt"&gt;--update-kernel&lt;/span&gt; ALL &lt;span class="nt"&gt;--args&lt;/span&gt; &lt;span class="s2"&gt;"selinux=0"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Verification Commands
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Check SELinux config file&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/selinux/config | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"^SELINUX=|^SELINUXTYPE="&lt;/span&gt;

&lt;span class="c"&gt;# 2. Check current SELinux status&lt;/span&gt;
getenforce
sestatus

&lt;span class="c"&gt;# 3. Check SELinux packages&lt;/span&gt;
rpm &lt;span class="nt"&gt;-qa&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;selinux

&lt;span class="c"&gt;# 4. Check kernel boot parameters (for future verification)&lt;/span&gt;
grubby &lt;span class="nt"&gt;--info&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ALL | &lt;span class="nb"&gt;grep &lt;/span&gt;selinux

&lt;span class="c"&gt;# 5. Check if SELinux is disabled in the config&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="s2"&gt;"^SELINUX=disabled"&lt;/span&gt; /etc/selinux/config &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"SELINUX is disabled in config"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"SELINUX is not disabled in config"&lt;/span&gt;

&lt;span class="c"&gt;# 6. Check current mode and config mode&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Current mode: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;getenforce&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Config mode: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; ^SELINUX&lt;span class="o"&gt;=&lt;/span&gt; /etc/selinux/config | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nt"&gt;-f2&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# 7. Verify no reboot is needed for config change&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Configuration updated. Reboot needed for full disable."&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Current session is in &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;getenforce&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; mode."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Understanding SELinux Modes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Behavior&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Enforcing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SELinux is active and enforcing security policies&lt;/td&gt;
&lt;td&gt;Access denied if not allowed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Permissive&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SELinux is active but only logs violations&lt;/td&gt;
&lt;td&gt;Access allowed, but violations logged&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Disabled&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SELinux is completely turned off&lt;/td&gt;
&lt;td&gt;No SELinux checks or logging&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  SELinux Status Overview
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# View the current SELinux status&lt;/span&gt;
getenforce

&lt;span class="c"&gt;# View detailed SELinux status&lt;/span&gt;
sestatus

&lt;span class="c"&gt;# View SELinux config file&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/selinux/config

&lt;span class="c"&gt;# Explanation of the config file:&lt;/span&gt;
&lt;span class="c"&gt;# SELINUX=enforcing|permissive|disabled  - Sets the mode&lt;/span&gt;
&lt;span class="c"&gt;# SELINUXTYPE=targeted|mls|minimum       - Sets the policy type&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;"No package selinux-policy available"&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# Try installing with different package names&lt;/span&gt;
   yum &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; selinux-policy-targeted selinux-policy
   &lt;span class="c"&gt;# For Ubuntu/Debian&lt;/span&gt;
   apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; selinux-basics selinux-policy-default
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;"Permission denied" when editing config&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# Use sudo or become root&lt;/span&gt;
   &lt;span class="nb"&gt;sudo &lt;/span&gt;su -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;"setenforce: SELinux is disabled"&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# SELinux is already disabled in config, but currently in enforcing/permissive&lt;/span&gt;
   &lt;span class="c"&gt;# Just reboot to fully disable&lt;/span&gt;
   &lt;span class="c"&gt;# Or set to permissive temporarily&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Config changes not taking effect&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# Check the config file content&lt;/span&gt;
   &lt;span class="nb"&gt;cat&lt;/span&gt; /etc/selinux/config
   &lt;span class="c"&gt;# Ensure there are no duplicate entries&lt;/span&gt;
   &lt;span class="c"&gt;# If duplicate, remove old entries&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Need to temporarily re-enable SELinux&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# To test with SELinux enabled temporarily&lt;/span&gt;
   setenforce 1
   &lt;span class="c"&gt;# Or permanently enable&lt;/span&gt;
   &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'s/SELINUX=disabled/SELINUX=enforcing/g'&lt;/span&gt; /etc/selinux/config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Complete Script (Run from Jump Host)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Installing SELinux and Disabling it Permanently"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;

ssh steve@stapp02 &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
echo 'Am3ric@' | sudo -S bash -c '
echo ""
echo "=== Step 1: Installing SELinux Packages ==="
yum install -y selinux-policy selinux-policy-targeted libselinux-utils

echo ""
echo "=== Step 2: Checking Current Status ==="
echo "Current mode: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;getenforce&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"
echo "Config mode: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; ^SELINUX&lt;span class="o"&gt;=&lt;/span&gt; /etc/selinux/config 2&amp;gt;/dev/null | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nt"&gt;-f2&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"

echo ""
echo "=== Step 3: Disabling SELinux Permanently ==="
# Backup original config
cp /etc/selinux/config /etc/selinux/config.backup

# Modify SELINUX setting
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
sed -i "s/SELINUX=permissive/SELINUX=disabled/g" /etc/selinux/config

# Ensure it's set to disabled
if ! grep -q "^SELINUX=disabled" /etc/selinux/config; then
    sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config
fi

echo ""
echo "=== Step 4: Verifying Configuration ==="
grep ^SELINUX= /etc/selinux/config

echo ""
echo "=== Step 5: Setting Current Session to Permissive ==="
setenforce 0

echo ""
echo "=== Step 6: Final Status ==="
echo "Current mode: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;getenforce&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"
echo "Config mode: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; ^SELINUX&lt;span class="o"&gt;=&lt;/span&gt; /etc/selinux/config | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nt"&gt;-f2&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"

echo ""
echo "========================================="
echo "✅ SELinux configuration completed!"
echo "📌 Current mode: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;getenforce&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"
echo "📌 After reboot: Disabled"
echo "📌 Config file: /etc/selinux/config"
echo "📌 Backup file: /etc/selinux/config.backup"
echo "========================================="
'
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make it executable and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x setup_selinux.sh
./setup_selinux.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Important Notes
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;No reboot required&lt;/strong&gt;: The task specifically says no reboot is needed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Current vs After Reboot&lt;/strong&gt;: 

&lt;ul&gt;
&lt;li&gt;Current status may still show &lt;code&gt;enforcing&lt;/code&gt; or &lt;code&gt;permissive&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;After reboot, SELinux will be fully &lt;code&gt;disabled&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Setenforce 0&lt;/strong&gt;: This sets SELinux to permissive mode until reboot&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configuration file&lt;/strong&gt;: &lt;code&gt;/etc/selinux/config&lt;/code&gt; controls the permanent setting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backup created&lt;/strong&gt;: Always good to backup configuration before changes&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Complete Solution Summary
&lt;/h2&gt;

&lt;p&gt;SELinux has been configured on &lt;strong&gt;App Server 2 (stapp02)&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;SELinux packages installed&lt;/strong&gt;: &lt;code&gt;selinux-policy&lt;/code&gt;, &lt;code&gt;selinux-policy-targeted&lt;/code&gt;, &lt;code&gt;libselinux-utils&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Configuration updated&lt;/strong&gt;: &lt;code&gt;/etc/selinux/config&lt;/code&gt; set to &lt;code&gt;SELINUX=disabled&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Current session set to permissive&lt;/strong&gt;: &lt;code&gt;setenforce 0&lt;/code&gt; (optional but helpful)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Verified configuration&lt;/strong&gt;: &lt;code&gt;grep ^SELINUX= /etc/selinux/config&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;No reboot performed&lt;/strong&gt;: As per requirements&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;After reboot&lt;/strong&gt;: SELinux will be completely disabled&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The server is now configured with SELinux packages installed and permanently disabled. After tonight's scheduled maintenance reboot, SELinux will be fully disabled on App Server 2.&lt;/p&gt;

</description>
      <category>linux</category>
    </item>
    <item>
      <title>Process Limit Adjustment</title>
      <dc:creator>Janak Shrestha</dc:creator>
      <pubDate>Sat, 29 Aug 2026 05:26:42 +0000</pubDate>
      <link>https://dev.to/janak0ff/process-limit-adjustment-2hbm</link>
      <guid>https://dev.to/janak0ff/process-limit-adjustment-2hbm</guid>
      <description>&lt;p&gt;In the Stratos Datacenter, our application server 1 is encountering performance degradation due to excessive processes held by the nfsuser user. To mitigate this issue, we need to enforce limitations on its maximum processes. Please set the maximum process limits as specified below:&lt;/p&gt;

&lt;p&gt;a. Set the soft limit to 1025&lt;br&gt;
b. Set the hard limit to 2027&lt;/p&gt;


&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Step 1: Connect to App Server 1 (stapp01)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh tony@stapp01
&lt;span class="c"&gt;# Password: Ir0nM@n&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 2: Switch to root or use sudo
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;su -
&lt;span class="c"&gt;# Password: Ir0nM@n&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 3: Check current limits for nfsuser
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check current process limits for nfsuser&lt;/span&gt;
su - nfsuser &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"ulimit -u"&lt;/span&gt;

&lt;span class="c"&gt;# Check all limits for nfsuser&lt;/span&gt;
su - nfsuser &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"ulimit -a"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 4: Set limits in /etc/security/limits.conf
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Add limits for nfsuser&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"nfsuser soft nproc 1025"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/security/limits.conf
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"nfsuser hard nproc 2027"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/security/limits.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 5: Verify the configuration
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check the limits.conf file&lt;/span&gt;
&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-5&lt;/span&gt; /etc/security/limits.conf

&lt;span class="c"&gt;# Verify the limits are applied (may need new session)&lt;/span&gt;
su - nfsuser &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"ulimit -u"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Complete One-Line Commands
&lt;/h2&gt;
&lt;h3&gt;
  
  
  From jump host with password:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Ir0nM@n'&lt;/span&gt; | ssh tony@stapp01 &lt;span class="s2"&gt;"sudo -S bash -c 'echo &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;nfsuser soft nproc 1025&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; &amp;gt;&amp;gt; /etc/security/limits.conf &amp;amp;&amp;amp; echo &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;nfsuser hard nproc 2027&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; &amp;gt;&amp;gt; /etc/security/limits.conf &amp;amp;&amp;amp; tail -5 /etc/security/limits.conf'"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Using heredoc (Recommended):
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh tony@stapp01 &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
echo 'Ir0nM@n' | sudo -S bash -c '
echo "=== Current limits for nfsuser ==="
su - nfsuser -c "ulimit -u"

echo ""
echo "=== Adding limits to /etc/security/limits.conf ==="
echo "nfsuser soft nproc 1025" &amp;gt;&amp;gt; /etc/security/limits.conf
echo "nfsuser hard nproc 2027" &amp;gt;&amp;gt; /etc/security/limits.conf

echo ""
echo "=== Verifying limits.conf ==="
tail -5 /etc/security/limits.conf

echo ""
echo "=== Verifying new limits for nfsuser ==="
su - nfsuser -c "ulimit -u"
'
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Step-by-Step Interactive Commands
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Connect to stapp01&lt;/span&gt;
ssh tony@stapp01
&lt;span class="c"&gt;# Enter password: Ir0nM@n&lt;/span&gt;

&lt;span class="c"&gt;# Become root&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;su -
&lt;span class="c"&gt;# Enter password: Ir0nM@n&lt;/span&gt;

&lt;span class="c"&gt;# Step 1: Check current limits&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== Current process limits for nfsuser ==="&lt;/span&gt;
su - nfsuser &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"ulimit -u"&lt;/span&gt;

&lt;span class="c"&gt;# Step 2: View current limits.conf&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== Current /etc/security/limits.conf ==="&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/security/limits.conf

&lt;span class="c"&gt;# Step 3: Add soft limit (1025) and hard limit (2027)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== Adding limits for nfsuser ==="&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"nfsuser soft nproc 1025"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/security/limits.conf
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"nfsuser hard nproc 2027"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/security/limits.conf

&lt;span class="c"&gt;# Step 4: Verify the entries&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== New entries in limits.conf ==="&lt;/span&gt;
&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-5&lt;/span&gt; /etc/security/limits.conf

&lt;span class="c"&gt;# Step 5: Check if limits are applied&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== Verifying limits for nfsuser ==="&lt;/span&gt;
su - nfsuser &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"ulimit -u"&lt;/span&gt;

&lt;span class="c"&gt;# Step 6: Check all limits for nfsuser&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== All limits for nfsuser ==="&lt;/span&gt;
su - nfsuser &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"ulimit -a"&lt;/span&gt;

&lt;span class="c"&gt;# Exit back&lt;/span&gt;
&lt;span class="nb"&gt;exit
exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Alternative Configuration Methods
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Method 1: Using /etc/security/limits.d/ (Recommended for modular config)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create a separate file for nfsuser limits&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"nfsuser soft nproc 1025"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /etc/security/limits.d/nfsuser.conf
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"nfsuser hard nproc 2027"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/security/limits.d/nfsuser.conf

&lt;span class="c"&gt;# Verify&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/security/limits.d/nfsuser.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Method 2: Using PAM configuration (for system-wide)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check PAM configuration&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/pam.d/system-auth | &lt;span class="nb"&gt;grep &lt;/span&gt;pam_limits
&lt;span class="c"&gt;# Ensure pam_limits.so is included&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Method 3: Using systemd user limits (for services)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# For systemd services, create drop-in directory&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /etc/systemd/system/user@.service.d/
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[Service]"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /etc/systemd/system/user@.service.d/limits.conf
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"TasksMax=2027"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/systemd/system/user@.service.d/limits.conf
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"LimitNPROC=2027"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/systemd/system/user@.service.d/limits.conf
systemctl daemon-reload
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Verification Commands
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Check limits.conf&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"^nfsuser"&lt;/span&gt; /etc/security/limits.conf

&lt;span class="c"&gt;# 2. Check limits.d directory&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /etc/security/limits.d/
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/security/limits.d/nfsuser.conf 2&amp;gt;/dev/null

&lt;span class="c"&gt;# 3. Check limits for nfsuser (as nfsuser)&lt;/span&gt;
su - nfsuser &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"ulimit -u"&lt;/span&gt;
&lt;span class="c"&gt;# Should show: 1025 (soft limit)&lt;/span&gt;

&lt;span class="c"&gt;# 4. Check hard limit as nfsuser&lt;/span&gt;
su - nfsuser &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"ulimit -u -H"&lt;/span&gt;
&lt;span class="c"&gt;# Should show: 2027 (hard limit)&lt;/span&gt;

&lt;span class="c"&gt;# 5. Check all limits for nfsuser&lt;/span&gt;
su - nfsuser &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"ulimit -a"&lt;/span&gt;

&lt;span class="c"&gt;# 6. Check current processes for nfsuser&lt;/span&gt;
ps &lt;span class="nt"&gt;-u&lt;/span&gt; nfsuser | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;

&lt;span class="c"&gt;# 7. Check if limits are applied&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/sys/kernel/threads-max  &lt;span class="c"&gt;# System-wide max threads&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Understanding ulimit Options
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-u&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Maximum number of user processes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-H&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hard limit (cannot be increased)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-S&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Soft limit (can be increased up to hard limit)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-a&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Show all current limits&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Soft vs Hard Limits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Soft Limit&lt;/strong&gt;: The current limit that can be increased by the user up to the hard limit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hard Limit&lt;/strong&gt;: The maximum limit that cannot be exceeded, set by root&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Expected Output
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;root@stapp01 ~]# su - nfsuser &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"ulimit -u"&lt;/span&gt;
1024

&lt;span class="o"&gt;[&lt;/span&gt;root@stapp01 ~]# &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"nfsuser soft nproc 1025"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/security/limits.conf
&lt;span class="o"&gt;[&lt;/span&gt;root@stapp01 ~]# &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"nfsuser hard nproc 2027"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/security/limits.conf

&lt;span class="o"&gt;[&lt;/span&gt;root@stapp01 ~]# &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-5&lt;/span&gt; /etc/security/limits.conf
&lt;span class="c"&gt;# End of file&lt;/span&gt;
nfsuser soft &lt;span class="nb"&gt;nproc &lt;/span&gt;1025
nfsuser hard &lt;span class="nb"&gt;nproc &lt;/span&gt;2027

&lt;span class="o"&gt;[&lt;/span&gt;root@stapp01 ~]# su - nfsuser &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"ulimit -u"&lt;/span&gt;
1025

&lt;span class="o"&gt;[&lt;/span&gt;root@stapp01 ~]# su - nfsuser &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"ulimit -u -H"&lt;/span&gt;
2027
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;"su: user nfsuser does not exist"&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# Create the user first&lt;/span&gt;
   useradd nfsuser
   &lt;span class="c"&gt;# Then set limits&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Limits not being applied&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# Check PAM configuration&lt;/span&gt;
   &lt;span class="nb"&gt;grep &lt;/span&gt;pam_limits.so /etc/pam.d/system-auth
   &lt;span class="c"&gt;# Ensure session required pam_limits.so is present&lt;/span&gt;

   &lt;span class="c"&gt;# Restart the session or login again&lt;/span&gt;
   su - nfsuser
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;"Permission denied"&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# Use sudo or become root&lt;/span&gt;
   &lt;span class="nb"&gt;sudo &lt;/span&gt;su -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Check if limits are too low&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# Check current usage&lt;/span&gt;
   ps &lt;span class="nt"&gt;-u&lt;/span&gt; nfsuser &lt;span class="nt"&gt;--no-headers&lt;/span&gt; | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
   &lt;span class="c"&gt;# Ensure limit is higher than current usage&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Apply limits without reboot&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# For existing sessions, need to re-login&lt;/span&gt;
   pkill &lt;span class="nt"&gt;-u&lt;/span&gt; nfsuser
   &lt;span class="c"&gt;# Or restart services&lt;/span&gt;
   systemctl restart &lt;span class="o"&gt;[&lt;/span&gt;service-name]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Complete Script (Run from Jump Host)
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Setting Process Limits for nfsuser"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;

ssh tony@stapp01 &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
echo 'Ir0nM@n' | sudo -S bash -c '
echo ""
echo "=== Current Limits ==="
su - nfsuser -c "ulimit -u"

echo ""
echo "=== Adding limits to limits.conf ==="
if grep -q "^nfsuser" /etc/security/limits.conf; then
    echo "Removing existing nfsuser entries..."
    sed -i '/^nfsuser/d' /etc/security/limits.conf
fi

echo "nfsuser soft nproc 1025" &amp;gt;&amp;gt; /etc/security/limits.conf
echo "nfsuser hard nproc 2027" &amp;gt;&amp;gt; /etc/security/limits.conf

echo ""
echo "=== New limits in limits.conf ==="
grep ^nfsuser /etc/security/limits.conf

echo ""
echo "=== Verifying Limits ==="
echo "Soft limit: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;su - nfsuser &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"ulimit -u"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"
echo "Hard limit: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;su - nfsuser &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"ulimit -u -H"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"

echo ""
echo "✅ Process limits set successfully!"
'
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Make it executable and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x set_process_limits.sh
./set_process_limits.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Important Notes
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;New sessions required&lt;/strong&gt;: Limits are applied only to new login sessions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Existing processes&lt;/strong&gt;: Running processes won't be affected&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User must exist&lt;/strong&gt;: Ensure &lt;code&gt;nfsuser&lt;/code&gt; user exists before setting limits&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Systemd services&lt;/strong&gt;: For systemd services, additional configuration may be needed&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Complete Solution Summary
&lt;/h2&gt;

&lt;p&gt;The process limits for &lt;code&gt;nfsuser&lt;/code&gt; have been configured on &lt;strong&gt;App Server 1 (stapp01)&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Soft limit&lt;/strong&gt;: 1025 (&lt;code&gt;nfsuser soft nproc 1025&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Hard limit&lt;/strong&gt;: 2027 (&lt;code&gt;nfsuser hard nproc 2027&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;✅ Configuration added to &lt;code&gt;/etc/security/limits.conf&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;✅ Verified using &lt;code&gt;ulimit -u&lt;/code&gt; and &lt;code&gt;ulimit -u -H&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;✅ Limits will apply to new sessions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These limits will prevent the &lt;code&gt;nfsuser&lt;/code&gt; user from creating excessive processes, mitigating the performance degradation issue on Application Server 1.&lt;/p&gt;

</description>
      <category>linux</category>
    </item>
    <item>
      <title>Firewall Configuration</title>
      <dc:creator>Janak Shrestha</dc:creator>
      <pubDate>Sat, 29 Aug 2026 05:25:20 +0000</pubDate>
      <link>https://dev.to/janak0ff/firewall-configuration-n59</link>
      <guid>https://dev.to/janak0ff/firewall-configuration-n59</guid>
      <description>&lt;p&gt;The Nautilus system administrators team has rolled out a web UI application for their backup utility on the Nautilus application server 1 within the Stratos Datacenter. This application runs on port 3002and appropriate firewall rules must be configured to allow incoming traffic. To achieve this, firewalld needs to be installed and configured on the application server. To ensure proper functionality, the following requirements have been identified:&lt;/p&gt;

&lt;p&gt;Install and enable the firewalld service.&lt;br&gt;
Allow all incoming connections on port 3002/tcp.&lt;br&gt;
Ensure the zone is set to public.&lt;/p&gt;


&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Step 1: Connect to App Server 1 (stapp01)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh tony@stapp01
&lt;span class="c"&gt;# Password: Ir0nM@n&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 2: Switch to root or use sudo
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;su -
&lt;span class="c"&gt;# Password: Ir0nM@n&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 3: Install firewalld (if not already installed)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check if firewalld is installed&lt;/span&gt;
rpm &lt;span class="nt"&gt;-qa&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;firewalld

&lt;span class="c"&gt;# If not installed, install it&lt;/span&gt;
yum &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; firewalld
&lt;span class="c"&gt;# or for Ubuntu/Debian (if applicable)&lt;/span&gt;
&lt;span class="c"&gt;# apt-get install -y firewalld&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 4: Start and enable firewalld service
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Start firewalld service&lt;/span&gt;
systemctl start firewalld

&lt;span class="c"&gt;# Enable firewalld to start on boot&lt;/span&gt;
systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;firewalld

&lt;span class="c"&gt;# Verify status&lt;/span&gt;
systemctl status firewalld
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 5: Set zone to public
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check current default zone&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--get-default-zone&lt;/span&gt;

&lt;span class="c"&gt;# Set default zone to public&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--set-default-zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public

&lt;span class="c"&gt;# Verify zone&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--get-default-zone&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 6: Allow port 3002/tcp
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Add port 3002/tcp to public zone&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3002/tcp &lt;span class="nt"&gt;--permanent&lt;/span&gt;

&lt;span class="c"&gt;# Reload firewall to apply changes&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--reload&lt;/span&gt;

&lt;span class="c"&gt;# Verify the rule is added&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--list-ports&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 7: Verify all configurations
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check firewall status&lt;/span&gt;
systemctl status firewalld

&lt;span class="c"&gt;# Check default zone&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--get-default-zone&lt;/span&gt;

&lt;span class="c"&gt;# List all open ports&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--list-all&lt;/span&gt;

&lt;span class="c"&gt;# Check if port 3002 is allowed&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--query-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3002/tcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Complete One-Line Commands
&lt;/h2&gt;
&lt;h3&gt;
  
  
  From jump host with password:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Ir0nM@n'&lt;/span&gt; | ssh tony@stapp01 &lt;span class="s2"&gt;"sudo -S bash -c 'yum install -y firewalld &amp;amp;&amp;amp; systemctl start firewalld &amp;amp;&amp;amp; systemctl enable firewalld &amp;amp;&amp;amp; firewall-cmd --set-default-zone=public &amp;amp;&amp;amp; firewall-cmd --zone=public --add-port=3002/tcp --permanent &amp;amp;&amp;amp; firewall-cmd --reload &amp;amp;&amp;amp; firewall-cmd --zone=public --list-all'"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Using heredoc (Recommended):
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh tony@stapp01 &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
echo 'Ir0nM@n' | sudo -S bash -c '
echo "=== Installing firewalld ==="
yum install -y firewalld

echo "=== Starting and enabling firewalld ==="
systemctl start firewalld
systemctl enable firewalld

echo "=== Setting zone to public ==="
firewall-cmd --set-default-zone=public

echo "=== Allowing port 3002/tcp ==="
firewall-cmd --zone=public --add-port=3002/tcp --permanent
firewall-cmd --reload

echo "=== Verification ==="
firewall-cmd --zone=public --list-all
'
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Step-by-Step Interactive Commands
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Connect to stapp01&lt;/span&gt;
ssh tony@stapp01
&lt;span class="c"&gt;# Enter password: Ir0nM@n&lt;/span&gt;

&lt;span class="c"&gt;# Become root&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;su -
&lt;span class="c"&gt;# Enter password: Ir0nM@n&lt;/span&gt;

&lt;span class="c"&gt;# Step 1: Check if firewalld is installed&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== Checking if firewalld is installed ==="&lt;/span&gt;
rpm &lt;span class="nt"&gt;-qa&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;firewalld

&lt;span class="c"&gt;# Step 2: Install firewalld if not present&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== Installing firewalld ==="&lt;/span&gt;
yum &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; firewalld

&lt;span class="c"&gt;# Step 3: Start firewalld&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== Starting firewalld ==="&lt;/span&gt;
systemctl start firewalld

&lt;span class="c"&gt;# Step 4: Enable firewalld to start on boot&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== Enabling firewalld ==="&lt;/span&gt;
systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;firewalld

&lt;span class="c"&gt;# Step 5: Check firewalld status&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== Firewalld Status ==="&lt;/span&gt;
systemctl status firewalld

&lt;span class="c"&gt;# Step 6: Set default zone to public&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== Setting zone to public ==="&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--set-default-zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public
firewall-cmd &lt;span class="nt"&gt;--get-default-zone&lt;/span&gt;

&lt;span class="c"&gt;# Step 7: Allow port 3002/tcp permanently&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== Allowing port 3002/tcp ==="&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3002/tcp &lt;span class="nt"&gt;--permanent&lt;/span&gt;

&lt;span class="c"&gt;# Step 8: Reload firewall&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== Reloading firewall ==="&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--reload&lt;/span&gt;

&lt;span class="c"&gt;# Step 9: Verify port is open&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== Verifying open ports ==="&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--list-ports&lt;/span&gt;

&lt;span class="c"&gt;# Step 10: Show complete configuration&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== Complete Firewall Configuration ==="&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--list-all&lt;/span&gt;

&lt;span class="c"&gt;# Exit&lt;/span&gt;
&lt;span class="nb"&gt;exit
exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Expected Output
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;root@stapp01 ~]# yum &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; firewalld
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Package firewalld-0.9.3-13.el8.noarch already installed and latest version
Nothing to &lt;span class="k"&gt;do&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt;root@stapp01 ~]# systemctl start firewalld
&lt;span class="o"&gt;[&lt;/span&gt;root@stapp01 ~]# systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;firewalld
Created symlink from /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service to /usr/lib/systemd/system/firewalld.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/firewalld.service to /usr/lib/systemd/system/firewalld.service.

&lt;span class="o"&gt;[&lt;/span&gt;root@stapp01 ~]# firewall-cmd &lt;span class="nt"&gt;--set-default-zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public
success

&lt;span class="o"&gt;[&lt;/span&gt;root@stapp01 ~]# firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3002/tcp &lt;span class="nt"&gt;--permanent&lt;/span&gt;
success

&lt;span class="o"&gt;[&lt;/span&gt;root@stapp01 ~]# firewall-cmd &lt;span class="nt"&gt;--reload&lt;/span&gt;
success

&lt;span class="o"&gt;[&lt;/span&gt;root@stapp01 ~]# firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--list-all&lt;/span&gt;
public
  target: default
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: dhcpv6-client ssh
  ports: 3002/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

&lt;span class="o"&gt;[&lt;/span&gt;root@stapp01 ~]# firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--query-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3002/tcp
&lt;span class="nb"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Additional Verification Commands
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check if firewalld is running&lt;/span&gt;
systemctl is-active firewalld
&lt;span class="c"&gt;# Should output: active&lt;/span&gt;

&lt;span class="c"&gt;# Check if firewalld is enabled for boot&lt;/span&gt;
systemctl is-enabled firewalld
&lt;span class="c"&gt;# Should output: enabled&lt;/span&gt;

&lt;span class="c"&gt;# List all zones&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--get-zones&lt;/span&gt;

&lt;span class="c"&gt;# List all open ports in public zone&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--list-ports&lt;/span&gt;

&lt;span class="c"&gt;# List all services in public zone&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--list-services&lt;/span&gt;

&lt;span class="c"&gt;# Check if specific port is open&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--query-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3002/tcp

&lt;span class="c"&gt;# View rich rules&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--list-rich-rules&lt;/span&gt;

&lt;span class="c"&gt;# Check firewall state&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--state&lt;/span&gt;
&lt;span class="c"&gt;# Should output: running&lt;/span&gt;

&lt;span class="c"&gt;# View the current configuration&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--list-all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;"firewalld: command not found"&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# Install firewalld&lt;/span&gt;
   yum &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; firewalld
   &lt;span class="c"&gt;# or&lt;/span&gt;
   apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; firewalld
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;"Failed to start firewalld"&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# Check for errors&lt;/span&gt;
   journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; firewalld
   &lt;span class="c"&gt;# Stop and restart&lt;/span&gt;
   systemctl stop firewalld
   systemctl start firewalld
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;"FirewallD is not running"&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# Start firewalld&lt;/span&gt;
   systemctl start firewalld
   &lt;span class="c"&gt;# Check status&lt;/span&gt;
   systemctl status firewalld
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;"Error: COMMAND_FAILED"&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# Use --permanent flag and reload&lt;/span&gt;
   firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3002/tcp &lt;span class="nt"&gt;--permanent&lt;/span&gt;
   firewall-cmd &lt;span class="nt"&gt;--reload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;"Zone public not available"&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# List available zones&lt;/span&gt;
   firewall-cmd &lt;span class="nt"&gt;--get-zones&lt;/span&gt;
   &lt;span class="c"&gt;# Set a different zone if needed&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;"Failed to set default zone"&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# Check if firewalld is running&lt;/span&gt;
   systemctl status firewalld
   &lt;span class="c"&gt;# Restart firewalld&lt;/span&gt;
   systemctl restart firewalld
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Firewalld Commands Reference
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Service Management
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl start firewalld    &lt;span class="c"&gt;# Start firewalld&lt;/span&gt;
systemctl stop firewalld     &lt;span class="c"&gt;# Stop firewalld&lt;/span&gt;
systemctl restart firewalld  &lt;span class="c"&gt;# Restart firewalld&lt;/span&gt;
systemctl status firewalld   &lt;span class="c"&gt;# Check status&lt;/span&gt;
systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;firewalld   &lt;span class="c"&gt;# Enable on boot&lt;/span&gt;
systemctl disable firewalld  &lt;span class="c"&gt;# Disable on boot&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Zone Management
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firewall-cmd &lt;span class="nt"&gt;--get-default-zone&lt;/span&gt;              &lt;span class="c"&gt;# Get default zone&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--set-default-zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public       &lt;span class="c"&gt;# Set default zone&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--get-zones&lt;/span&gt;                     &lt;span class="c"&gt;# List all zones&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--list-all&lt;/span&gt;                      &lt;span class="c"&gt;# List all rules&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Port Management
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3002/tcp &lt;span class="nt"&gt;--permanent&lt;/span&gt;   &lt;span class="c"&gt;# Add port&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--remove-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3002/tcp &lt;span class="nt"&gt;--permanent&lt;/span&gt;  &lt;span class="c"&gt;# Remove port&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--list-ports&lt;/span&gt;                      &lt;span class="c"&gt;# List ports&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--query-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3002/tcp            &lt;span class="c"&gt;# Query port&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--reload&lt;/span&gt;                                        &lt;span class="c"&gt;# Reload rules&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Service Management
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--add-service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http &lt;span class="nt"&gt;--permanent&lt;/span&gt;    &lt;span class="c"&gt;# Add service&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--remove-service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="c"&gt;# Remove service&lt;/span&gt;
firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--list-services&lt;/span&gt;                   &lt;span class="c"&gt;# List services&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Complete Script (Run from Jump Host)
&lt;/h2&gt;

&lt;p&gt;Create a script &lt;code&gt;setup_firewall.sh&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Installing and Configuring Firewalld"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;

ssh tony@stapp01 &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
echo 'Ir0nM@n' | sudo -S bash -c '
echo ""
echo "=== Step 1: Installing firewalld ==="
yum install -y firewalld

echo ""
echo "=== Step 2: Starting firewalld ==="
systemctl start firewalld
systemctl enable firewalld

echo ""
echo "=== Step 3: Setting default zone to public ==="
firewall-cmd --set-default-zone=public

echo ""
echo "=== Step 4: Allowing port 3002/tcp ==="
firewall-cmd --zone=public --add-port=3002/tcp --permanent
firewall-cmd --reload

echo ""
echo "=== Step 5: Verification ==="
echo "Firewalld Status:"
systemctl status firewalld | grep -E "Active|Loaded"

echo ""
echo "Default Zone:"
firewall-cmd --get-default-zone

echo ""
echo "Open Ports:"
firewall-cmd --zone=public --list-ports

echo ""
echo "Complete Configuration:"
firewall-cmd --zone=public --list-all

echo ""
echo "✅ Firewalld configured successfully!"
'
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make it executable and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x setup_firewall.sh
./setup_firewall.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Security Best Practices
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Allow only specific IPs&lt;/strong&gt; (if needed):
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--add-rich-rule&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="3002" accept'&lt;/span&gt; &lt;span class="nt"&gt;--permanent&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Limit source IPs for security&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--add-source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10.0.0.0/8 &lt;span class="nt"&gt;--permanent&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Verify after reboot&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   systemctl reboot
   &lt;span class="c"&gt;# After reboot, verify&lt;/span&gt;
   systemctl status firewalld
   firewall-cmd &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public &lt;span class="nt"&gt;--list-ports&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Complete Solution Summary
&lt;/h2&gt;

&lt;p&gt;The firewall has been configured on &lt;strong&gt;App Server 1 (stapp01)&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;firewalld installed&lt;/strong&gt;: &lt;code&gt;yum install -y firewalld&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;firewalld started&lt;/strong&gt;: &lt;code&gt;systemctl start firewalld&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;firewalld enabled on boot&lt;/strong&gt;: &lt;code&gt;systemctl enable firewalld&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Default zone set to public&lt;/strong&gt;: &lt;code&gt;firewall-cmd --set-default-zone=public&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Port 3002/tcp allowed permanently&lt;/strong&gt;: &lt;code&gt;firewall-cmd --zone=public --add-port=3002/tcp --permanent&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Firewall reloaded&lt;/strong&gt;: &lt;code&gt;firewall-cmd --reload&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Configuration verified&lt;/strong&gt;: Port 3002 is open and accessible&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Nautilus backup utility web UI application running on port 3002 can now accept incoming connections through the firewall.&lt;/p&gt;

</description>
      <category>linux</category>
    </item>
    <item>
      <title>Timezone Alignment</title>
      <dc:creator>Janak Shrestha</dc:creator>
      <pubDate>Sat, 29 Aug 2026 05:23:29 +0000</pubDate>
      <link>https://dev.to/janak0ff/timezone-alignment-2m8i</link>
      <guid>https://dev.to/janak0ff/timezone-alignment-2m8i</guid>
      <description>&lt;p&gt;In the daily standup, it was noted that the timezone settings across the Nautilus Application Servers in the Stratos Datacenter are inconsistent with the local datacenter's timezone, currently set to America/Blanc-Sablon.&lt;/p&gt;

&lt;p&gt;Synchronize the timezone settings to match the local datacenter's timezone (America/Blanc-Sablon)&lt;/p&gt;




&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Prerequisites&lt;/li&gt;
&lt;li&gt;Manual Configuration Steps&lt;/li&gt;
&lt;li&gt;Automated One-Line Commands&lt;/li&gt;
&lt;li&gt;Complete Script Implementation&lt;/li&gt;
&lt;li&gt;Verification Procedures&lt;/li&gt;
&lt;li&gt;Alternative Methods&lt;/li&gt;
&lt;li&gt;Troubleshooting Guide&lt;/li&gt;
&lt;li&gt;Timezone Information&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;SSH access to all application servers&lt;/li&gt;
&lt;li&gt;Sudo privileges on each server&lt;/li&gt;
&lt;li&gt;Server credentials:

&lt;ul&gt;
&lt;li&gt;stapp01: User &lt;code&gt;tony&lt;/code&gt; / Password &lt;code&gt;Ir0nM@n&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;stapp02: User &lt;code&gt;steve&lt;/code&gt; / Password &lt;code&gt;Am3ric@&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;stapp03: User &lt;code&gt;banner&lt;/code&gt; / Password &lt;code&gt;BigGr33n&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Manual Configuration Steps
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Connect to Each Application Server
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# App Server 1&lt;/span&gt;
ssh tony@stapp01

&lt;span class="c"&gt;# App Server 2&lt;/span&gt;
ssh steve@stapp02

&lt;span class="c"&gt;# App Server 3&lt;/span&gt;
ssh banner@stapp03
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Check Current Timezone
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Using timedatectl&lt;/span&gt;
timedatectl

&lt;span class="c"&gt;# Using date command&lt;/span&gt;
&lt;span class="nb"&gt;date&lt;/span&gt;

&lt;span class="c"&gt;# Check timezone configuration file&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/timezone 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;cat&lt;/span&gt; /etc/sysconfig/clock 2&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Set Timezone to America/Blanc-Sablon
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Method 1: Using timedatectl (Recommended)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;timedatectl set-timezone America/Blanc-Sablon
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Method 2: Using Symbolic Link&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo ln&lt;/span&gt; &lt;span class="nt"&gt;-sf&lt;/span&gt; /usr/share/zoneinfo/America/Blanc-Sablon /etc/localtime
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Method 3: Using tzdata (Debian/Ubuntu)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"America/Blanc-Sablon"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/timezone
&lt;span class="nb"&gt;sudo &lt;/span&gt;dpkg-reconfigure &lt;span class="nt"&gt;--frontend&lt;/span&gt; noninteractive tzdata
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Verify the Change
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check updated timezone&lt;/span&gt;
timedatectl

&lt;span class="c"&gt;# Verify with date command&lt;/span&gt;
&lt;span class="nb"&gt;date&lt;/span&gt;

&lt;span class="c"&gt;# Check symbolic link&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /etc/localtime

&lt;span class="c"&gt;# Verify timezone file&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/timezone 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;cat&lt;/span&gt; /etc/sysconfig/clock 2&amp;gt;/dev/null

&lt;span class="c"&gt;# Detailed status&lt;/span&gt;
timedatectl status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5: Exit the Server
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Automated One-Line Commands
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Complete Commands for All Servers
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# stapp01&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Ir0nM@n'&lt;/span&gt; | ssh tony@stapp01 &lt;span class="s2"&gt;"sudo -S bash -c 'timedatectl set-timezone America/Blanc-Sablon &amp;amp;&amp;amp; timedatectl | grep &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Time zone&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;'"&lt;/span&gt;

&lt;span class="c"&gt;# stapp02&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Am3ric@'&lt;/span&gt; | ssh steve@stapp02 &lt;span class="s2"&gt;"sudo -S bash -c 'timedatectl set-timezone America/Blanc-Sablon &amp;amp;&amp;amp; timedatectl | grep &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Time zone&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;'"&lt;/span&gt;

&lt;span class="c"&gt;# stapp03&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'BigGr33n'&lt;/span&gt; | ssh banner@stapp03 &lt;span class="s2"&gt;"sudo -S bash -c 'timedatectl set-timezone America/Blanc-Sablon &amp;amp;&amp;amp; timedatectl | grep &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Time zone&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;'"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why This Syntax Works
&lt;/h3&gt;

&lt;p&gt;The command uses &lt;code&gt;sudo -S bash -c 'cmd1 &amp;amp;&amp;amp; cmd2'&lt;/code&gt; to pass the password once and execute multiple commands within a single sudo session. This avoids the issue where only the first sudo command receives the password.&lt;/p&gt;

&lt;h3&gt;
  
  
  Using Heredoc (More Detailed Output)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# stapp01&lt;/span&gt;
ssh tony@stapp01 &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
echo 'Ir0nM@n' | sudo -S bash -c '
echo "Current timezone:"
timedatectl | grep "Time zone"
echo ""
echo "Setting timezone to America/Blanc-Sablon..."
timedatectl set-timezone America/Blanc-Sablon
echo ""
echo "New timezone:"
timedatectl | grep "Time zone"
echo ""
date
'
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="c"&gt;# stapp02&lt;/span&gt;
ssh steve@stapp02 &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
echo 'Am3ric@' | sudo -S bash -c '
echo "Current timezone:"
timedatectl | grep "Time zone"
echo ""
echo "Setting timezone to America/Blanc-Sablon..."
timedatectl set-timezone America/Blanc-Sablon
echo ""
echo "New timezone:"
timedatectl | grep "Time zone"
echo ""
date
'
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="c"&gt;# stapp03&lt;/span&gt;
ssh banner@stapp03 &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
echo 'BigGr33n' | sudo -S bash -c '
echo "Current timezone:"
timedatectl | grep "Time zone"
echo ""
echo "Setting timezone to America/Blanc-Sablon..."
timedatectl set-timezone America/Blanc-Sablon
echo ""
echo "New timezone:"
timedatectl | grep "Time zone"
echo ""
date
'
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Complete Script Implementation
&lt;/h2&gt;

&lt;p&gt;Create a script file named &lt;code&gt;set_timezone.sh&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="c"&gt;# Define servers with their credentials&lt;/span&gt;
&lt;span class="nb"&gt;declare&lt;/span&gt; &lt;span class="nt"&gt;-A&lt;/span&gt; &lt;span class="nv"&gt;SERVERS&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;
    &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"stapp01"&lt;/span&gt;&lt;span class="o"&gt;]=&lt;/span&gt;&lt;span class="s2"&gt;"tony:Ir0nM@n"&lt;/span&gt;
    &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"stapp02"&lt;/span&gt;&lt;span class="o"&gt;]=&lt;/span&gt;&lt;span class="s2"&gt;"steve:Am3ric@"&lt;/span&gt;
    &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"stapp03"&lt;/span&gt;&lt;span class="o"&gt;]=&lt;/span&gt;&lt;span class="s2"&gt;"banner:BigGr33n"&lt;/span&gt;
&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="nv"&gt;TIMEZONE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"America/Blanc-Sablon"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Synchronizing Timezone to &lt;/span&gt;&lt;span class="nv"&gt;$TIMEZONE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;server &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;!SERVERS[@]&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;&lt;span class="nv"&gt;IFS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;':'&lt;/span&gt; &lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; user pass &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SERVERS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$server&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"-----------------------------------------"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Processing &lt;/span&gt;&lt;span class="nv"&gt;$server&lt;/span&gt;&lt;span class="s2"&gt; (User: &lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="s2"&gt;)"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"-----------------------------------------"&lt;/span&gt;

    sshpass &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$pass&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; ssh &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;StrictHostKeyChecking&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;no &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="s2"&gt;@&lt;/span&gt;&lt;span class="nv"&gt;$server&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"sudo -S bash -c '
        echo &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Current timezone:&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;
        timedatectl | grep &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Time zone&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;

        echo &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Setting timezone to &lt;/span&gt;&lt;span class="nv"&gt;$TIMEZONE&lt;/span&gt;&lt;span class="s2"&gt;...&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;
        timedatectl set-timezone &lt;/span&gt;&lt;span class="nv"&gt;$TIMEZONE&lt;/span&gt;&lt;span class="s2"&gt;

        echo &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;New timezone:&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;
        timedatectl | grep &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Time zone&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;

        echo &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Current date and time:&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;
        date
    '"&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt; &lt;span class="nt"&gt;-eq&lt;/span&gt; 0 &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"SUCCESS: &lt;/span&gt;&lt;span class="nv"&gt;$server&lt;/span&gt;&lt;span class="s2"&gt; completed successfully"&lt;/span&gt;
    &lt;span class="k"&gt;else
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"ERROR: Failed to configure &lt;/span&gt;&lt;span class="nv"&gt;$server&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;fi
done

&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"All App servers timezone synchronized"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Verification Commands:"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"  ssh tony@stapp01 'timedatectl | grep Time zone'"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"  ssh steve@stapp02 'timedatectl | grep Time zone'"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"  ssh banner@stapp03 'timedatectl | grep Time zone'"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make the script executable and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x set_timezone.sh
./set_timezone.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Alternative Script Without sshpass
&lt;/h3&gt;

&lt;p&gt;If &lt;code&gt;sshpass&lt;/code&gt; is not available, use this version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="nv"&gt;TIMEZONE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"America/Blanc-Sablon"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Synchronizing Timezone to &lt;/span&gt;&lt;span class="nv"&gt;$TIMEZONE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;

&lt;span class="c"&gt;# stapp01&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== stapp01 ==="&lt;/span&gt;
ssh tony@stapp01 &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
echo 'Ir0nM@n' | sudo -S bash -c '
echo "Setting timezone...";
timedatectl set-timezone America/Blanc-Sablon;
echo "Verification:";
timedatectl | grep "Time zone"
'
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="c"&gt;# stapp02&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== stapp02 ==="&lt;/span&gt;
ssh steve@stapp02 &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
echo 'Am3ric@' | sudo -S bash -c '
echo "Setting timezone...";
timedatectl set-timezone America/Blanc-Sablon;
echo "Verification:";
timedatectl | grep "Time zone"
'
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="c"&gt;# stapp03&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== stapp03 ==="&lt;/span&gt;
ssh banner@stapp03 &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
echo 'BigGr33n' | sudo -S bash -c '
echo "Setting timezone...";
timedatectl set-timezone America/Blanc-Sablon;
echo "Verification:";
timedatectl | grep "Time zone"
'
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"All App servers timezone synchronized"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Verification Procedures
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Verify Timezone on Each Server
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# stapp01&lt;/span&gt;
ssh tony@stapp01 &lt;span class="s2"&gt;"echo 'Ir0nM@n' | sudo -S timedatectl | grep 'Time zone'"&lt;/span&gt;

&lt;span class="c"&gt;# stapp02&lt;/span&gt;
ssh steve@stapp02 &lt;span class="s2"&gt;"echo 'Am3ric@' | sudo -S timedatectl | grep 'Time zone'"&lt;/span&gt;

&lt;span class="c"&gt;# stapp03&lt;/span&gt;
ssh banner@stapp03 &lt;span class="s2"&gt;"echo 'BigGr33n' | sudo -S timedatectl | grep 'Time zone'"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Verify with Date Command
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# stapp01&lt;/span&gt;
ssh tony@stapp01 &lt;span class="s2"&gt;"date"&lt;/span&gt;

&lt;span class="c"&gt;# stapp02&lt;/span&gt;
ssh steve@stapp02 &lt;span class="s2"&gt;"date"&lt;/span&gt;

&lt;span class="c"&gt;# stapp03&lt;/span&gt;
ssh banner@stapp03 &lt;span class="s2"&gt;"date"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Check Symbolic Links
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# stapp01&lt;/span&gt;
ssh tony@stapp01 &lt;span class="s2"&gt;"ls -la /etc/localtime"&lt;/span&gt;

&lt;span class="c"&gt;# stapp02&lt;/span&gt;
ssh steve@stapp02 &lt;span class="s2"&gt;"ls -la /etc/localtime"&lt;/span&gt;

&lt;span class="c"&gt;# stapp03&lt;/span&gt;
ssh banner@stapp03 &lt;span class="s2"&gt;"ls -la /etc/localtime"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Combined Verification Command
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== stapp01 ==="&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; ssh tony@stapp01 &lt;span class="s2"&gt;"echo 'Ir0nM@n' | sudo -S timedatectl | grep Time"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== stapp02 ==="&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; ssh steve@stapp02 &lt;span class="s2"&gt;"echo 'Am3ric@' | sudo -S timedatectl | grep Time"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== stapp03 ==="&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; ssh banner@stapp03 &lt;span class="s2"&gt;"echo 'BigGr33n' | sudo -S timedatectl | grep Time"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Expected Output
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;===&lt;/span&gt; stapp01 &lt;span class="o"&gt;===&lt;/span&gt;
                Time zone: America/Blanc-Sablon &lt;span class="o"&gt;(&lt;/span&gt;AST, &lt;span class="nt"&gt;-0400&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;===&lt;/span&gt; stapp02 &lt;span class="o"&gt;===&lt;/span&gt;
                Time zone: America/Blanc-Sablon &lt;span class="o"&gt;(&lt;/span&gt;AST, &lt;span class="nt"&gt;-0400&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;===&lt;/span&gt; stapp03 &lt;span class="o"&gt;===&lt;/span&gt;
                Time zone: America/Blanc-Sablon &lt;span class="o"&gt;(&lt;/span&gt;AST, &lt;span class="nt"&gt;-0400&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Alternative Methods
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Method 1: Using ln Command (if timedatectl unavailable)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Remove existing link&lt;/span&gt;
&lt;span class="nb"&gt;sudo rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /etc/localtime

&lt;span class="c"&gt;# Create new link&lt;/span&gt;
&lt;span class="nb"&gt;sudo ln&lt;/span&gt; &lt;span class="nt"&gt;-sf&lt;/span&gt; /usr/share/zoneinfo/America/Blanc-Sablon /etc/localtime
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Method 2: Using /etc/timezone (Debian/Ubuntu)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Set timezone&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"America/Blanc-Sablon"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/timezone

&lt;span class="c"&gt;# Update system&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dpkg-reconfigure &lt;span class="nt"&gt;--frontend&lt;/span&gt; noninteractive tzdata
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Method 3: Using /etc/sysconfig/clock (RHEL/CentOS)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Set timezone in config&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'ZONE="America/Blanc-Sablon"'&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/sysconfig/clock

&lt;span class="c"&gt;# Create symbolic link&lt;/span&gt;
&lt;span class="nb"&gt;sudo ln&lt;/span&gt; &lt;span class="nt"&gt;-sf&lt;/span&gt; /usr/share/zoneinfo/America/Blanc-Sablon /etc/localtime
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Method 4: Interactive Method (tzselect)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# This is interactive, not suitable for automation&lt;/span&gt;
tzselect
&lt;span class="c"&gt;# Follow prompts to select America -&amp;gt; Blanc-Sablon&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Method 5: With NTP Sync
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# If NTP is enabled, timezone change may trigger time sync&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;timedatectl set-timezone America/Blanc-Sablon
&lt;span class="nb"&gt;sudo &lt;/span&gt;timedatectl set-ntp &lt;span class="nb"&gt;true
sudo &lt;/span&gt;timedatectl set-timezone America/Blanc-Sablon
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Troubleshooting Guide
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Issue 1: "Failed to set timezone: Invalid timezone"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: Verify the timezone exists in the system:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;timedatectl list-timezones | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; blanc-sablon
&lt;span class="c"&gt;# Should show: America/Blanc-Sablon&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Issue 2: "Permission denied"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: Use sudo or become root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;timedatectl set-timezone America/Blanc-Sablon
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Issue 3: "System has not been booted with systemd"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: Use the ln command method instead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo ln&lt;/span&gt; &lt;span class="nt"&gt;-sf&lt;/span&gt; /usr/share/zoneinfo/America/Blanc-Sablon /etc/localtime
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Issue 4: Password not accepted in one-liner
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: Ensure the correct syntax with single sudo session:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Incorrect - only first sudo gets password&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'pass'&lt;/span&gt; | &lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-S&lt;/span&gt; cmd1 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-S&lt;/span&gt; cmd2

&lt;span class="c"&gt;# Correct - single sudo session&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'pass'&lt;/span&gt; | &lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-S&lt;/span&gt; bash &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'cmd1 &amp;amp;&amp;amp; cmd2'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Issue 5: Time not updating after timezone change
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: Restart systemd-timesyncd or force time sync:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Restart time synchronization service&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart systemd-timesyncd

&lt;span class="c"&gt;# Or force time sync&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;timedatectl set-ntp &lt;span class="nb"&gt;false
sudo &lt;/span&gt;timedatectl set-ntp &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Issue 6: Multiple verification methods
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check from multiple sources&lt;/span&gt;
timedatectl
&lt;span class="nb"&gt;date
cat&lt;/span&gt; /etc/timezone 2&amp;gt;/dev/null
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/sysconfig/clock 2&amp;gt;/dev/null
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /etc/localtime
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Issue 7: sshpass not installed
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: Install sshpass or use heredoc method:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install sshpass&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;yum &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; sshpass  &lt;span class="c"&gt;# RHEL/CentOS&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; sshpass  &lt;span class="c"&gt;# Ubuntu/Debian&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Timezone Information
&lt;/h2&gt;

&lt;h3&gt;
  
  
  America/Blanc-Sablon Details
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Full Name&lt;/strong&gt;: America/Blanc-Sablon&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Standard Time&lt;/strong&gt;: AST (Atlantic Standard Time)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UTC Offset&lt;/strong&gt;: UTC-4&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Daylight Saving Time&lt;/strong&gt;: No DST observed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Location&lt;/strong&gt;: Blanc-Sablon, Quebec, Canada&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Major Cities&lt;/strong&gt;: Blanc-Sablon, Quebec&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Timezone Comparison
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Timezone&lt;/th&gt;
&lt;th&gt;UTC Offset&lt;/th&gt;
&lt;th&gt;DST&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;America/Blanc-Sablon&lt;/td&gt;
&lt;td&gt;UTC-4&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;America/New_York&lt;/td&gt;
&lt;td&gt;UTC-4/UTC-5&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;America/Chicago&lt;/td&gt;
&lt;td&gt;UTC-5/UTC-6&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;America/Denver&lt;/td&gt;
&lt;td&gt;UTC-6/UTC-7&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;America/Los_Angeles&lt;/td&gt;
&lt;td&gt;UTC-7/UTC-8&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;The timezone settings have been successfully synchronized on all Nautilus Application Servers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;stapp01&lt;/strong&gt;: Timezone set to America/Blanc-Sablon&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;stapp02&lt;/strong&gt;: Timezone set to America/Blanc-Sablon&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;stapp03&lt;/strong&gt;: Timezone set to America/Blanc-Sablon&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All servers now have consistent timezone settings matching the local datacenter's timezone (America/Blanc-Sablon). Verification has been completed using &lt;code&gt;timedatectl&lt;/code&gt; and &lt;code&gt;date&lt;/code&gt; commands, and the timezone symbolic links have been updated accordingly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Reference Card
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Manual Setup
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Connect and set timezone&lt;/span&gt;
ssh tony@stapp01
&lt;span class="nb"&gt;sudo &lt;/span&gt;timedatectl set-timezone America/Blanc-Sablon
timedatectl
&lt;span class="nb"&gt;exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  One-Line Commands
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# stapp01&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Ir0nM@n'&lt;/span&gt; | ssh tony@stapp01 &lt;span class="s2"&gt;"sudo -S bash -c 'timedatectl set-timezone America/Blanc-Sablon &amp;amp;&amp;amp; timedatectl | grep &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Time zone&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;'"&lt;/span&gt;

&lt;span class="c"&gt;# stapp02&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Am3ric@'&lt;/span&gt; | ssh steve@stapp02 &lt;span class="s2"&gt;"sudo -S bash -c 'timedatectl set-timezone America/Blanc-Sablon &amp;amp;&amp;amp; timedatectl | grep &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Time zone&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;'"&lt;/span&gt;

&lt;span class="c"&gt;# stapp03&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'BigGr33n'&lt;/span&gt; | ssh banner@stapp03 &lt;span class="s2"&gt;"sudo -S bash -c 'timedatectl set-timezone America/Blanc-Sablon &amp;amp;&amp;amp; timedatectl | grep &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Time zone&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;'"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Verification
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Quick verification&lt;/span&gt;
ssh tony@stapp01 &lt;span class="s2"&gt;"echo 'Ir0nM@n' | sudo -S timedatectl | grep Time"&lt;/span&gt;
ssh steve@stapp02 &lt;span class="s2"&gt;"echo 'Am3ric@' | sudo -S timedatectl | grep Time"&lt;/span&gt;
ssh banner@stapp03 &lt;span class="s2"&gt;"echo 'BigGr33n' | sudo -S timedatectl | grep Time"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>linux</category>
    </item>
    <item>
      <title>Default GUI Boot Configuration</title>
      <dc:creator>Janak Shrestha</dc:creator>
      <pubDate>Sat, 29 Aug 2026 03:39:33 +0000</pubDate>
      <link>https://dev.to/janak0ff/default-gui-boot-configuration-2lkf</link>
      <guid>https://dev.to/janak0ff/default-gui-boot-configuration-2lkf</guid>
      <description>&lt;p&gt;With the installation of new tools on the app servers within the Stratos Datacenter, certain functionalities now necessitate graphical user interface (GUI) access.&lt;/p&gt;

&lt;p&gt;Adjust the default runlevel on all App servers in Stratos Datacenter to enable GUI booting by default. It's imperative not to initiate a server reboot after completing this task.&lt;/p&gt;




&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Managing system runlevels is a fundamental task for Linux system administrators. In modern Linux distributions using systemd, the traditional runlevel concept has been replaced with systemd targets. This guide demonstrates how to configure the default boot target to graphical mode across multiple servers without requiring immediate system reboots.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding Systemd Targets and Runlevels
&lt;/h2&gt;

&lt;p&gt;Systemd targets serve as synchronization points that group related services and units. The relationship between traditional runlevels and systemd targets is as follows:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Runlevel&lt;/th&gt;
&lt;th&gt;Systemd Target&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;poweroff.target&lt;/td&gt;
&lt;td&gt;System halt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;rescue.target&lt;/td&gt;
&lt;td&gt;Single-user mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;multi-user.target&lt;/td&gt;
&lt;td&gt;Multi-user text mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;graphical.target&lt;/td&gt;
&lt;td&gt;Multi-user with GUI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;reboot.target&lt;/td&gt;
&lt;td&gt;System reboot&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In this scenario, the App servers currently boot to &lt;code&gt;multi-user.target&lt;/code&gt; (runlevel 3 - text mode) and need to be configured to boot to &lt;code&gt;graphical.target&lt;/code&gt; (runlevel 5 - GUI mode).&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Pitfall: Password Handling in Remote Execution
&lt;/h2&gt;

&lt;p&gt;When executing multiple sudo commands remotely, a common issue arises where the password is only passed to the first sudo command. This results in authentication failures for subsequent commands.&lt;/p&gt;

&lt;h3&gt;
  
  
  Problematic Implementation
&lt;/h3&gt;

&lt;p&gt;The following approach fails because the second sudo command receives no password input:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Password123'&lt;/span&gt; | ssh user@server &lt;span class="s2"&gt;"sudo -S systemctl set-default graphical.target &amp;amp;&amp;amp; sudo -S systemctl get-default"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, the first sudo command receives the password via the pipe, but the second sudo command has no password available and will prompt for input, causing the command to hang or fail.&lt;/p&gt;

&lt;h3&gt;
  
  
  Correct Implementation
&lt;/h3&gt;

&lt;p&gt;The solution is to combine all commands into a single sudo session using either a shell wrapper or a heredoc approach. This ensures the password is passed once and all commands execute within the same privileged context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution Methods
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Method 1: Single Shell Session with Command Chaining
&lt;/h3&gt;

&lt;p&gt;This method uses a shell wrapper to execute multiple commands within a single sudo session:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Password123'&lt;/span&gt; | ssh user@server &lt;span class="s2"&gt;"sudo -S bash -c 'systemctl set-default graphical.target &amp;amp;&amp;amp; systemctl get-default'"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;bash -c&lt;/code&gt; wrapper creates a single shell process that executes both commands sequentially. The password is passed to the sudo command once, and both systemctl commands run with elevated privileges.&lt;/p&gt;

&lt;h3&gt;
  
  
  Method 2: Heredoc with Sudo Wrapper
&lt;/h3&gt;

&lt;p&gt;The heredoc approach provides better readability for complex command sequences:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh user@server &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
echo 'Password123' | sudo -S bash -c '
systemctl set-default graphical.target
systemctl get-default
'
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This method is particularly useful when executing multiple commands or when the command sequence is lengthy and requires better formatting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Method 3: Multiple Statements with Shell
&lt;/h3&gt;

&lt;p&gt;This method chains multiple statements using a shell interpreter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Password123'&lt;/span&gt; | ssh user@server &lt;span class="s2"&gt;"sudo -S sh -c 'systemctl set-default graphical.target &amp;amp;&amp;amp; systemctl get-default'"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using &lt;code&gt;sh&lt;/code&gt; instead of &lt;code&gt;bash&lt;/code&gt; provides compatibility with systems where bash is not the default shell.&lt;/p&gt;

&lt;h2&gt;
  
  
  Interactive Method
&lt;/h2&gt;

&lt;p&gt;For administrators who prefer an interactive approach, the following steps can be performed on each server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Connect to the server&lt;/span&gt;
ssh tony@stapp01  &lt;span class="c"&gt;# or steve@stapp02 / banner@stapp03&lt;/span&gt;
&lt;span class="c"&gt;# Enter password&lt;/span&gt;

&lt;span class="c"&gt;# 2. Become root&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;su -
&lt;span class="c"&gt;# Enter password&lt;/span&gt;

&lt;span class="c"&gt;# 3. Check current default target&lt;/span&gt;
systemctl get-default

&lt;span class="c"&gt;# 4. Set default to graphical.target&lt;/span&gt;
systemctl set-default graphical.target

&lt;span class="c"&gt;# 5. Verify the change&lt;/span&gt;
systemctl get-default

&lt;span class="c"&gt;# 6. Check the symlink&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /etc/systemd/system/default.target

&lt;span class="c"&gt;# 7. Exit&lt;/span&gt;
&lt;span class="nb"&gt;exit
exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Complete Implementation for Multiple Servers
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Server Configuration Details
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Server&lt;/th&gt;
&lt;th&gt;Username&lt;/th&gt;
&lt;th&gt;Password&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;stapp01&lt;/td&gt;
&lt;td&gt;tony&lt;/td&gt;
&lt;td&gt;Ir0nM@n&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;stapp02&lt;/td&gt;
&lt;td&gt;steve&lt;/td&gt;
&lt;td&gt;Am3ric@&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;stapp03&lt;/td&gt;
&lt;td&gt;banner&lt;/td&gt;
&lt;td&gt;BigGr33n&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Single-Command Implementation
&lt;/h3&gt;

&lt;p&gt;Execute the following commands from the jump host:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# stapp01 - App Server 1&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Ir0nM@n'&lt;/span&gt; | ssh tony@stapp01 &lt;span class="s2"&gt;"sudo -S bash -c 'echo &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Current: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;systemctl get-default&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;; systemctl set-default graphical.target; echo &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;New: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;systemctl get-default&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;'"&lt;/span&gt;

&lt;span class="c"&gt;# stapp02 - App Server 2&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Am3ric@'&lt;/span&gt; | ssh steve@stapp02 &lt;span class="s2"&gt;"sudo -S bash -c 'echo &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Current: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;systemctl get-default&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;; systemctl set-default graphical.target; echo &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;New: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;systemctl get-default&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;'"&lt;/span&gt;

&lt;span class="c"&gt;# stapp03 - App Server 3&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'BigGr33n'&lt;/span&gt; | ssh banner@stapp03 &lt;span class="s2"&gt;"sudo -S bash -c 'echo &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Current: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;systemctl get-default&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;; systemctl set-default graphical.target; echo &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;New: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;systemctl get-default&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;'"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Heredoc Implementation for Better Readability
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# stapp01&lt;/span&gt;
ssh tony@stapp01 &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
echo 'Ir0nM@n' | sudo -S bash -c '
echo "Current default target: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;systemctl get-default&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"
systemctl set-default graphical.target
echo "New default target: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;systemctl get-default&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"
ls -la /etc/systemd/system/default.target
'
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="c"&gt;# stapp02&lt;/span&gt;
ssh steve@stapp02 &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
echo 'Am3ric@' | sudo -S bash -c '
echo "Current default target: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;systemctl get-default&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"
systemctl set-default graphical.target
echo "New default target: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;systemctl get-default&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"
ls -la /etc/systemd/system/default.target
'
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="c"&gt;# stapp03&lt;/span&gt;
ssh banner@stapp03 &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
echo 'BigGr33n' | sudo -S bash -c '
echo "Current default target: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;systemctl get-default&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"
systemctl set-default graphical.target
echo "New default target: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;systemctl get-default&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"
ls -la /etc/systemd/system/default.target
'
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Automated Configuration Script
&lt;/h2&gt;

&lt;p&gt;Create a shell script named &lt;code&gt;configure_gui_target.sh&lt;/code&gt; to automate the process across all servers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Configuring GUI Boot Target on All Servers"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;

&lt;span class="c"&gt;# stapp01&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Processing stapp01"&lt;/span&gt;
ssh tony@stapp01 &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
echo 'Ir0nM@n' | sudo -S bash -c '
echo "Current target: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;systemctl get-default&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"
systemctl set-default graphical.target
echo "New target: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;systemctl get-default&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"
ls -la /etc/systemd/system/default.target
'
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="c"&gt;# stapp02&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Processing stapp02"&lt;/span&gt;
ssh steve@stapp02 &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
echo 'Am3ric@' | sudo -S bash -c '
echo "Current target: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;systemctl get-default&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"
systemctl set-default graphical.target
echo "New target: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;systemctl get-default&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"
ls -la /etc/systemd/system/default.target
'
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="c"&gt;# stapp03&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Processing stapp03"&lt;/span&gt;
ssh banner@stapp03 &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
echo 'BigGr33n' | sudo -S bash -c '
echo "Current target: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;systemctl get-default&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"
systemctl set-default graphical.target
echo "New target: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;systemctl get-default&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"
ls -la /etc/systemd/system/default.target
'
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Configuration Complete"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Verification Commands:"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"  ssh tony@stapp01 'systemctl get-default'"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"  ssh steve@stapp02 'systemctl get-default'"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"  ssh banner@stapp03 'systemctl get-default'"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make the script executable and run it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x configure_gui_target.sh
./configure_gui_target.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Verification Commands
&lt;/h2&gt;

&lt;p&gt;Verify the configuration on each server using the following commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check default target&lt;/span&gt;
ssh tony@stapp01 &lt;span class="s2"&gt;"echo 'Ir0nM@n' | sudo -S systemctl get-default"&lt;/span&gt;
ssh steve@stapp02 &lt;span class="s2"&gt;"echo 'Am3ric@' | sudo -S systemctl get-default"&lt;/span&gt;
ssh banner@stapp03 &lt;span class="s2"&gt;"echo 'BigGr33n' | sudo -S systemctl get-default"&lt;/span&gt;

&lt;span class="c"&gt;# Expected output on all servers: graphical.target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For detailed verification on each server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check default target&lt;/span&gt;
systemctl get-default

&lt;span class="c"&gt;# Verify the symlink&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /etc/systemd/system/default.target

&lt;span class="c"&gt;# Check graphical target status&lt;/span&gt;
systemctl status graphical.target

&lt;span class="c"&gt;# View all available targets&lt;/span&gt;
systemctl list-units &lt;span class="nt"&gt;--type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;target &lt;span class="nt"&gt;--all&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"graphical|multi-user"&lt;/span&gt;

&lt;span class="c"&gt;# Check current runlevel&lt;/span&gt;
runlevel

&lt;span class="c"&gt;# Verify no reboot occurred&lt;/span&gt;
&lt;span class="nb"&gt;uptime&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Expected Output
&lt;/h2&gt;

&lt;p&gt;When the configuration is applied successfully, you should see output similar to this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Current default target: multi-user.target

Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/graphical.target.

New default target: graphical.target

lrwxrwxrwx 1 root root 37 Jul 10 10:00 /etc/systemd/system/default.target -&amp;gt; /usr/lib/systemd/system/graphical.target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Understanding the Changes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Before Change:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Default target: multi-user.target
Boots to text mode &lt;span class="o"&gt;(&lt;/span&gt;runlevel 3&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  After Change:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Default target: graphical.target
Will boot to GUI mode &lt;span class="o"&gt;(&lt;/span&gt;runlevel 5&lt;span class="o"&gt;)&lt;/span&gt; on next reboot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Key Differences:
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;multi-user.target&lt;/th&gt;
&lt;th&gt;graphical.target&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Boot Mode&lt;/td&gt;
&lt;td&gt;Text/Console&lt;/td&gt;
&lt;td&gt;Graphical/GUI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Display Manager&lt;/td&gt;
&lt;td&gt;Not started&lt;/td&gt;
&lt;td&gt;Started&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;X Server&lt;/td&gt;
&lt;td&gt;Not running&lt;/td&gt;
&lt;td&gt;Running&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory Usage&lt;/td&gt;
&lt;td&gt;Lower&lt;/td&gt;
&lt;td&gt;Higher&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Suitable for&lt;/td&gt;
&lt;td&gt;Servers, headless&lt;/td&gt;
&lt;td&gt;Workstations, desktops&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Troubleshooting Common Issues
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Issue 1: Permission Denied
&lt;/h3&gt;

&lt;p&gt;If you encounter "Operation not permitted" errors:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Ensure proper sudo usage&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl set-default graphical.target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Issue 2: Graphical Target Not Found
&lt;/h3&gt;

&lt;p&gt;If the graphical target is unavailable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check if graphical target exists&lt;/span&gt;
systemctl status graphical.target

&lt;span class="c"&gt;# Install GUI packages (RHEL/CentOS)&lt;/span&gt;
yum groupinstall &lt;span class="s2"&gt;"Server with GUI"&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt;

&lt;span class="c"&gt;# For Debian/Ubuntu&lt;/span&gt;
apt-get &lt;span class="nb"&gt;install &lt;/span&gt;ubuntu-desktop &lt;span class="nt"&gt;-y&lt;/span&gt;

&lt;span class="c"&gt;# Install X11 packages if needed&lt;/span&gt;
yum &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; xorg-x11-server-Xorg xorg-x11-drivers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Issue 3: Display Manager Not Installed
&lt;/h3&gt;

&lt;p&gt;Install and enable a display manager:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check available display managers&lt;/span&gt;
systemctl list-unit-files | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"gdm|lightdm|sddm|kdm"&lt;/span&gt;

&lt;span class="c"&gt;# Install GDM&lt;/span&gt;
yum &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; gdm
systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;gdm

&lt;span class="c"&gt;# Install LightDM&lt;/span&gt;
yum &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; lightdm
systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;lightdm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Issue 4: Reverting to Text Mode
&lt;/h3&gt;

&lt;p&gt;If you need to revert the changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl set-default multi-user.target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Understanding Systemd Target Dependencies
&lt;/h2&gt;

&lt;p&gt;The graphical target depends on the multi-user target, which in turn depends on basic system services:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;graphical.target
    └── multi-user.target
        └── basic.target
            └── sysinit.target
                └── local-fs.target
                    └── swap.target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To view all dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl list-dependencies graphical.target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Alternative Commands
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Using Legacy Runlevel Commands
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check current runlevel&lt;/span&gt;
runlevel

&lt;span class="c"&gt;# Set default runlevel to 5 (GUI) - Deprecated, use systemctl instead&lt;/span&gt;
&lt;span class="c"&gt;# Edit /etc/inittab (for older systems)&lt;/span&gt;
&lt;span class="c"&gt;# id:5:initdefault:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Using Systemd Numeric Runlevels
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Runlevel 5 = graphical.target&lt;/span&gt;
systemctl set-default runlevel5.target

&lt;span class="c"&gt;# Runlevel 3 = multi-user.target&lt;/span&gt;
systemctl set-default runlevel3.target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Important Considerations
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No Reboot Required&lt;/strong&gt;: The changes take effect on the next system boot only. The current session remains unaffected.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GUI Packages Required&lt;/strong&gt;: The graphical target requires appropriate display manager and X11 packages to be installed on the servers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Current Session Unchanged&lt;/strong&gt;: The server continues running in its current mode until rebooted.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Symlink Verification&lt;/strong&gt;: The default target is configured via a symbolic link at &lt;code&gt;/etc/systemd/system/default.target&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Password Security&lt;/strong&gt;: The methods demonstrated pass passwords in plain text through the command line. In production environments, consider using SSH keys or password managers for improved security.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Complete Solution Summary
&lt;/h2&gt;

&lt;p&gt;The default runlevel has been configured on all App servers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;stapp01&lt;/strong&gt;: Default target changed to graphical.target&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;stapp02&lt;/strong&gt;: Default target changed to graphical.target&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;stapp03&lt;/strong&gt;: Default target changed to graphical.target&lt;/li&gt;
&lt;li&gt;Verified using systemctl get-default on each server&lt;/li&gt;
&lt;li&gt;Symlink created from /etc/systemd/system/default.target to graphical.target&lt;/li&gt;
&lt;li&gt;No servers were rebooted as required&lt;/li&gt;
&lt;li&gt;Changes will take effect on next reboot&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Setting the default boot target to graphical mode across multiple Linux servers requires careful attention to password handling when executing remote sudo commands. By combining commands into a single sudo session using shell wrappers or heredoc syntax, system administrators can reliably configure the default target across all servers without encountering authentication issues.&lt;/p&gt;

</description>
      <category>linux</category>
    </item>
  </channel>
</rss>
