Home

ITA - Ansible - Un Breve Riepilogo

linux ansible

Introduzione

Ansible è un software open source che consente di automatizzare le procedure di configurazione e gestione di sistemi unix-like e Windows.

Quello che segue è un post che cerca di riassumere il più possibile il funzionamento di ansible, un analisi approfondita non è in programma, per informazioni approfondite fare riferimento alla documentazione ufficiale.

Concetti Base

Ansible sfrutta due tipi di host:

Il master si collega ai nodi usando il protocollo SSH; in generale le caratteristiche sono:

Installazione

Nonostante ansible sia disponibile nei repositori ufficiali di molte distribuzioni:

La documentazione propone di installarlo usando pip:

$  pip install --user ansible

Vedere ansible installation guide

Ansible

Inventory

L’inventory è l’elenco degli host gestiti, di default è il file /etc/ansible/hosts, per esempio:

[myvirtualmachines]
192.0.2.50
192.0.2.51
192.0.2.52

Oppure possono essere files yaml:

virtualmachines:
  hosts:
    vm01:
      ansible_host: 192.0.2.50
    vm02:
      ansible_host: 192.0.2.51
    vm03:
      ansible_host: 192.0.2.52

Per conoscere l’elenco dei nodi configurati si può usare:

$ ansible all --list-hosts

Per testare la connettività:

$ ansible all -m ping

l’output dovrebbe essere:

192.0.2.50 | SUCCESS => {
  "ansible_facts": {
    "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
    }
192.0.2.51 | SUCCESS => {
  "ansible_facts": {
    "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
    }
192.0.2.52 | SUCCESS => {
  "ansible_facts": {
    "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
    }

Un inventory può essere passato da linea di comando ad ansible:

$ ansible all -m ping -i inventory.yaml

Creare un Inventory

Creando un Inventory è buona norma:

Metagruppi

Una buona pratica è quella di usare i metagruppi:

metagroupname:
  children:

Usare variabili

Una altra buona pratica è quella di usare variabili nei gruppi:

webservers:
  hosts:
    webserver01:
      ansible_host: 192.0.2.140
      http_port: 80
    webserver02:
      ansible_host: 192.0.2.150
      http_port: 443
  vars:
    ansible_user: my_server_user

Ansible Playbook

Esempio semplice, creiamo il file playbook.yaml

- name: My first play
  hosts: virtualmachines
  tasks:
   - name: Ping my hosts
     ansible.builtin.ping:

   - name: Print message
     ansible.builtin.debug:
       msg: Hello world

E lo si può eseguire:

$ ansible-playbook -i inventory.yaml playbook.yaml

Struttura di esempio per un playbook:

production                # inventory file for production servers
staging                   # inventory file for staging environment

group_vars/
   group1.yml             # here we assign variables to particular groups
   group2.yml
host_vars/
   hostname1.yml          # here we assign variables to particular systems
   hostname2.yml

library/                  # if any custom modules, put them here (optional)
module_utils/             # if any custom module_utils to support modules, put them here (optional)
filter_plugins/           # if any custom filter plugins, put them here (optional)

site.yml                  # master playbook
webservers.yml            # playbook for webserver tier
dbservers.yml             # playbook for dbserver tier

roles/
    common/               # this hierarchy represents a "role"
        tasks/            #
            main.yml      #  <-- tasks file can include smaller files if warranted
        handlers/         #
            main.yml      #  <-- handlers file
        templates/        #  <-- files for use with the template resource
            ntp.conf.j2   #  <------- templates end in .j2
        files/            #
            bar.txt       #  <-- files for use with the copy resource
            foo.sh        #  <-- script files for use with the script resource
        vars/             #
            main.yml      #  <-- variables associated with this role
        defaults/         #
            main.yml      #  <-- default lower priority variables for this role
        meta/             #
            main.yml      #  <-- role dependencies
        library/          # roles can also include custom modules
        module_utils/     # roles can also include custom module_utils
        lookup_plugins/   # or other types of plugins, like lookup in this case

    webtier/              # same kind of structure as "common" was above, done for the webtier role
    monitoring/           # ""
    fooapp/               # ""

Riferimenti