🤖 Automatizare servere cu Ansible - Ghid complet 2025

Învață să administrezi sute de servere deodată cu Infrastructure as Code

📖 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.

📊 Statistici 2025: Conform Stack Overflow Developer Survey, Ansible este al doilea cel mai iubit tool DevOps, cu o rată de satisfacție de 78%.

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ăAnsibleChef/PuppetSaltStack
ArhitecturăAgentless (SSH)Cu agentCu agent sau agentless
LimbajYAMLRuby (DSL)Python/YAML
Curba învățareUșoarăRidicatăMedie
Performanță (100+ servere)BunăExcelentăExcelentă
Windows suportDaDaDa
Cloud suportExcepționalBunBun
💡 Verdict: Pentru începători și majoritatea cazurilor, Ansible este cea mai bună alegere datorită simplității. Pentru infrastructuri foarte mari (1000+ servere), Salt sau Puppet pot fi mai performante.

📥 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
🎯 Resurse pentru aprofundare:
  • 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
📌 Ai nevoie de automatizare pentru infrastructura ta? ServiciiLinux oferă servicii de consultanță și implementare Ansible pentru afaceri.
📞 Solicită consultanță Ansible → ← Înapoi la toate articolele