<?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: Olatunbosun Olalegbin</title>
    <description>The latest articles on DEV Community by Olatunbosun Olalegbin (@tosyeno).</description>
    <link>https://dev.to/tosyeno</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%2F1712293%2F4330b4c5-c44b-42c8-b0c3-32723dd0bb32.png</url>
      <title>DEV Community: Olatunbosun Olalegbin</title>
      <link>https://dev.to/tosyeno</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tosyeno"/>
    <language>en</language>
    <item>
      <title>NGINX Server Implementation Using CloudFront</title>
      <dc:creator>Olatunbosun Olalegbin</dc:creator>
      <pubDate>Thu, 30 Jan 2025 19:26:07 +0000</pubDate>
      <link>https://dev.to/tosyeno/nginx-server-implementation-using-cloudfront-28l0</link>
      <guid>https://dev.to/tosyeno/nginx-server-implementation-using-cloudfront-28l0</guid>
      <description>&lt;p&gt;&lt;strong&gt;Project Overview&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The task involved setting up an NGINX web server and configuring it with AWS CloudFront to serve a custom HTML page. This implementation combines fundamental web server configuration with cloud service integration, representing a common real-world DevOps scenario.&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;&lt;strong&gt;1. Implementation Approach&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Set up NGINX on an EC2 instance&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%2F6wgq9z2oc0cnz0u4ku0d.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%2F6wgq9z2oc0cnz0u4ku0d.png" alt="Image description" width="800" height="365"&gt;&lt;/a&gt;&lt;br&gt;
Above image is the EC2 instance "nginx-server". &lt;/p&gt;

&lt;p&gt;I. To install NGINX on ec2 instance;&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
sudo apt install nginx -y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;II. Create the custom index page;&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;HTML content is therefore copied into the file created. And here is the HTML content;&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&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;DevOps Stage 0&amp;lt;/title&amp;gt;
    &amp;lt;style&amp;gt;
        body {
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            margin: 0;
            font-family: Arial, sans-serif;
            background-color: #f0f2f5;
        }
        .message {
            text-align: center;
            padding: 20px;
            background-color: white;
            border-radius: 8px;
            box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
        }
    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;div class="message"&amp;gt;
        &amp;lt;h1&amp;gt;Welcome to DevOps stage 0&amp;lt;/h1&amp;gt;
        &amp;lt;p&amp;gt;[Your Name]/[SlackName]&amp;lt;/p&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open the nginx file using the command line below;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo vi /etc/nginx/sites-available/default
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copy below NGINX configuration into the above file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;server {
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www/html;
    index index.html;

    server_name _;

    location / {
        try_files $uri $uri/ =404;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Created a custom HTML welcome page&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%2Fhcuufk3i25xcgbmv65ta.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%2Fhcuufk3i25xcgbmv65ta.png" alt="Image description" width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;III. Test the configuration&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Integrated with AWS CloudFront for content delivery&lt;/p&gt;

&lt;p&gt;Here is the overview of the CloudFront setup from AWS console;&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%2Fod308efmh4hbv1iv06cp.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%2Fod308efmh4hbv1iv06cp.png" alt="Image description" width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And below is the outcome webpage after nginx webserver configuration using the HTML content.&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%2Ftpurosidxqytom27jawm.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%2Ftpurosidxqytom27jawm.png" alt="Image description" width="800" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;2. Challenges Faced and Solutions&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Challenge 1: NGINX Configuration Syntax Errors&lt;/p&gt;

&lt;p&gt;Issue: Server_name directive placement error&lt;br&gt;
Root Cause: Incorrect configuration file structure and context placement&lt;br&gt;
Solution: Restructured the NGINX configuration by:&lt;/p&gt;

&lt;p&gt;Properly nesting directives within appropriate contexts&lt;br&gt;
Separating main configuration from server blocks&lt;br&gt;
Following NGINX's hierarchical configuration structure&lt;/p&gt;

&lt;p&gt;Challenge 2: Duplicate Default Server&lt;/p&gt;

&lt;p&gt;Issue: Multiple default server blocks causing conflicts&lt;br&gt;
Root Cause: Overlapping configurations in different files&lt;br&gt;
Solution:&lt;/p&gt;

&lt;p&gt;Cleaned up redundant configuration files&lt;br&gt;
Established a single source of truth for server block configuration&lt;br&gt;
Properly managed symbolic links in sites-enabled directory&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learning Outcomes&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Technical Skills Acquired&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Deep understanding of NGINX configuration structure&lt;br&gt;
Experience with AWS CloudFront setup and integration&lt;br&gt;
Practical knowledge of Linux system administration&lt;br&gt;
Web server security configuration&lt;br&gt;
Troubleshooting skills for web server issues&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DevOps Best Practices&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Configuration management&lt;br&gt;
Infrastructure as Code principles&lt;br&gt;
Security considerations in web hosting&lt;br&gt;
High availability and content delivery optimization&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Professional Development Impact&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Enhanced problem-solving capabilities&lt;br&gt;
Experience with industry-standard tools&lt;br&gt;
Understanding of enterprise-level web hosting architecture&lt;br&gt;
Documentation and technical communication skills&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-World Applications&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enterprise Relevance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Content delivery optimization&lt;br&gt;
High availability web hosting&lt;br&gt;
Cloud service integration&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Career Growth Opportunities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Foundation for more complex DevOps tasks&lt;br&gt;
Relevant experience for cloud engineering roles&lt;br&gt;
Understanding of production environment setup&lt;br&gt;
Skills applicable to various IT infrastructure roles&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Configuration Management&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep configurations modular&lt;/li&gt;
&lt;li&gt;Maintain clear documentation&lt;/li&gt;
&lt;li&gt;Follow the principle of least privilege&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This task provides a solid foundation in web server configuration and cloud service integration, essential skills for any DevOps engineer. The challenges faced and solutions implemented offer valuable learning experiences that directly contribute to professional growth in cloud computing and system administration.&lt;/p&gt;

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

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

&lt;p&gt;Thank you!!!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Automating User and Group Management with a Bash Script in Linux</title>
      <dc:creator>Olatunbosun Olalegbin</dc:creator>
      <pubDate>Mon, 01 Jul 2024 14:57:30 +0000</pubDate>
      <link>https://dev.to/tosyeno/automating-user-and-group-management-with-a-bash-script-3d6h</link>
      <guid>https://dev.to/tosyeno/automating-user-and-group-management-with-a-bash-script-3d6h</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Managing users and groups on a Linux system can be a repetitive and error-prone task, especially in environments with frequent onboarding of new developers. To streamline this process, we've developed a bash script called create_users.sh. This script reads a text file containing employee usernames and group names, creates the users and groups as specified, sets up home directories with appropriate permissions, generates random passwords for the users, and logs all actions. Additionally, it stores the generated passwords securely. This article explains the functionality and usage of the create_users.sh script in detail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Script Overview&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The create_users.sh script automates the following tasks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Reads user and group information from a specified text file.&lt;/li&gt;
&lt;li&gt; Creates users and groups if they do not already exist.&lt;/li&gt;
&lt;li&gt; Sets up home directories with appropriate permissions and ownership.&lt;/li&gt;
&lt;li&gt; Generates random passwords for new users.&lt;/li&gt;
&lt;li&gt; Logs all actions to /var/log/user_management.log.&lt;/li&gt;
&lt;li&gt; Stores generated passwords securely in /var/secure/user_passwords.txt.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;&lt;br&gt;
• The script must be run with root privileges.&lt;br&gt;
• Ensure the target text file containing user information exists.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Script Structure&lt;/strong&gt;&lt;br&gt;
Here's the complete create_users.sh script:&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

# Script to create users and groups, set up home directories, generate passwords,
# and log actions.

# Log file path
LOG_FILE="/var/log/user_management.log"
PASSWORD_FILE="/var/secure/user_passwords.txt"
ENCRYPTION_KEY="/var/secure/encryption_key.txt"

# Function to log messages
log_message() {
    local message=$1
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $message" &amp;gt;&amp;gt; $LOG_FILE
}

# Function to generate a random password
generate_password() {
    local password_length=12
    tr -dc A-Za-z0-9 &amp;lt;/dev/urandom | head -c $password_length
}

# Ensure the secure directory exists
if [ ! -d /var/secure ]; then
    mkdir -p /var/secure
    chmod 700 /var/secure
    log_message "Created /var/secure directory with 700 permissions."
fi

# Ensure the log file and encryption key exist
touch $LOG_FILE
touch $PASSWORD_FILE
chmod 600 $PASSWORD_FILE

# Generate encryption key if it doesn't exist
if [ ! -f "$ENCRYPTION_KEY" ]; then
    openssl rand -base64 32 &amp;gt; $ENCRYPTION_KEY
    chmod 600 $ENCRYPTION_KEY
    log_message "Generated encryption key."
fi

# Function to encrypt password
encrypt_password() {
    local password=$1
    local encrypted_password=$(echo -n "$password" | openssl enc -aes-256-cbc -base64 -pass file:$ENCRYPTION_KEY)
    echo $encrypted_password
}

# Check if input file is provided
if [ -z "$1" ]; then
    echo "Usage: $0 &amp;lt;user_file&amp;gt;"
    exit 1
fi

USER_FILE="$1"

# Check if the user file exists
if [ ! -f "$USER_FILE" ]; then
    echo "User file not found: $USER_FILE"
    exit 1
fi

# Read the user file line by line
while IFS=';' read -r username groups; do
    # Skip empty lines or lines without proper format
    if [ -z "$username" ] || [ -z "$groups" ]; then
        log_message "Skipped invalid line: username='$username', groups='$groups'"
        continue
    fi

    # Check if the user already exists
    if id -u "$username" &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then
        log_message "User $username already exists."
        continue
    fi

    # Create user-specific group if it doesn't exist
    if ! getent group "$username" &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then
        groupadd "$username"
        log_message "Created group $username."
    fi

    # Create the user with the user-specific group
    useradd -m -g "$username" -s /bin/bash "$username"
    if [ $? -eq 0 ]; then
        log_message "Created user $username with personal group $username."
    else
        log_message "Failed to create user $username."
        continue
    fi

    # Add user to the specified groups
    IFS=',' read -ra group_array &amp;lt;&amp;lt;&amp;lt; "$groups"
    for group in "${group_array[@]}"; do
        if ! getent group "$group" &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then
            groupadd "$group"
            log_message "Created group $group."
        fi
        usermod -aG "$group" "$username"
        log_message "Added user $username to group $group."
    done

    # Set up home directory permissions
    chmod 700 /home/"$username"
    chown "$username":"$username" /home/"$username"
    log_message "Set permissions for home directory of $username."

    # Generate a random password
    password=$(generate_password)
    echo "$username:$password" | chpasswd
    log_message "Set password for user $username."

    # Encrypt and store the password securely
    encrypted_password=$(encrypt_password "$password")
    echo "$username:$encrypted_password" &amp;gt;&amp;gt; $PASSWORD_FILE
done &amp;lt; "$USER_FILE"

log_message "User creation script completed."

echo "Script execution completed. Check $LOG_FILE for details."

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;&lt;strong&gt;Log and Password File Setup&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The script initializes the log file &lt;em&gt;(/var/log/user_management.log)&lt;/em&gt; and the password file (&lt;em&gt;/var/secure/user_passwords.txt&lt;/em&gt;), ensuring they exist and have secure permissions.&lt;/p&gt;

&lt;p&gt;Ensure Secure Directory: Checks if the /var/secure directory exists. If not, it creates the directory and sets its permissions to &lt;code&gt;700&lt;/code&gt; (owner can read, write, and execute; others have no permissions). It then logs this action.&lt;/p&gt;

&lt;p&gt;Log File Path: Defines the paths for the log file and the password file.&lt;/p&gt;

&lt;p&gt;Logging Function: Defines a function to log messages with timestamps to the log file. This helps keep track of script activities and errors.&lt;/p&gt;

&lt;p&gt;Password Generation Function: Defines a function to generate a random password of a specified length (12 characters). The &lt;code&gt;tr&lt;/code&gt; command filters out unwanted characters, and &lt;code&gt;head -c&lt;/code&gt; limits the output to the specified length.&lt;/p&gt;

&lt;p&gt;Ensure Log and Password Files: Ensures that the log file and password file exist and sets their permissions to &lt;code&gt;600&lt;/code&gt; (owner can read and write; others have no permissions).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;User File Verification&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Validate User File: Checks if the specified user file exists. If not, it displays an error message and exits. The script verifies that a user file is provided as an argument and that the file exists.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;User and Group Creation Function&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The create_user_and_groups function handles the creation of users and groups. It reads the username and groups, creates any missing groups, and then creates the user if they do not already exist.&lt;/p&gt;

&lt;p&gt;Create Groups: Splits the &lt;code&gt;groups&lt;/code&gt; string by commas into an array and iterates over it. For each group, it checks if the group exists. If not, it creates the group and logs this action.&lt;/p&gt;

&lt;p&gt;Create User: Creates the user with the specified groups and sets the shell to &lt;code&gt;/bin/bash&lt;/code&gt;. The &lt;code&gt;-m&lt;/code&gt; option creates a home directory for the user. It logs the action or any failure.&lt;/p&gt;

&lt;p&gt;Set Home Directory Permissions: Sets the permissions of the user's home directory to &lt;code&gt;700&lt;/code&gt; (only the user can read, write, and execute) and changes the ownership to the user. Logs this action.&lt;br&gt;
Generate and Set Password: Generates a random password, sets it for the user, and logs this action.&lt;br&gt;
Store Password Securely: Appends the username and password to the password file&lt;br&gt;
Completion Message: Logs the completion of the script and outputs a message indicating the script has finished.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Usage Example&lt;/strong&gt;&lt;br&gt;
To use the script, prepare a user file (e.g., users.txt) with the following format:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tosyeno;developers,hngintern,admin
olanifemi;developers,admin
olusam;admin,hngintern
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run the script with the path to your user file as an argument:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo ./create_users.sh users.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verifying Group Creation&lt;/p&gt;

&lt;p&gt;To verify that the groups have been created, use the getent group groupname command:&lt;/p&gt;

&lt;p&gt;getent group developers&lt;br&gt;
getent group hngintern&lt;br&gt;
getent group admin&lt;/p&gt;

&lt;p&gt;If the groups exist, these commands will output the group information.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The create_users.sh script provides a robust solution for automating user and group management tasks on a Linux system. By automating these tasks, you can ensure consistency, save time, and reduce the risk of manual errors. This script is especially useful in environments with frequent onboarding of new developers, ensuring that all necessary steps are handled efficiently and securely.&lt;/p&gt;

&lt;p&gt;HNG internship made this possible and you can reach them on either &lt;a href="https://hng.tech/internship"&gt;https://hng.tech/internship&lt;/a&gt; or &lt;a href="https://hng.tech/premium"&gt;https://hng.tech/premium&lt;/a&gt; to be part of the internship program. You can be sure of value for your invested time.&lt;/p&gt;

&lt;p&gt;Thank you&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
