Home→Blog→How to Install Ansible Automation Tool - Complete Guide for Configuration Management
šŸ“… April 15, 2020ā±ļø 11 minutes min read

How to Install Ansible Automation Tool - Complete Guide for Configuration Management

Learn how to install and configure Ansible automation tool for configuration management, application deployment, and infrastructure orchestration. Complete guide with examples and best practices.

How to Install Ansible Automation Tool - Complete Guide for Configuration Management

Ansible is a powerful open-source automation engine that revolutionizes how system administrators and DevOps engineers manage infrastructure. This comprehensive guide covers everything you need to know about Ansible, from understanding its core concepts to installing and configuring it for your automation needs.

What is Ansible?

Ansible is an open-source command-line automation engine designed to simplify complex configuration management, application deployment, and infrastructure orchestration tasks. Unlike traditional automation tools, Ansible operates without requiring agents on target systems, making it lightweight, secure, and easy to deploy across diverse environments.

Key Features of Ansible

  • Agentless Architecture: No need to install software on managed nodes
  • SSH-Based Communication: Uses standard SSH for secure connections
  • YAML Syntax: Human-readable configuration files called playbooks
  • Idempotent Operations: Ensures consistent system states
  • Multi-Platform Support: Works across Linux, Windows, and network devices
  • Extensive Module Library: Pre-built modules for common tasks

How Ansible Works

Ansible follows a push-based model where the control node (where Ansible is installed) connects to managed nodes via SSH and executes tasks. The workflow consists of:

  1. Control Node: The machine where Ansible is installed and playbooks are executed
  2. Managed Nodes: Target systems that Ansible configures and manages
  3. Inventory: List of managed nodes and their connection details
  4. Playbooks: YAML files containing automation instructions
  5. Modules: Reusable units of code that perform specific tasks
text
Control Node → SSH → Managed Nodes
     ↓
  Playbooks
     ↓
   Modules
     ↓
   Results

What Can Ansible Automate?

Ansible excels in three primary automation areas:

1. Provisioning

  • Infrastructure Setup: Automated server provisioning across cloud platforms
  • Virtual Machine Creation: Deploy VMs on VMware, VirtualBox, or cloud providers
  • Network Configuration: Configure switches, routers, and firewalls
  • Storage Management: Set up and manage storage systems

2. Configuration Management

  • System Configuration: Manage OS settings, users, and permissions
  • Application Configuration: Configure web servers, databases, and applications
  • Service Management: Start, stop, and restart system services
  • Package Management: Install, update, and remove software packages
  • Security Policies: Implement and enforce security configurations
  • File Management: Deploy configuration files and templates

3. Application Deployment

  • Continuous Deployment: Automate application releases from development to production
  • Rolling Updates: Deploy updates with zero downtime
  • Environment Consistency: Ensure identical configurations across environments
  • Rollback Capabilities: Quickly revert to previous application versions

Enterprise Features with Ansible Tower

For enterprise environments, Ansible Tower (now Red Hat Ansible Automation Platform) provides:

  • Web-based Dashboard: Graphical interface for managing playbooks
  • Role-Based Access Control: Fine-grained permissions management
  • Job Scheduling: Automated execution of playbooks
  • Audit Trails: Comprehensive logging and reporting
  • API Integration: RESTful API for third-party integrations

Prerequisites and Requirements

System Requirements

  • Operating System: Linux (Ubuntu, CentOS, RHEL, Debian) or macOS
  • Python: Python 2.7 or Python 3.5+ (Python 3.8+ recommended)
  • Memory: Minimum 512MB RAM (2GB+ recommended for large inventories)
  • Network: SSH access to managed nodes
  • Privileges: Sudo or root access on control node

Managed Node Requirements

  • SSH Server: OpenSSH server running and accessible
  • Python: Python 2.6+ or Python 3.5+ installed
  • User Account: User with appropriate privileges (sudo recommended)

Installing Ansible

Method 1: Package Manager Installation (Recommended)

Ubuntu/Debian Installation

bash
# Update package index
sudo apt update

# Install software-properties-common for add-apt-repository
sudo apt install software-properties-common -y

# Add Ansible official PPA repository
sudo add-apt-repository --yes --update ppa:ansible/ansible

# Install Ansible
sudo apt install ansible -y

# Verify installation
ansible --version

CentOS/RHEL 8 Installation

bash
# Enable EPEL repository
sudo dnf install epel-release -y

# Install Ansible
sudo dnf install ansible -y

# Verify installation
ansible --version

CentOS/RHEL 7 Installation

bash
# Enable EPEL repository
sudo yum install epel-release -y

# Install Ansible
sudo yum install ansible -y

# Verify installation
ansible --version

Fedora Installation

bash
# Install Ansible
sudo dnf install ansible -y

# Verify installation
ansible --version

Method 2: Python pip Installation

bash
# Install pip if not already installed
sudo apt install python3-pip -y  # Ubuntu/Debian
sudo dnf install python3-pip -y  # CentOS/RHEL/Fedora

# Upgrade pip to latest version
python3 -m pip install --upgrade pip

# Install Ansible via pip
python3 -m pip install ansible

# Add pip binary path to PATH (if needed)
echo 'export PATH=$PATH:~/.local/bin' >> ~/.bashrc
source ~/.bashrc

# Verify installation
ansible --version

Method 3: Installation from Source

bash
# Install Git and development tools
sudo apt install git build-essential python3-dev -y  # Ubuntu/Debian
sudo dnf groupinstall "Development Tools" -y && sudo dnf install git python3-devel -y  # CentOS/RHEL

# Clone Ansible repository
git clone https://github.com/ansible/ansible.git
cd ansible

# Install Ansible from source
python3 -m pip install .

# Verify installation
ansible --version

Verifying Ansible Installation

After successful installation, verify Ansible is working correctly:

bash
# Check Ansible version and configuration
ansible --version

Expected output:

text
ansible [core 2.12.4]
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/user/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.8.10 (default, Nov 26 2021, 20:14:08) [GCC 9.3.0]

Check Available Modules

bash
# List all available Ansible modules
ansible-doc -l

# Get help for specific module
ansible-doc ping
ansible-doc copy
ansible-doc service

Initial Ansible Configuration

Creating Project Directory Structure

bash
# Create Ansible project directory
mkdir -p ~/ansible-project
cd ~/ansible-project

# Create standard directory structure
mkdir -p {inventories,playbooks,roles,group_vars,host_vars}

# Create basic files
touch ansible.cfg
touch inventories/hosts

Configuring ansible.cfg

Create a project-specific configuration file:

bash
nano ansible.cfg

ansible.cfg:

ini
[defaults]
# Inventory file location
inventory = ./inventories/hosts

# Disable host key checking for lab environments
host_key_checking = False

# Default remote user
remote_user = ansible

# Default private key file
private_key_file = ~/.ssh/ansible_key

# Roles path
roles_path = ./roles

# Retry files
retry_files_enabled = False

# Gathering facts
gathering = smart
fact_caching = memory

# Output formatting
stdout_callback = yaml
bin_ansible_callbacks = True

[ssh_connection]
# SSH timeout
timeout = 30

# SSH pipelining for better performance
pipelining = True

# Control persist
control_path = ~/.ansible/cp/%%h-%%p-%%r

Setting Up SSH Key Authentication

For secure, passwordless authentication:

bash
# Generate SSH key pair
ssh-keygen -t rsa -b 4096 -f ~/.ssh/ansible_key -N ""

# Copy public key to managed nodes
ssh-copy-id -i ~/.ssh/ansible_key.pub user@target-server

# Test SSH connection
ssh -i ~/.ssh/ansible_key user@target-server

Creating Inventory File

The inventory file defines your managed nodes:

bash
nano inventories/hosts

Basic Inventory Example:

ini
# Web servers group
[webservers]
web1.example.com ansible_host=192.168.1.10
web2.example.com ansible_host=192.168.1.11
web3.example.com ansible_host=192.168.1.12

# Database servers group
[databases]
db1.example.com ansible_host=192.168.1.20
db2.example.com ansible_host=192.168.1.21

# Load balancers group
[loadbalancers]
lb1.example.com ansible_host=192.168.1.30

# Group variables
[webservers:vars]
ansible_user=webadmin
ansible_ssh_private_key_file=~/.ssh/web_key

[databases:vars]
ansible_user=dbadmin
ansible_ssh_private_key_file=~/.ssh/db_key

# Parent groups
[production:children]
webservers
databases
loadbalancers

Advanced Inventory with Variables:

ini
[webservers]
web1.example.com ansible_host=192.168.1.10 http_port=80 max_connections=200
web2.example.com ansible_host=192.168.1.11 http_port=8080 max_connections=150
web3.example.com ansible_host=192.168.1.12 http_port=80 max_connections=300

[webservers:vars]
ansible_user=ubuntu
ansible_ssh_private_key_file=~/.ssh/ansible_key
nginx_version=1.18
ssl_enabled=true

Testing Ansible Connectivity

Basic Connectivity Test

bash
# Test connection to all hosts
ansible all -m ping

# Test connection to specific group
ansible webservers -m ping

# Test connection to specific host
ansible web1.example.com -m ping

Expected output:

text
web1.example.com | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}

Running Ad-Hoc Commands

bash
# Check uptime on all servers
ansible all -m command -a "uptime"

# Check disk space
ansible all -m shell -a "df -h"

# Install package on web servers
ansible webservers -m apt -a "name=nginx state=present" --become

# Restart service
ansible webservers -m service -a "name=nginx state=restarted" --become

# Copy file to servers
ansible all -m copy -a "src=/local/file dest=/remote/path owner=root mode=644" --become

Creating Your First Playbook

Create a simple playbook to install and configure Nginx:

bash
nano playbooks/install-nginx.yml

install-nginx.yml:
```yaml

  • name: Install and Configure Nginx
    hosts: webservers
    become: yes
    vars:
    nginx_port: 80
    server_name: "{{ ansible_hostname }}"

    tasks:

    • name: Update package cache
      apt:
      update_cache: yes
      cache_valid_time: 3600
      when: ansible_os_family == "Debian"

    • name: Install Nginx
      package:
      name: nginx
      state: present

    • name: Create custom index.html
      template:
      src: index.html.j2
      dest: /var/www/html/index.html
      owner: www-data
      group: www-data
      mode: '0644'
      notify: restart nginx

    • name: Configure Nginx virtual host
      template:
      src: nginx.conf.j2
      dest: /etc/nginx/sites-available/default
      backup: yes
      notify: restart nginx

    • name: Start and enable Nginx
      service:
      name: nginx
      state: started
      enabled: yes

    • name: Open firewall for HTTP
      ufw:
      rule: allow
      port: "{{ nginx_port }}"
      proto: tcp
      when: ansible_os_family == "Debian"

    handlers:

    • name: restart nginx
      service:
      name: nginx
      state: restarted
text

### Running the Playbook

```bash
# Run the playbook
ansible-playbook playbooks/install-nginx.yml

# Run with verbose output
ansible-playbook playbooks/install-nginx.yml -v

# Run with dry-run (check mode)
ansible-playbook playbooks/install-nginx.yml --check

# Run on specific hosts
ansible-playbook playbooks/install-nginx.yml --limit web1.example.com

Best Practices and Tips

Security Best Practices

  1. Use SSH Keys: Always use SSH key authentication instead of passwords
  2. Limit Privileges: Use sudo only when necessary with become: yes
  3. Vault for Secrets: Use Ansible Vault for sensitive data
  4. Regular Updates: Keep Ansible and modules updated

Performance Optimization

ini
# In ansible.cfg
[defaults]
# Increase parallel execution
forks = 20

# Enable pipelining
[ssh_connection]
pipelining = True

# Use control persist
control_path = ~/.ansible/cp/%%h-%%p-%%r
control_path_dir = ~/.ansible/cp

Organizing Playbooks

text
ansible-project/
ā”œā”€ā”€ ansible.cfg
ā”œā”€ā”€ inventories/
│   ā”œā”€ā”€ production/
│   │   ā”œā”€ā”€ hosts
│   │   └── group_vars/
│   └── staging/
│       ā”œā”€ā”€ hosts
│       └── group_vars/
ā”œā”€ā”€ playbooks/
│   ā”œā”€ā”€ site.yml
│   ā”œā”€ā”€ webservers.yml
│   └── databases.yml
ā”œā”€ā”€ roles/
│   ā”œā”€ā”€ nginx/
│   ā”œā”€ā”€ mysql/
│   └── common/
└── group_vars/
    ā”œā”€ā”€ all.yml
    ā”œā”€ā”€ webservers.yml
    └── databases.yml

Troubleshooting Common Issues

Issue 1: SSH Connection Problems

Symptoms:

text
UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh"}

Solutions:

bash
# Test SSH connectivity manually
ssh -i ~/.ssh/ansible_key user@target-host

# Check SSH configuration
ansible target-host -m setup --ask-pass

# Verify inventory configuration
ansible-inventory --list

Issue 2: Permission Denied

Symptoms:

text
FAILED! => {"changed": false, "msg": "Permission denied"}

Solutions:

bash
# Use become for privilege escalation
ansible-playbook playbook.yml --become --ask-become-pass

# Check sudo configuration on target hosts
ansible all -m shell -a "sudo -l" --become

Issue 3: Python Interpreter Issues

Symptoms:

text
FAILED! => {"changed": false, "msg": "/usr/bin/python: not found"}

Solutions:

yaml
# In playbook or inventory
ansible_python_interpreter: /usr/bin/python3

# Or auto-discover
ansible_python_interpreter: auto

Advanced Ansible Features

Using Ansible Vault

bash
# Create encrypted file
ansible-vault create secrets.yml

# Edit encrypted file
ansible-vault edit secrets.yml

# Encrypt existing file
ansible-vault encrypt vars.yml

# Run playbook with vault
ansible-playbook playbook.yml --ask-vault-pass

Dynamic Inventory

bash
# AWS EC2 dynamic inventory
ansible-inventory -i aws_ec2.yml --list

# Custom dynamic inventory script
ansible-playbook -i ./dynamic_inventory.py playbook.yml

Ansible Galaxy

bash
# Install role from Galaxy
ansible-galaxy install geerlingguy.nginx

# Install from requirements file
ansible-galaxy install -r requirements.yml

# Create new role
ansible-galaxy init my-custom-role

Conclusion

Ansible is a powerful automation tool that simplifies infrastructure management, configuration deployment, and application orchestration. Its agentless architecture, YAML-based syntax, and extensive module library make it an ideal choice for DevOps teams looking to automate repetitive tasks and ensure consistent system configurations.

Key Benefits of Ansible

  • Simplicity: Easy to learn and implement with minimal setup
  • Agentless: No additional software required on managed nodes
  • Scalability: Efficiently manages thousands of nodes
  • Flexibility: Supports diverse platforms and use cases
  • Community: Large ecosystem of modules and roles

Next Steps

  1. Practice with Playbooks: Create more complex automation scenarios
  2. Explore Roles: Organize reusable automation components
  3. Learn Advanced Features: Dive into Ansible Vault, dynamic inventory, and custom modules
  4. Join the Community: Contribute to Ansible Galaxy and participate in forums
  5. Consider Ansible Tower: Evaluate enterprise features for larger deployments

With Ansible properly installed and configured, you're ready to begin automating your infrastructure and streamlining your DevOps workflows. Start small with simple tasks and gradually build more sophisticated automation as you become comfortable with Ansible's capabilities.

For production environments, always test playbooks in staging environments first, implement proper backup strategies, and maintain version control for your automation code. Ansible's power lies in its simplicity, but with great power comes the responsibility to use it wisely and securely.

Tags:

Related Posts