This directory contains configuration management and automation using Ansible.
ansible/
├── ansible.cfg # Ansible configuration
├── inventory/ # Inventory files
│ └── dev # Development inventory
├── playbooks/ # Ansible playbooks
│ └── setup.yml # Main setup playbook
└── roles/ # Ansible roles
└── common/ # Common server setup
-
Install Ansible:
pip install ansible ansible-lint
-
Configure inventory: Edit
inventory/devwith your server details:[webservers] web1 ansible_host=10.0.1.10 ansible_user=ubuntu
-
Test connectivity:
cd ansible ansible all -i inventory/dev -m ping -
Run playbooks:
ansible-playbook -i inventory/dev playbooks/setup.yml
Inventory files define your infrastructure:
[webservers]
web1 ansible_host=10.0.1.10
web2 ansible_host=10.0.1.11
[databases]
db1 ansible_host=10.0.2.10
[production:children]
webservers
databasesPlaybooks define what tasks to run on which hosts:
---
- name: Setup web servers
hosts: webservers
become: yes
roles:
- common
- nginxRoles organize tasks into reusable components:
roles/
└── common/
├── tasks/main.yml # Main tasks
├── handlers/main.yml # Event handlers
├── vars/main.yml # Variables
├── defaults/main.yml # Default variables
├── meta/main.yml # Role metadata
└── templates/ # Jinja2 templates
- Use roles for reusable components
- Encrypt sensitive data with ansible-vault
- Use handlers for service restarts
- Test playbooks with
--checkmode - Use meaningful task names
- Group related tasks
- Use templates for configuration files
# Check syntax
ansible-playbook playbooks/setup.yml --syntax-check
# Dry run (check mode)
ansible-playbook -i inventory/dev playbooks/setup.yml --check
# Run with verbose output
ansible-playbook -i inventory/dev playbooks/setup.yml -v
# Run specific tags
ansible-playbook -i inventory/dev playbooks/setup.yml --tags "nginx"
# Limit to specific hosts
ansible-playbook -i inventory/dev playbooks/setup.yml --limit webservers
# Encrypt sensitive files
ansible-vault encrypt group_vars/all/secrets.yml
# Run with vault password
ansible-playbook -i inventory/dev playbooks/setup.yml --ask-vault-passUse variables to make playbooks flexible:
# In playbook
- name: Install package
package:
name: "{{ package_name }}"
state: present
# In inventory
[webservers:vars]
package_name=nginx
# In template
server_name {{ ansible_hostname }};
listen {{ nginx_port | default(80) }};