# Ansible Installation and Configuration on Ubuntu 

%[https://www.youtube.com/watch?v=1U8ID8j_gLg] 

## Introduction

### What is Ansible?

Ansible is an automation language that can describe any IT environment, whether homelab or large-scale infrastructure. It is easy to learn and reads like clear documentation.

If you manage multiple servers and find yourself doing the same configuration over and over — setting up SSH keys, disabling root users, configuring firewalls — Ansible can automate the entire process and dramatically increase your productivity.

It only requires Ansible on the **Control Node** and **Python 3** on the **Managed Node**.

### What is the Control Node?

The system that Ansible is installed on — it controls the remote machines.

### What is the Managed Node?

The remote system or host that Ansible controls. Ansible is **agentless**, meaning you don't need to install Ansible on managed nodes — just Python 3.

* * *

## Installing Ansible on Ubuntu (Control Node)

```bash
sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository --yes --update ppa:ansible/ansible
sudo apt install ansible
```

> **Note:** Ensure Python 3 is installed on your remote server. Ubuntu 24.04 LTS ships with Python 3 by default.

* * *

## Create the Inventory Folder and Hosts File

The hosts file maps the remote machines you want to control.

**Folder structure:**

Ansible/  
├── inventory/  
│ └── hosts  
└── playbooks/  
└── apt-update.yml

`inventory/hosts`

```ini
[servers]
vpsServer ansible_host=10.10.100.45
work-ToRule
10.10.45.62
```

You can give hosts an alias by pairing a name with an IP address. In the example above, `vpsServer` is an alias for `10.10.100.45`.

* * *

## Your First Playbook — Update Ubuntu and Set Timezone

Create `playbooks/apt-update.yml`:

```yaml
- hosts: '*'
  become: true
  serial: 1
  tasks:
    - name: Set system timezone to Trinidad and Tobago time
      community.general.timezone:
        name: America/Port_of_Spain

    - name: Update apt cache
      apt:
        update_cache: yes
        cache_valid_time: 3600

    - name: Upgrade all packages to the latest version
      apt:
        upgrade: dist

    - name: Check if reboot is required
      stat:
        path: /var/run/reboot-required
      register: reboot_required_file

    - name: Reboot the server
      reboot:
        msg: 'Reboot initiated by Ansible due to package upgrades'
        connect_timeout: 5
        reboot_timeout: 300
        pre_reboot_delay: 0
        post_reboot_delay: 30
      when: reboot_required_file.stat.exists
```

### Breaking Down the Playbook

| Key | Description |
| --- | --- |
| `hosts: '*'` | Target all hosts in inventory. Use an alias, DNS name, or IP to target a single host. |
| `become: true` | Grants Ansible sudo privileges. |
| `serial: 1` | Processes servers one at a time instead of all at once. |
| `tasks` | A list of individual actions to run on the target hosts. |

Each task has four parts:

*   `name` — a plain-text description of what the task does
    
*   **Collection** (`community.general`) — the Ansible content bundle the module belongs to
    
*   **Module** (`timezone`, `apt`, `reboot`) — the tool that executes the action
    
*   **Parameters** (`name: America/Port_of_Spain`) — the specific options passed to the module
    

> 📚 Browse all available modules and collections at [docs.ansible.com](https://docs.ansible.com/projects/ansible/latest/collections/index.html)

* * *

## Running the Playbook

### Step 1 — Test connectivity with a ping

```bash
ANSIBLE_HOST_KEY_CHECKING=FALSE ansible -i ./inventory/hosts vpsServer -m ping --user root --ask-pass
```

| Flag | Description |
| --- | --- |
| `ANSIBLE_HOST_KEY_CHECKING=FALSE` | Skips SSH host key verification — useful for fresh servers |
| `-i ./inventory/hosts` | Points to your inventory file |
| `vpsServer` | The target host alias |
| `-m ping` | Runs the ping module to check connectivity and Python availability |
| `--ask-pass` | Prompts for SSH password |

Once you get a green **pong** response, you're ready to run the playbook.

### Step 2 — Run the playbook

```bash
ansible-playbook ./playbooks/apt-update.yml --user root -e "ansible_port=22" --ask-pass --ask-become-pass -i ./inventory/hosts
```

| Flag | Description |
| --- | --- |
| `ansible-playbook` | Runs a full automation script instead of a single ad-hoc task |
| `./playbooks/apt-update.yml` | Path to your playbook file |
| `--user root` | SSH connection username |
| `-e "ansible_port=22"` | Injects extra variable to force port 22 |
| `--ask-pass` | Prompts for SSH login password |
| `--ask-become-pass` | Prompts for sudo password (redundant when logging in as root) |
| `-i ./inventory/hosts` | Points to your inventory file |

### Execution Flow

1.  Ansible reads `./inventory/hosts` to find the target server's IP
    
2.  Prompts for SSH password
    
3.  Prompts for sudo password
    
4.  Connects to port 22 as root
    
5.  Opens `apt-update.yml` and executes each task in order
    

* * *

## Conclusion

A big shout-out to Aldo [@aldo\_cve](https://dev.to/aldo_cve) for recommending Ansible in a previous post — it's been a great addition to my server management workflow.

I hope you found this walkthrough useful. Stay tuned for more posts where I share playbooks I find useful in my day-to-day infrastructure work.

* * *

*Looking for developer templates built on TanStack, Directus, and Tailwind CSS? Check out my store 👇* *🛒* [*northernrangedigital.lemonsqueezy.com*](https://northernrangedigital.lemonsqueezy.com/)
