📖 1. Ce este Ansible?
Ansible este un instrument open-source de automatizare IT (configuration management, application deployment, orchestration). Creat de Michael DeHaan și achiziționat de Red Hat în 2015, Ansible a devenit standardul pentru Infrastructure as Code datorită simplității sale.
În 2025, peste 70% dintre echipele DevOps folosesc Ansible pentru automatizare, iar cererea pentru administratori cu cunoștințe Ansible a crescut cu 45% față de 2023.
De ce Ansible?
- Agentless - Nu necesită instalarea unui agent pe serverele gestionate. Folosește SSH.
- Simplitate - Folosește YAML (nu DSL complex). Sintaxă ușor de învățat.
- Idempotent - Rulează aceeași configurare de mai multe ori fără efecte nedorite.
- Gratuit - Open-source, fără costuri de licențiere.
- Cross-platform - Gestionează Linux, Windows, network devices, cloud.
⚖️ 2. Ansible vs Chef/Puppet/Salt
| Caracteristică | Ansible | Chef/Puppet | SaltStack |
|---|---|---|---|
| Arhitectură | Agentless (SSH) | Cu agent | Cu agent sau agentless |
| Limbaj | YAML | Ruby (DSL) | Python/YAML |
| Curba învățare | Ușoară | Ridicată | Medie |
| Performanță (100+ servere) | Bună | Excelentă | Excelentă |
| Windows suport | Da | Da | Da |
| Cloud suport | Excepțional | Bun | Bun |
📥 3. Instalare Ansible
Pe Ubuntu/Debian
# Metoda 1: Din repository-ul oficial (recomandat) sudo apt update sudo apt install -y software-properties-common sudo add-apt-repository --yes --update ppa:ansible/ansible sudo apt install -y ansible # Metoda 2: Cu pip (cea mai actualizată versiune) sudo apt install -y python3-pip pip3 install ansible # Verifică instalarea ansible --version
Pe RHEL/CentOS/AlmaLinux
sudo dnf install -y epel-release sudo dnf install -y ansible ansible --version
Structura directoarelor Ansible
ansible-project/ ├── ansible.cfg # Configurare Ansible ├── inventory/ # Inventory (hosts) │ ├── production │ ├── staging │ └── group_vars/ # Variabile pe grupuri ├── playbooks/ # Playbooks ├── roles/ # Roles reutilizabile │ ├── common/ │ ├── webserver/ │ └── database/ ├── group_vars/ # Variabile globale └── host_vars/ # Variabile per host
📋 4. Inventory - Gestionarea serverelor
Inventory este fișierul care definește serverele gestionate și organizarea lor în grupuri.
# inventory/production
# Format INI
[webservers]
web1.example.com ansible_user=ubuntu
web2.example.com ansible_user=ubuntu
[databases]
db1.example.com ansible_user=root
db2.example.com
[loadbalancers]
lb1.example.com
# Grupuri de grupuri
[servers:children]
webservers
databases
# Variabile pentru grup
[webservers:vars]
http_port=80
max_clients=200
# Format YAML
all:
children:
webservers:
hosts:
web1.example.com:
web2.example.com:
vars:
http_port: 80
databases:
hosts:
db1.example.com:
db2.example.com:
Testează conexiunea
# Testează conexiunea la toate serverele ansible all -i inventory/production -m ping # Doar la webservers ansible webservers -i inventory/production -m ping
⌨️ 5. Comenzi ad-hoc
Comenzile ad-hoc permit rularea unor task-uri simple fără a crea playbook-uri.
# Module de bază ansible webservers -m command -a "uptime" # Rulează comenzi ansible webservers -m shell -a "df -h" # Shell (permite pipe-uri) ansible webservers -m copy -a "src=/etc/hosts dest=/tmp/hosts" # Copiază fișiere ansible webservers -m file -a "path=/tmp/test state=directory mode=0755" # Creează director ansible webservers -m user -a "name=testuser state=present" # Creează utilizator ansible webservers -m apt -a "name=nginx state=present" # Instalează pachet (Debian) ansible webservers -m yum -a "name=httpd state=present" # Instalează pachet (RHEL) ansible webservers -m service -a "name=nginx state=started" # Pornește serviciu # Exemple practice # Actualizează toate serverele ansible all -m apt -a "update_cache=yes upgrade=dist" # Verifică memoria disponibilă ansible all -m shell -a "free -h" # Restartează un serviciu ansible webservers -m service -a "name=nginx state=restarted"
📝 6. Playbooks - Inima Ansible
Playbooks sunt fișiere YAML care definesc configurarea serverelor. Sunt idempotente - rulează în siguranță de mai multe ori.
Playbook simplu pentru instalare Nginx
# playbooks/install-nginx.yml
---
- name: Instalare si configurare Nginx
hosts: webservers
become: yes # Rulează ca root
vars:
nginx_port: 80
tasks:
- name: Actualizează cache-ul apt
apt:
update_cache: yes
- name: Instalează Nginx
apt:
name: nginx
state: present
- name: Creează directorul pentru site
file:
path: /var/www/mysite
state: directory
owner: www-data
group: www-data
mode: '0755'
- name: Copiază fișierul index.html
copy:
src: files/index.html
dest: /var/www/mysite/index.html
owner: www-data
group: www-data
- name: Configurează virtual host
template:
src: templates/mysite.conf.j2
dest: /etc/nginx/sites-available/mysite.conf
notify: restart nginx
- name: Activează site-ul
file:
src: /etc/nginx/sites-available/mysite.conf
dest: /etc/nginx/sites-enabled/mysite.conf
state: link
notify: restart nginx
- name: Șterge default site
file:
path: /etc/nginx/sites-enabled/default
state: absent
notify: restart nginx
handlers:
- name: restart nginx
service:
name: nginx
state: restarted
Rulează playbook-ul
# Rulează playbook-ul ansible-playbook -i inventory/production playbooks/install-nginx.yml # Verbose mode (pentru debugging) ansible-playbook -i inventory/production playbooks/install-nginx.yml -v # Simulează (dry-run) ansible-playbook -i inventory/production playbooks/install-nginx.yml --check # Rulează doar anumite task-uri ansible-playbook -i inventory/production playbooks/install-nginx.yml --tags "install"
🔢 7. Variabile și fapte (facts)
Definire variabile
# În playbook
---
vars:
app_name: myapp
app_version: "1.2.3"
users:
- alice
- bob
# În fișiere separate (group_vars/all.yml)
db_host: "{{ ansible_default_ipv4.address }}"
db_port: 5432
db_name: "{{ app_name }}_db"
# La rulare (linie de comandă)
ansible-playbook playbook.yml -e "app_version=2.0.0"
Fapte (facts) - Informații despre sistem
# Colectează facts de pe toate serverele
ansible all -m setup
# Folosește facts în playbooks
- name: Afișează informații sistem
debug:
msg: "Serverul {{ ansible_hostname }} rulează {{ ansible_distribution }} {{ ansible_distribution_version }}"
- name: Configurează swappiness bazat pe RAM disponibilă
sysctl:
name: vm.swappiness
value: "{{ 10 if ansible_memtotal_mb > 4096 else 30 }}"
state: present
Variabile predefinite utile
{{ ansible_hostname }} # Numele host-ului
{{ ansible_default_ipv4.address }} # IP principal
{{ ansible_os_family }} # Debian, RedHat, etc.
{{ ansible_distribution }} # Ubuntu, CentOS, etc.
{{ ansible_processor_cores }} # Număr nuclee CPU
{{ ansible_memtotal_mb }} # RAM totală (MB)
{{ ansible_disk0.size }} # Dimensiune disc principal
{{ inventory_hostname }} # Numele din inventory
📦 8. Roles - Reutilizare cod
Roles sunt structuri care grupează playbook-uri, variabile, fișiere, template-uri și handlers pentru reutilizare.
Structură role
roles/
└── common/
├── tasks/
│ └── main.yml
├── handlers/
│ └── main.yml
├── templates/
│ └── config.conf.j2
├── files/
│ └── script.sh
├── vars/
│ └── main.yml
├── defaults/
│ └── main.yml
└── meta/
└── main.yml
Creează o role (automat)
# Creează scheletul unei roles ansible-galaxy init roles/webserver # Instalează role din Ansible Galaxy ansible-galaxy install geerlingguy.nginx ansible-galaxy install geerlingguy.mysql ansible-galaxy install geerlingguy.docker
Exemplu role simplă
# roles/common/tasks/main.yml
---
- name: Actualizează sistemul
apt:
update_cache: yes
upgrade: dist
when: ansible_os_family == "Debian"
- name: Instalează pachete de bază
apt:
name:
- htop
- git
- curl
- vim
- net-tools
state: present
- name: Configurează timezone
timezone:
name: "{{ timezone | default('Europe/Bucharest') }}"
- name: Adaugă chei SSH pentru utilizatori
authorized_key:
user: "{{ item.user }}"
key: "{{ item.key }}"
loop: "{{ ssh_keys }}"
when: ssh_keys is defined
Playbook care folosește roles
# playbooks/site.yml
---
- name: Configurare servere comune
hosts: all
roles:
- common
- name: Configurare servere web
hosts: webservers
roles:
- geerlingguy.nginx
- webserver
- name: Configurare baze de date
hosts: databases
roles:
- geerlingguy.mysql
- database
🔐 9. Ansible Vault - Securizarea secretelor
Ansible Vault criptează date sensibile (parole, chei API) în fișierele playbook.
# Creează un fișier criptat ansible-vault create secrets.yml # Editează fișier criptat ansible-vault edit secrets.yml # Criptează un fișier existent ansible-vault encrypt group_vars/all/vault.yml # Decriptează un fișier ansible-vault decrypt secrets.yml # Rulează playbook cu vault ansible-playbook playbook.yml --ask-vault-pass ansible-playbook playbook.yml --vault-password-file ~/.vault_pass
# group_vars/all/vault.yml (criptat) db_password: "SuperSecret123!" api_key: "sk-1234567890" mysql_root_password: "RootPass456!"
🛠️ 10. Proiecte practice
Proiect 1: Automatizare LAMP stack
---
# playbooks/lamp-stack.yml
- name: Instalare LAMP stack
hosts: webservers
become: yes
vars:
db_name: myapp_db
db_user: myapp_user
db_password: "{{ vault_db_password }}"
tasks:
- name: Instalează Apache
apt:
name: apache2
state: present
- name: Instalează MySQL
apt:
name: mysql-server
state: present
- name: Instalează PHP și module
apt:
name:
- php
- php-mysql
- php-curl
- php-gd
- php-mbstring
- php-xml
- libapache2-mod-php
state: present
- name: Pornește serviciile
service:
name: "{{ item }}"
state: started
enabled: yes
loop:
- apache2
- mysql
- name: Creează baza de date
mysql_db:
name: "{{ db_name }}"
state: present
- name: Creează utilizator baza de date
mysql_user:
name: "{{ db_user }}"
password: "{{ db_password }}"
priv: "{{ db_name }}.*:ALL"
state: present
Proiect 2: Deploy aplicație Node.js
---
- name: Deploy aplicație Node.js
hosts: app_servers
become: yes
tasks:
- name: Instalează Node.js 20.x
shell: |
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
- name: Instalează PM2 global
npm:
name: pm2
global: yes
state: present
- name: Copiază aplicația
synchronize:
src: ../myapp/
dest: /var/www/myapp/
delete: yes
- name: Instalează dependințe npm
npm:
path: /var/www/myapp
state: present
- name: Pornește aplicația cu PM2
command: pm2 start /var/www/myapp/app.js --name myapp
args:
chdir: /var/www/myapp
- name: Salvează lista PM2 pentru restart automat
command: pm2 save
command: pm2 startup systemd
Proiect 3: Configurare Docker host
---
- name: Configurare Docker host
hosts: docker_hosts
become: yes
tasks:
- name: Instalează dependințe
apt:
name:
- ca-certificates
- curl
state: present
- name: Adaugă cheia GPG Docker
apt_key:
url: https://download.docker.com/linux/ubuntu/gpg
state: present
- name: Adaugă repository Docker
apt_repository:
repo: "deb [arch=amd64] https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable"
state: present
- name: Instalează Docker
apt:
name:
- docker-ce
- docker-ce-cli
- containerd.io
- docker-compose-plugin
update_cache: yes
state: present
- name: Adaugă utilizator în grupul docker
user:
name: "{{ ansible_user }}"
groups: docker
append: yes
- name: Pornește și activează Docker
service:
name: docker
state: started
enabled: yes
✅ Concluzie
Felicitări! Acum stăpânești elementele fundamentale ale Ansible:
- ✅ Instalare și configurare Ansible
- ✅ Gestionarea inventory-ului
- ✅ Comenzi ad-hoc pentru task-uri rapide
- ✅ Crearea playbook-urilor idempotente
- ✅ Folosirea variabilelor și facts
- ✅ Organizarea codului cu roles
- ✅ Securizarea secretelor cu Ansible Vault
- Ansible Galaxy - mii de roles predefinite
- Ansible Tower / AWX - interfață web și scheduler
- Ansible Molecule - testare roles
- Ansible for Network Automation - automatizare routere/switch-uri
- Ansible for Cloud - AWS, Azure, GCP modules