DEV Community

Cover image for Ansible projects:Hands-on with essential automation skills
Avesh
Avesh

Posted on

Ansible projects:Hands-on with essential automation skills

1. Automated Web Server Deployment

Overview

This project automates the setup of an Nginx or Apache web server on multiple hosts. It’s commonly used for creating web server clusters and ensuring consistent configurations across servers.

Project Structure

webserver-deployment/
├── playbook.yml
├── inventory.ini
└── roles/
    └── webserver/
        ├── tasks/
        │   └── main.yml
        ├── handlers/
        │   └── main.yml
        └── vars/
            └── main.yml
Enter fullscreen mode Exit fullscreen mode

Steps

  1. Define the Inventory File (inventory.ini):
   [webservers]
   server1 ansible_host=192.168.1.101
   server2 ansible_host=192.168.1.102
Enter fullscreen mode Exit fullscreen mode
  1. Create Playbook (playbook.yml):
   - name: Deploy Web Server
     hosts: webservers
     roles:
       - webserver
Enter fullscreen mode Exit fullscreen mode
  1. Define the Role (roles/webserver):

    • Tasks (tasks/main.yml):
     - name: Install Nginx
       ansible.builtin.yum:
         name: nginx
         state: present
    
     - name: Start and Enable Nginx
       ansible.builtin.service:
         name: nginx
         state: started
         enabled: yes
    
  • Handlers (handlers/main.yml):

     - name: Restart Nginx
       ansible.builtin.service:
         name: nginx
         state: restarted
    
  • Variables (vars/main.yml):

     nginx_port: 80
    
  1. Run the Playbook:
   ansible-playbook -i inventory.ini playbook.yml
Enter fullscreen mode Exit fullscreen mode

2. User Management System

Overview

This project manages users and groups across multiple servers, which is helpful in environments where you need centralized user management.

Project Structure

user-management/
├── playbook.yml
├── inventory.ini
└── roles/
    └── user/
        ├── tasks/
        │   └── main.yml
        └── vars/
            └── main.yml
Enter fullscreen mode Exit fullscreen mode

Steps

  1. Define the Inventory (inventory.ini):
   [userservers]
   server1 ansible_host=192.168.1.101
Enter fullscreen mode Exit fullscreen mode
  1. Playbook (playbook.yml):
   - name: User Management
     hosts: userservers
     roles:
       - user
Enter fullscreen mode Exit fullscreen mode
  1. Role Structure (roles/user):

    • Tasks (tasks/main.yml):
     - name: Create a group
       ansible.builtin.group:
         name: "{{ group_name }}"
         state: present
    
     - name: Create user
       ansible.builtin.user:
         name: "{{ user_name }}"
         group: "{{ group_name }}"
         state: present
    
  • Variables (vars/main.yml):

     user_name: john
     group_name: developers
    
  1. Run the Playbook:
   ansible-playbook -i inventory.ini playbook.yml
Enter fullscreen mode Exit fullscreen mode

3. Database Server Setup (MySQL)

Overview

This project configures a MySQL server, sets up databases, and defines users with necessary permissions.

Project Structure

mysql-setup/
├── playbook.yml
├── inventory.ini
└── roles/
    └── mysql/
        ├── tasks/
        │   └── main.yml
        ├── handlers/
        │   └── main.yml
        └── vars/
            └── main.yml
Enter fullscreen mode Exit fullscreen mode

Steps

  1. Inventory File (inventory.ini):
   [dbservers]
   server1 ansible_host=192.168.1.103
Enter fullscreen mode Exit fullscreen mode
  1. Playbook (playbook.yml):
   - name: MySQL Server Setup
     hosts: dbservers
     roles:
       - mysql
Enter fullscreen mode Exit fullscreen mode
  1. Role Structure (roles/mysql):

    • Tasks (tasks/main.yml):
     - name: Install MySQL
       ansible.builtin.yum:
         name: mysql-server
         state: present
    
     - name: Start MySQL Service
       ansible.builtin.service:
         name: mysqld
         state: started
         enabled: yes
    
     - name: Create MySQL Database
       ansible.builtin.mysql_db:
         name: "{{ db_name }}"
         state: present
    
     - name: Create MySQL User
       ansible.builtin.mysql_user:
         name: "{{ db_user }}"
         password: "{{ db_pass }}"
         priv: "*.*:ALL"
         state: present
    
  • Variables (vars/main.yml):

     db_name: my_database
     db_user: db_user
     db_pass: db_pass
    
  1. Run the Playbook:
   ansible-playbook -i inventory.ini playbook.yml
Enter fullscreen mode Exit fullscreen mode

4. Application Deployment with Docker

Overview

This project deploys a web application using Docker, making it easier to manage dependencies and scale applications.

Project Structure

docker-deployment/
├── playbook.yml
├── inventory.ini
└── roles/
    └── app/
        ├── tasks/
        │   └── main.yml
        ├── files/
        │   └── Dockerfile
        └── vars/
            └── main.yml
Enter fullscreen mode Exit fullscreen mode

Steps

  1. Inventory (inventory.ini):
   [appservers]
   server1 ansible_host=192.168.1.104
Enter fullscreen mode Exit fullscreen mode
  1. Playbook (playbook.yml):
   - name: Deploy App with Docker
     hosts: appservers
     roles:
       - app
Enter fullscreen mode Exit fullscreen mode
  1. Role Structure (roles/app):

    • Tasks (tasks/main.yml):
     - name: Copy Dockerfile
       ansible.builtin.copy:
         src: Dockerfile
         dest: /tmp/Dockerfile
    
     - name: Build Docker Image
       ansible.builtin.command:
         cmd: docker build -t myapp /tmp
    
     - name: Run Docker Container
       ansible.builtin.docker_container:
         name: myapp
         image: myapp
         state: started
         restart_policy: always
    
  • Dockerfile (files/Dockerfile):

     FROM python:3.8
     WORKDIR /app
     COPY . .
     RUN pip install -r requirements.txt
     CMD ["python", "app.py"]
    
  1. Run the Playbook:
   ansible-playbook -i inventory.ini playbook.yml
Enter fullscreen mode Exit fullscreen mode

5. System Update and Patch Management

Overview

This project automates the system update process across multiple servers, ensuring that all servers are up to date with the latest security patches.

Project Structure

system-update/
├── playbook.yml
└── inventory.ini
Enter fullscreen mode Exit fullscreen mode

Steps

  1. Inventory (inventory.ini):
   [all]
   server1 ansible_host=192.168.1.105
   server2 ansible_host=192.168.1.106
Enter fullscreen mode Exit fullscreen mode
  1. Playbook (playbook.yml):
   - name: System Update and Patching
     hosts: all
     become: yes
     tasks:
       - name: Update all packages
         ansible.builtin.yum:
           name: "*"
           state: latest

       - name: Reboot if Kernel Updated
         ansible.builtin.reboot:
           msg: "Reboot initiated by Ansible for kernel updates"
           connect_timeout: 5
           reboot_timeout: 600
           pre_reboot_delay: 5
           post_reboot_delay: 30
Enter fullscreen mode Exit fullscreen mode
  1. Run the Playbook:
   ansible-playbook -i inventory.ini playbook.yml
Enter fullscreen mode Exit fullscreen mode

These Ansible projects cover essential skills and scenarios. Let me know if you’d like further details on any project or additional configurations!

Top comments (2)

Collapse
 
aniruddhadak profile image
ANIRUDDHA

Just amazing 😻.

Collapse
 
i_am_vesh profile image
Avesh

Thanks man!