<?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>Forem: Lucy Alfred Joshua</title>
    <description>The latest articles on Forem by Lucy Alfred Joshua (@lucy_76er).</description>
    <link>https://forem.com/lucy_76er</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1719486%2F6e38264a-47a0-4252-a864-dcea5653997b.jpeg</url>
      <title>Forem: Lucy Alfred Joshua</title>
      <link>https://forem.com/lucy_76er</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/lucy_76er"/>
    <language>en</language>
    <item>
      <title>Exploratory Testing on Cars.ng: Findings and Recommendations</title>
      <dc:creator>Lucy Alfred Joshua</dc:creator>
      <pubDate>Fri, 07 Feb 2025 20:39:16 +0000</pubDate>
      <link>https://forem.com/lucy_76er/exploratory-testing-on-carsng-findings-and-recommendations-59fp</link>
      <guid>https://forem.com/lucy_76er/exploratory-testing-on-carsng-findings-and-recommendations-59fp</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;As part of my exploratory testing task for the HNG Internship, I conducted an in-depth usability and functionality test on &lt;a href="http://cars.ng" rel="noopener noreferrer"&gt;Cars.ng&lt;/a&gt;. The goal was to evaluate the core user flows, identify bugs and inconsistencies, and suggest improvements to enhance the overall user experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Methodology
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Exploratory Testing&lt;/strong&gt; – Navigated through the website’s key functionalities, including sign-up, browsing listings, filtering searches, and saving cars.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Device Testing&lt;/strong&gt; – Conducted tests on both desktop (Windows 10, Chrome &amp;amp; Firefox) and mobile (Android &amp;amp; iOS, Chrome &amp;amp; Safari).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bug Documentation&lt;/strong&gt; – Identified issues, captured screenshots, and categorized them based on severity.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Findings
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Major Issues Identified&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;1&lt;/code&gt;. &lt;strong&gt;Sign-up Function&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Issue&lt;/strong&gt;: When clicking the sign-in button, it redirects to a page where users can sign in via Google, Facebook, email, or phone. However, clicking on the 'Register Here' button on this page changes it back to 'Sign In,' and the text above (which initially says 'Sign in with email or phone') changes to 'Register via email or phone.' This behavior is unclear and could be frustrating to users.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6plcre8d8ypvyvmcmc21.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6plcre8d8ypvyvmcmc21.png" alt="Register Here" width="800" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmfn0zhojytaol5bgbm38.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmfn0zhojytaol5bgbm38.png" alt="Sign In" width="800" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Expected&lt;/strong&gt;: The 'Sign Up' button should lead to a distinct registration page or process rather than modifying the sign-in interface dynamically in a confusing way.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Severity&lt;/strong&gt;: High.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;2&lt;/code&gt;. &lt;strong&gt;Long Sign-up Load Time&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Issue&lt;/strong&gt;: Sign-up took a little longer to load without user feedback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expected&lt;/strong&gt;: A loading indicator should inform users that the process is ongoing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Severity&lt;/strong&gt;: Medium.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;3&lt;/code&gt;. &lt;strong&gt;Non-Responsive Profile Area on Client Dashboard&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Issue&lt;/strong&gt;: The profile section is nested under 'Settings' which works fine, but it's not directly accessible on the profile icon.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl621c0f3ikkrvgz0br0b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl621c0f3ikkrvgz0br0b.png" alt="Profile" width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Expected&lt;/strong&gt;: Profile details should be easily accessible from the dashboard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Severity&lt;/strong&gt;: Medium.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;4&lt;/code&gt;. &lt;strong&gt;See All Categories Button Disappears&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Issue&lt;/strong&gt;: The ‘See All Categories’ button vanishes when hovered over.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkevilpmsyzybqukefndy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkevilpmsyzybqukefndy.png" alt="See all categories" width="800" height="354"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd6z2tnagtfwkzubai99r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd6z2tnagtfwkzubai99r.png" alt="Button" width="800" height="306"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Expected&lt;/strong&gt;: The button should remain visible and clickable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Severity&lt;/strong&gt;: High.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;5&lt;/code&gt;. &lt;strong&gt;'Save for Later' on Sales Section Not Working&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Issue&lt;/strong&gt;: Clicking ‘Save for Later’ has no effect.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsr63dz02go0392kv3qbr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsr63dz02go0392kv3qbr.png" alt="Save for later" width="800" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Expected&lt;/strong&gt;: A confirmation that the car has been saved should be displayed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Severity&lt;/strong&gt;: High.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;6&lt;/code&gt;. &lt;strong&gt;404 Error When Viewing Car Details&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Issue&lt;/strong&gt;: Clicking on certain car listings in the "For Sale" section leads to a 404 error, preventing users from accessing more details.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx1drl8g7xv0eqy9ickhy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx1drl8g7xv0eqy9ickhy.png" alt="404" width="800" height="332"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Expected&lt;/strong&gt;: Users should be redirected to the correct car details page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Severity&lt;/strong&gt;: High.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Mobile-Specific Issues&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;7&lt;/code&gt;. &lt;strong&gt;UI Elements Overlapping&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Issue&lt;/strong&gt;: On mobile, some texts and buttons overlap, making navigation difficult.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqk1vcazo5m6d78emahu6.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqk1vcazo5m6d78emahu6.jpg" alt="Mobile" width="695" height="1280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Expected&lt;/strong&gt;: Elements should be properly spaced for readability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Severity&lt;/strong&gt;: Medium.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;8&lt;/code&gt;. &lt;strong&gt;Finance and Lease Options Unavailable&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Issue&lt;/strong&gt;: Finance/Lease buttons are present but not clickable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expected&lt;/strong&gt;: Either enable them or provide a message stating they are unavailable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Severity&lt;/strong&gt;: Medium.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Suggested Improvements
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Fix Sign-up and Registration Flow&lt;/strong&gt; – Ensure the sign-up button functions correctly and provides feedback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enhance Mobile Responsiveness&lt;/strong&gt; – Address overlapping elements and fix filter responsiveness.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Improve Dashboard Accessibility&lt;/strong&gt; – Make profile settings easier to find.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optimize Performance&lt;/strong&gt; – Reduce loading times for sign-up and searches.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fix Broken Buttons&lt;/strong&gt; – Ensure all call-to-action buttons work as expected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resolve 404 Errors on Car Listings&lt;/strong&gt; – Ensure all car listings lead to valid details pages.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;Through this exploratory testing, I identified several usability and functionality issues that affect Cars.ng’s user experience. Addressing these issues will improve usability, navigation, and engagement for users on both desktop and mobile. I hope the Cars.ng development team finds these insights valuable in improving the platform.&lt;/p&gt;

&lt;p&gt;For a detailed bug report with screenshots, check the &lt;a href="https://docs.google.com/spreadsheets/d/18YOXG9EGPUHziNnyVYf-pY8pcwBa8N0AD5CajwIgI8E/edit?usp=sharing" rel="noopener noreferrer"&gt;Bug Report Sheet&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>hng</category>
    </item>
    <item>
      <title>Setting Up NGINX on Ubuntu Server: My DevOps Stage Zero Task Experience</title>
      <dc:creator>Lucy Alfred Joshua</dc:creator>
      <pubDate>Thu, 30 Jan 2025 01:17:28 +0000</pubDate>
      <link>https://forem.com/lucy_76er/setting-up-nginx-on-ubuntu-server-my-devops-stage-zero-task-experience-59ob</link>
      <guid>https://forem.com/lucy_76er/setting-up-nginx-on-ubuntu-server-my-devops-stage-zero-task-experience-59ob</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Deploying a web server is one of the foundational skills for any DevOps engineer. As part of the HNG DevOps Internship (Stage 0), I was tasked with setting up and configuring NGINX on a fresh Ubuntu server. This hands-on project allowed me to explore key aspects of server management, web server configuration, and troubleshooting.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Task Overview
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Install and configure NGINX&lt;/strong&gt; on a fresh Ubuntu server.&lt;/li&gt;
&lt;li&gt;Serve a custom HTML page with the message: &lt;strong&gt;&lt;em&gt;“Welcome to DevOps Stage 0 - [Your Name]/[SlackName]”&lt;/em&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Document the process in a blog post, reflecting on challenges, solutions, and personal growth.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;My Approach to Completing the Task&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Setting Up the Ubuntu Server on DigitalOcean&lt;/strong&gt;&lt;br&gt;
I started by creating a fresh Ubuntu server on DigitalOcean. Here’s how I did it:  &lt;/p&gt;

&lt;p&gt;&lt;code&gt;1.&lt;/code&gt; Sign in to DigitalOcean:&lt;br&gt;&lt;br&gt;
   If you don’t have an account, you can create one at &lt;a href="https://digitalocean.pxf.io/EEz01W" rel="noopener noreferrer"&gt;DigitalOcean&lt;/a&gt;.  &lt;/p&gt;

&lt;p&gt;&lt;code&gt;2.&lt;/code&gt; Create a New Droplet:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to the Create section and select Droplets. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdfq6eo23ihiv7topo5vt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdfq6eo23ihiv7topo5vt.png" alt="Create Droplet" width="800" height="489"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Choose Ubuntu 20.04 (or any preferred version).
&lt;/li&gt;
&lt;li&gt;Select the smallest plan (it’s sufficient for this task).
&lt;/li&gt;
&lt;li&gt;Add your SSH key for secure access (or use a password). 
You can generate an ssh key-pair on your local machine wih:
&lt;code&gt;ssh-keyen&lt;/code&gt;.
The directories where your public and private keys  are saved will be displayed, &lt;code&gt;cat&lt;/code&gt; into your public key and copy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmc9dzhhez08rmnyyyeb6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmc9dzhhez08rmnyyyeb6.png" alt="Generate key-pair" width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Choose a data center region close to your location for faster access.
&lt;/li&gt;
&lt;li&gt;Click Create Droplet. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff2ob8ei4gbvnzae379rt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff2ob8ei4gbvnzae379rt.png" alt="Droplet" width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;3.&lt;/code&gt; Access the Droplet: &lt;/p&gt;

&lt;p&gt;Once the droplet was created, I connected to it via SSH on my local machine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh root@your_droplet_ip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fan5ubu9p0p79rtaizmdl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fan5ubu9p0p79rtaizmdl.png" alt="ssh on local machine" width="800" height="542"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Installing NGINX&lt;/strong&gt;&lt;br&gt;
Next, I installed NGINX using Ubuntu’s package manager, apt. Here’s how I did it:  &lt;/p&gt;

&lt;p&gt;&lt;code&gt;1.&lt;/code&gt; Update the Server:&lt;br&gt;&lt;br&gt;
   Before installing NGINX, I updated the server to ensure all packages were up to date:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt upgrade -y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;2.&lt;/code&gt; Install NGINX:&lt;br&gt;&lt;br&gt;
   I installed NGINX with the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt install nginx -y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;3.&lt;/code&gt; Start and Enable NGINX:&lt;br&gt;&lt;br&gt;
   After installation, I started the NGINX service and enabled it to run on boot:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo systemctl start nginx
sudo systemctl enable nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw131f47hhlmrys3bu4st.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw131f47hhlmrys3bu4st.png" alt="NGINX status" width="800" height="233"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;4.&lt;/code&gt; Verify NGINX Installation:&lt;br&gt;&lt;br&gt;
   To confirm that NGINX was running, I opened my browser and visited &lt;code&gt;http://&amp;lt;your_droplet_ip&amp;gt;&lt;/code&gt;. The default NGINX welcome page appeared, indicating a successful installation.  &lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F05cta8pqcptxrkqixmyk.png" alt="NGINX page" width="800" height="233"&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Configuring the Custom HTML Page&lt;/strong&gt;&lt;br&gt;
The task required serving a custom HTML page as the default page. Here’s how I configured it:  &lt;/p&gt;

&lt;p&gt;&lt;code&gt;1.&lt;/code&gt; Navigate to the Web Directory:&lt;br&gt;&lt;br&gt;
   I moved to the default directory for web content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd /var/www/html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2.&lt;code&gt;Create the Custom HTML File:  &lt;br&gt;
&lt;/code&gt;   I opened the index.html file with a text editor (I used &lt;code&gt;nano&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo nano /var/www/html/index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;3.&lt;/code&gt; Add the Custom Message:&lt;br&gt;&lt;br&gt;
   I added the following HTML code to the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang="en"&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset="UTF-8"&amp;gt;
    &amp;lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&amp;gt;
    &amp;lt;title&amp;gt;Welcome&amp;lt;/title&amp;gt;
    &amp;lt;style&amp;gt;
        body {
            font-family: Arial, sans-serif;
            background-color: #2C3E50;
            text-align: center;
            padding: 50px;
        }

        h1 {
            color: #4CAF50;
            font-size: 2.5em;
        }

        h3 {
            color: white;
            font-size: 1.5em;
        }

        p {
            color: #333;
            font-size: 1.2em;
        }
    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;Welcome to DevOps Stage 0&amp;lt;/h1&amp;gt;
    &amp;lt;p&amp;gt;&amp;lt;h3&amp;gt;[Your Name]/[SlackName]&amp;lt;/h3&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I replaced [Your Name] and [SlackName] with my actual name and Slack username.  &lt;/p&gt;

&lt;p&gt;&lt;code&gt;4.&lt;/code&gt; Save and Exit:&lt;br&gt;&lt;br&gt;
   I saved the file and exited the editor (&lt;code&gt;CTRL+X&lt;/code&gt;, then Y, then &lt;code&gt;Enter&lt;/code&gt;).  &lt;/p&gt;

&lt;p&gt;&lt;code&gt;5.&lt;/code&gt; Restart NGINX:&lt;br&gt;&lt;br&gt;
   To apply the changes, I restarted NGINX:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo systemctl restart nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;6.&lt;/code&gt; Access the Custom Page:&lt;br&gt;&lt;br&gt;
   I revisited &lt;code&gt;http://&amp;lt;your_droplet_ip&amp;gt;&lt;/code&gt; in my browser, and the custom HTML page was displayed with the correct message.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiuuyvjlj0xiubw5kxpie.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiuuyvjlj0xiubw5kxpie.png" alt="Custom page" width="800" height="237"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Challenges I Faced&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Permission Issues&lt;/strong&gt;&lt;br&gt;
When I first tried to edit the &lt;code&gt;/var/www/html/index.html&lt;/code&gt; file, I ran into permission issues. I resolved this by using &lt;em&gt;&lt;strong&gt;sudo&lt;/strong&gt;&lt;/em&gt; to gain the necessary privileges:  &lt;code&gt;sudo nano /var/www/html/index.html&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Task Requirements&lt;/strong&gt;&lt;br&gt;
To meet the task requirements, I added the &lt;em&gt;&lt;strong&gt;index.html&lt;/strong&gt;&lt;/em&gt; file located at &lt;code&gt;/var/www/html/index.html&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;References&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;As part of this task, I referenced the following resources to deepen my understanding of DevOps roles:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hng.tech/hire/devops-engineers" rel="noopener noreferrer"&gt;DevOps Engineers&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hng.tech/hire/cloud-engineers" rel="noopener noreferrer"&gt;Cloud Engineers&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These links provided insights into the responsibilities, skills, and career paths for DevOps professionals.&lt;/p&gt;

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

&lt;p&gt;Completing this task provided a good foundation in web server setup and configuration, key skills for any DevOps engineer. More importantly, it highlighted the power of hands-on experience in learning.&lt;/p&gt;

&lt;p&gt;For anyone starting in DevOps, I highly recommend working on similar projects. The process of troubleshooting and fixing issues will help you develop confidence and critical thinking skills.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>nginx</category>
      <category>hng</category>
    </item>
    <item>
      <title>Linux User Creation- Bash Scripting</title>
      <dc:creator>Lucy Alfred Joshua</dc:creator>
      <pubDate>Sun, 07 Jul 2024 22:10:37 +0000</pubDate>
      <link>https://forem.com/lucy_76er/linux-user-creation-bash-scripting-4868</link>
      <guid>https://forem.com/lucy_76er/linux-user-creation-bash-scripting-4868</guid>
      <description>&lt;p&gt;In today's DevOps environments, automating routine system administration tasks is necessary for efficiency and consistency. One common task is the creation and management of user accounts on Linux systems. This article structure adheres to the technical requirements specified in the &lt;a href="https://hng.tech/internship" rel="noopener noreferrer"&gt;HNG Internship&lt;/a&gt; stage one task.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;u&gt;&lt;strong&gt;HNG Task&lt;/strong&gt;&lt;/u&gt;
&lt;/h2&gt;

&lt;p&gt;Your company has employed many new developers. As a SysOps engineer, write a bash script called &lt;code&gt;create_users.sh&lt;/code&gt; that reads a text file containing the employee’s usernames and group names, where each line is formatted as &lt;code&gt;user;groups&lt;/code&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Script Development&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The Bash script is designed to automate the creation of users based on input from a text file.  This script addresses specific requirements such as creating users with appropriate groups, setting up home directories, generating secure passwords, and logging all actions for auditing purposes. Passwords are to be stored securely in &lt;code&gt;/var/secure/user_passwords.txt&lt;/code&gt; and all actions logged to &lt;code&gt;/var/log/user_management.log&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Setup and Initialization&lt;/strong&gt;&lt;br&gt;
The script begins by ensuring that the necessary directories and files are in place:&lt;br&gt;
&lt;/p&gt;

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

# Ensure log and password files are created and secured
mkdir -p /var/log /var/secure
touch /var/log/user_management.log
touch /var/secure/user_passwords.txt
chmod 600 /var/secure/user_passwords.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These commands create /var/log and /var/secure directories if they do not exist. It also initializes user_management.log and user_passwords.txt with appropriate permissions for logging actions and storing passwords securely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Logging Functionality&lt;/strong&gt;&lt;br&gt;
The script uses a function log_action() to log each action performed during user creation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Function to log actions with timestamp
log_action() {
    echo "$(date) - $1" &amp;gt;&amp;gt; "/var/log/user_management.log"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This function appends a timestamped message to user_management.log for each significant action, providing a detailed record of user management activities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. User Creation Logic&lt;/strong&gt;&lt;br&gt;
The core of the script involves the create_user() function, which handles user creation based on input parameters:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Function to create user and manage groups
create_user() {
    local username="$1"
    local groups="$2"
    local password

    # Check if user already exists
    if id "$username" &amp;amp;&amp;gt;/dev/null; then
        log_action "User $username already exists. Skipping."
        return
    fi

    # Create user's primary group
    groupadd "$username"
    log_action "Group $username created."

    # Create additional groups if they don't exist
    IFS=' ' read -ra group_array &amp;lt;&amp;lt;&amp;lt; "$groups"
    for group in "${group_array[@]}"; do
        group=$(echo "$group" | xargs)
        if ! getent group "$group" &amp;amp;&amp;gt;/dev/null; then
            groupadd "$group"
            log_action "Group $group created."
        fi
    done

    # Add user to groups
    useradd -m -s /bin/bash -g "$username" "$username"
    if [ $? -eq 0 ]; then
        log_action "User $username created with primary group: $username"
    else
        log_action "Failed to create user $username."
        return
    fi

    for group in "${group_array[@]}"; do
        usermod -aG "$group" "$username"
    done
    log_action "User $username added to groups: ${group_array[*]}"

    # Generate random password
    password=$(&amp;lt;/dev/urandom tr -dc A-Za-z0-9 | head -c 12)
    echo "$username:$password" | chpasswd

    # Store password securely
    echo "$username,$password" &amp;gt;&amp;gt; "/var/secure/user_passwords.txt"
    log_action "Password for user $username set and stored securely."

    # Set permissions and ownership
    chmod 700 "/home/$username"
    chown "$username:$username" "/home/$username"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Checks if the user already exists.&lt;br&gt;
Creates the user's primary group.&lt;br&gt;
Checks and creates additional specified groups.&lt;br&gt;
Creates the user account with a home directory and bash shell.&lt;br&gt;
Sets passwords securely.&lt;br&gt;
Logs password creation and user permissions setup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Execution and Input Validation&lt;/strong&gt;&lt;br&gt;
The script validates input and processes each line from the specified user list file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Check for input file argument
if [ $# -ne 1 ]; then
    echo "Usage: $0 &amp;lt;user_list_file&amp;gt;"
    exit 1
fi

filename="$1"

# Verify input file existence
if [ ! -f "$filename" ]; then
    echo "Users list file $filename not found."
    exit 1
fi

# Read user list file and create users
while IFS=';' read -r username groups; do
    username=$(echo "$username" | xargs)
    groups=$(echo "$groups" | xargs | tr -d ' ')
    groups=$(echo "$groups" | tr ',' ' ')
    create_user "$username" "$groups"
done &amp;lt; "$filename"

echo "User creation process completed."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bash scripting automates user creation and management on Linux systems, making system administration duties easier and more efficient. By following best practices in security, logging, and error handling, the script (create_users.sh) built in this article illustrates its efficiency in efficiently and safely managing user accounts. This strategy not only increases operational efficiency but also ensures consistency and adherence to organizational security requirements.&lt;/p&gt;

&lt;p&gt;References:&lt;/p&gt;

&lt;p&gt;Learn more about HNG Internship: &lt;a href="https://hng.tech/internship" rel="noopener noreferrer"&gt;HNG Internship Program&lt;/a&gt;&lt;br&gt;
Explore further opportunities with HNG: &lt;a href="https://hng.tech/hire" rel="noopener noreferrer"&gt;HNG Hire&lt;/a&gt;&lt;/p&gt;

</description>
      <category>linux</category>
      <category>bash</category>
      <category>ubuntu</category>
      <category>devops</category>
    </item>
    <item>
      <title>Linux User Creation- Bash Scripting</title>
      <dc:creator>Lucy Alfred Joshua</dc:creator>
      <pubDate>Sun, 07 Jul 2024 22:10:37 +0000</pubDate>
      <link>https://forem.com/lucy_76er/linux-user-creation-bash-scripting-kl1</link>
      <guid>https://forem.com/lucy_76er/linux-user-creation-bash-scripting-kl1</guid>
      <description>&lt;p&gt;In today's DevOps environments, automating routine system administration tasks is necessary for efficiency and consistency. One common task is the creation and management of user accounts on Linux systems. This article structure adheres to the technical requirements specified in the &lt;a href="https://hng.tech/internship" rel="noopener noreferrer"&gt;HNG Internship&lt;/a&gt; stage one task.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;u&gt;&lt;strong&gt;HNG Task&lt;/strong&gt;&lt;/u&gt;
&lt;/h2&gt;

&lt;p&gt;Your company has employed many new developers. As a SysOps engineer, write a bash script called &lt;code&gt;create_users.sh&lt;/code&gt; that reads a text file containing the employee’s usernames and group names, where each line is formatted as &lt;code&gt;user;groups&lt;/code&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Script Development&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The Bash script is designed to automate the creation of users based on input from a text file (In this instance, the text file is named &lt;code&gt;user_info.txt&lt;/code&gt; and the script, &lt;code&gt;create_users.sh&lt;/code&gt;.  This script addresses specific requirements such as creating users with appropriate groups, setting up home directories, generating secure passwords, and logging all actions for auditing purposes. Passwords are to be stored securely in &lt;code&gt;/var/secure/user_passwords.txt&lt;/code&gt; and all actions logged to &lt;code&gt;/var/log/user_management.log&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Setup and Initialization&lt;/strong&gt;&lt;br&gt;
The script begins by ensuring that the necessary directories and files are in place:&lt;br&gt;
&lt;/p&gt;

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

# Ensure log and password files are created and secured
mkdir -p /var/log /var/secure
touch /var/log/user_management.log
touch /var/secure/user_passwords.txt
chmod 600 /var/secure/user_passwords.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These commands create /var/log and /var/secure directories if they do not exist. It also initializes user_management.log and user_passwords.txt with appropriate permissions for logging actions and storing passwords securely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Logging Functionality&lt;/strong&gt;&lt;br&gt;
The script uses a function log_action() to log each action performed during user creation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Function to log actions with timestamp
log_action() {
    echo "$(date) - $1" &amp;gt;&amp;gt; "/var/log/user_management.log"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This function adds a time-stamped message to user_management.log for each significant activity, which gives an extensive record of user management actions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. User Creation Logic&lt;/strong&gt;&lt;br&gt;
The core of the script involves the create_user() function, which handles user creation based on input parameters:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Function to create user and manage groups
create_user() {
    local username="$1"
    local groups="$2"
    local password

    # Check if user already exists
    if id "$username" &amp;amp;&amp;gt;/dev/null; then
        log_action "User $username already exists. Skipping."
        return
    fi

    # Create user's primary group
    groupadd "$username"
    log_action "Group $username created."

    # Create additional groups if they don't exist
    IFS=' ' read -ra group_array &amp;lt;&amp;lt;&amp;lt; "$groups"
    for group in "${group_array[@]}"; do
        group=$(echo "$group" | xargs)
        if ! getent group "$group" &amp;amp;&amp;gt;/dev/null; then
            groupadd "$group"
            log_action "Group $group created."
        fi
    done

    # Add user to groups
    useradd -m -s /bin/bash -g "$username" "$username"
    if [ $? -eq 0 ]; then
        log_action "User $username created with primary group: $username"
    else
        log_action "Failed to create user $username."
        return
    fi

    for group in "${group_array[@]}"; do
        usermod -aG "$group" "$username"
    done
    log_action "User $username added to groups: ${group_array[*]}"

    # Generate random password
    password=$(&amp;lt;/dev/urandom tr -dc A-Za-z0-9 | head -c 12)
    echo "$username:$password" | chpasswd

    # Store password securely
    echo "$username,$password" &amp;gt;&amp;gt; "/var/secure/user_passwords.txt"
    log_action "Password for user $username set and stored securely."

    # Set permissions and ownership
    chmod 700 "/home/$username"
    chown "$username:$username" "/home/$username"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Checks if the user already exists.&lt;br&gt;
Creates the user's primary group.&lt;br&gt;
Checks and creates additional specified groups.&lt;br&gt;
Creates the user account with a home directory and bash shell.&lt;br&gt;
Sets passwords securely.&lt;br&gt;
Logs password creation and user permissions setup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Execution and Input Validation&lt;/strong&gt;&lt;br&gt;
The script validates input and processes each line from the specified user list file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Check for input file argument
if [ $# -ne 1 ]; then
    echo "Usage: $0 &amp;lt;user_list_file&amp;gt;"
    exit 1
fi

filename="$1"

# Verify input file existence
if [ ! -f "$filename" ]; then
    echo "Users list file $filename not found."
    exit 1
fi

# Read user list file and create users
while IFS=';' read -r username groups; do
    username=$(echo "$username" | xargs)
    groups=$(echo "$groups" | xargs | tr -d ' ')
    groups=$(echo "$groups" | tr ',' ' ')
    create_user "$username" "$groups"
done &amp;lt; "$filename"

echo "User creation process completed."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bash scripting automates user creation and management on Linux systems, making system administration duties easier and more efficient. By following best practices in security, logging, and error handling, the script (create_users.sh) built in this article illustrates its efficiency in efficiently and safely managing user accounts. This strategy not only increases operational efficiency but also ensures consistency and adherence to organizational security requirements.&lt;/p&gt;

&lt;p&gt;References:&lt;/p&gt;

&lt;p&gt;Learn more about HNG Internship: &lt;a href="https://hng.tech/internship" rel="noopener noreferrer"&gt;HNG Internship Program&lt;/a&gt;&lt;br&gt;
Explore further opportunities with HNG: &lt;a href="https://hng.tech/hire" rel="noopener noreferrer"&gt;HNG Hire&lt;/a&gt;&lt;/p&gt;

</description>
      <category>linux</category>
      <category>bash</category>
      <category>ubuntu</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
