AgID / wai-infrastructure

Infrastructure code for Web Analytics Italia
https://webanalytics.italia.it
BSD 3-Clause "New" or "Revised" License
5 stars 1 forks source link
ansible infrastructure-as-code kubernetes openstack terraform web-analytics-italia

Web Analytics Italia - Infrastructure

WAI infrastructure CI

Il repository contiene gli script di installazione e configurazione di tutte le componenti infrastrutturali e del software di base della piattaforma Web Analitycs Italia.

Di seguito l'infrastruttura applicativa e la dislocazione delle componenti.

Architettura

Requisiti

Installare le dipendenze con:

$ pip install -r requirements.txt

Per l'installazione è necessario utilizzare un host locale o remoto come controller; su questa macchina è necessario creare la chiave RSA per l'accesso tramite ssh utilizzando il comando:

$ ssh-keygen -t rsa -b 4096 -N '' -f ssh_wai_key

Il comando creerà una copia di chiavi (pubblica e privata) che saranno utilizzate per l'accesso agli host dell'infrastruttura.

Provisioning a livello IaaS

Per il provisioning dell'infrastruttura presso il servizio SPC Cloud - Lotto 1, è disponibile lo script infrastructure/wai-provisioner.py che automatizza la procedura di creazione di tutte le risorse previste (reti, gruppi di protezione, istanze, volumi, etc.).

Prima di utilizzare lo script è necessario creare i file che descrivono gli ambienti utilizzado i template disponibili (infrastructure/env-*.tfvars.template) e copiandoli/rinominandoli senza l'estensione .template.

Nel file env-common.tfvars va inserita la chiave pubblica generata precedentemente.

Le credenziali per l'accesso al cloud provider devono essere caricate come variabili d'ambiente. Il modo più semplice è utilizzare il file OpenStack RC.

Se non si desidera utilizzare lo script è possibile usare direttamente Terraform avendo cura di creare tre distinti workspace per ciascuno degli ambienti previsti: production, staging e public-playground.

Utilizzo

Per la creazione/aggiornamento delle risorse nell'infrastruttura:

$ infrastructure/wai-provisioner.py <environment> apply

Per la distruzione delle risorse nell'infrastruttura (senza possibilità di recupero):

$ infrastructure/wai-provisioner.py <environment> destroy

Il parametro <environment> può assumere uno dei tre valori: production, staging o public-playground.

Installazione

Per l'installazione e configurazione del software di base e delle componenti infrastrutturali è stato realizzato il playbook Ansible wai.yml; il playbook è realizzato per la versione del sistema operativo Ubuntu Server 18.04 LTS.

Inventory dinamico

Lo script playbooks/inventory/10-openstack_inventory.py è utilizzato da Ansible per la generazione di un inventory dinamico a partire dalle risorse create. Accanto a questo è presente anche un inventory statico (playbooks/inventory/20-k8s-static-inventory) necessario per l'installazione del cluster Kubernetes.

Anche questo script necessita che le credenziali per l'accesso al cloud provider siano caricate come variabili d'ambiente.

L'inventory è selezionato automaticamente mediante la configurazione di ansible presente nel file playbooks/ansible.cfg, quindi non è necessario specificarlo nella riga di comando.

Ruoli e playbook esterni

Prima di lanciare il playbook è necessario installare alcuni ruoli tra cui quello relativo all'installazione di Elasticsearch:

$ ansible-galaxy install -r playbooks/requirements.yml
$ ansible-galaxy collection install -r playbooks/requirements-collection.yml

L'installazione del cluster Kubernetes è effettuata mediante il playbook esterno kubespray che deve essere quindi clonato dal suo repository:

$ git clone --branch v2.12.0 https://github.com/kubernetes-sigs/kubespray.git playbooks/kubespray

Ruoli

Il playbook per l'installazione di Web Analytics Italia contiene i seguenti ruoli:

Tags

Il playbook contiene diversi tag che è possibile consultare dal playbook wai.yml.

Parametri

Tutti i parametri generali modificabili sono disponibili nel file all.yml.

Parametri sensibili

Il playbook per il deploy dell'infrastruttura e la configurazione del software di base utilizza il file secrets.yml per leggere tutti i parametri che vanno tenuti segreti per motivi di sicurezza.

Per condividere il file secrets.yml, è possibile utilizzare ansible-vault.

Dopo aver impostato i parametri all'interno del file, si può criptare con il comando:

$ ansible-vault encrypt playbooks/secrets.yml

Decriptare il file secrets.yml, utilizzando la password impostata con il comando:

$ ansible-vault decrypt playbooks/secrets.yml

Esecuzione Playbook

Prima dell'esecuzione del playbook è possibile verificare la raggiungibilità di tutti gli host presenti nell'inventory con il comando:

$ ansible all -m ping --limit 'wai'

Per l'installazione è consigliabile usare questa sequenza ordinata di tag con il comando:

$ ansible-playbook playbooks/wai.yml -b --limit 'wai' --tags=<tag>
  1. infrastructure: controlli iniziali sui requisiti;
  2. openvpn: server OpenVPN;
  3. elastic,kibana: ElasticSearch e Kibana;
  4. galera,mariadb: DBMS e cluster;
  5. gluster: GlusterFS;
  6. matomo: database Matomo;
  7. kubernetes: cluster Kubernetes;
  8. elastic-deploy: risorse di ElasticSearch;
  9. kubernetes-deploy: risorse di Kubernetes;
  10. kubernetes-deploy-helm: risorse di Kubernetes via Helm;

Per generare in ambiente locale tutti i file relativi ai template si può usare il tag templates:

$ ansible-playbook playbooks/wai.yml -i playbooks/inventory/30-localhost -t templates

Immagini per i container

Le immagini docker usate per i container sono disponibili pubblicamente nella pagina dell'organizzazione Web Analytics Italia su Docker Hub.