Collections Ansible¶
Les collections regroupent rôles, modules, plugins et playbooks dans un package versionneable et distribuable. Elles constituent l'unite de distribution officielle depuis Ansible 2.9.
Structure d'une collection¶
Une collection suit une arborescence normalisee :
namespace/
└── collection_name/
├── galaxy.yml # metadonnees, version, dependances
├── README.md
├── roles/ # roles de la collection
├── plugins/
│ ├── modules/ # modules custom en Python
│ ├── inventory/ # plugins d'inventaire
│ └── lookup/ # plugins de lookup
├── playbooks/ # playbooks distribues dans la collection
└── tests/ # tests via ansible-test
Les modules d'une collection s'utilisent via leur FQCN (Fully Qualified Collection Name) :
- name: creer une instance EC2
amazon.aws.ec2_instance:
name: mon-serveur
instance_type: t3.medium
image_id: ami-0abcdef1234567890
Le format est toujours namespace.collection.module. L'utilisation du FQCN evite les ambiguites entre modules de même nom issus de collections différentes.
Ansible Galaxy¶
Ansible Galaxy est le dépôt public de collections et de rôles. L'installation se fait via la commande ansible-galaxy.
# Installer une collection depuis Galaxy
ansible-galaxy collection install google.cloud
# Installer une version specifique
ansible-galaxy collection install amazon.aws:==7.0.0
# Installer depuis un fichier requirements
ansible-galaxy collection install -r requirements.yml
# Mettre a jour une collection installee
ansible-galaxy collection install google.cloud --upgrade
# Lister les collections installees
ansible-galaxy collection list
Fichier requirements.yml¶
Le fichier requirements.yml centralise les dépendances du projet. Il doit être committe dans le dépôt source et rejoue systematiquement en CI.
# requirements.yml
---
collections:
- name: google.cloud
version: ">=1.3.0"
- name: amazon.aws
version: "==7.0.0"
- name: azure.azcollection
version: ">=2.0.0"
- name: community.general
version: ">=8.0.0"
- name: ansible.posix
version: ">=1.5.0"
roles:
- name: geerlingguy.docker
version: "7.0.0"
Collections de référence¶
| Collection | Usage principal |
|---|---|
google.cloud | GCP : compute, GKE, Cloud SQL, IAM |
amazon.aws | AWS : EC2, S3, RDS, IAM |
azure.azcollection | Azure : VM, AKS, storage, networking |
community.general | Modules divers : docker, proxmox, etc. |
ansible.posix | Modules POSIX : firewalld, sysctl, mount |
ansible.builtin | Modules core intégrés (inclus par défaut) |
Collections privées¶
Pour distribuer des collections internes sans passer par Galaxy public, il existe deux approches : l'installation depuis une archive locale ou depuis un dépôt Git, et la publication vers un registry prive.
Construire et installer manuellement¶
# Construire l'archive de la collection (depuis le repertoire parent)
ansible-galaxy collection build mon_namespace/ma_collection
# Installer depuis l'archive locale generee
ansible-galaxy collection install mon_namespace-ma_collection-1.0.0.tar.gz
# Installer depuis un depot Git (branche ou tag)
ansible-galaxy collection install \
git+https://git.example.com/ansible-collections/network.git,main
# Installer depuis un tag Git specifique
ansible-galaxy collection install \
git+https://git.example.com/ansible-collections/network.git,v1.2.0
Registry prive (Nexus, Pulp, Automation Hub)¶
La configuration du registry prive se fait dans ansible.cfg. Plusieurs sources peuvent coexister avec un ordre de priorité.
# ansible.cfg
[galaxy]
server_list = automation_hub, galaxy
[galaxy_server.automation_hub]
url=https://hub.example.com/api/galaxy/
auth_url=https://sso.example.com/auth/token
token=mon_token_prive
[galaxy_server.galaxy]
url=https://galaxy.ansible.com/
Avec cette configuration, ansible-galaxy interroge d'abord automation_hub, puis galaxy en fallback pour les collections non trouvees en interne.
# Installation transparente : resolution selon server_list
ansible-galaxy collection install mon_namespace.ma_collection
Versionnement¶
Les collections suivent le versionnement semantique (semver) : MAJEUR.MINEUR.PATCH.
- MAJEUR : changement incompatible (rupture d'API ou de comportement)
- MINEUR : ajout de fonctionnalité retrocompatible
- PATCH : correction de bug retrocompatible
# galaxy.yml (a la racine de la collection)
---
namespace: mon_namespace
name: infrastructure
version: 2.1.0
description: Collection d'automatisation infrastructure interne
authors:
- Equipe Infrastructure <infra@example.com>
dependencies:
ansible.posix: ">=1.5.0"
community.general: ">=8.0.0"
repository: https://git.example.com/ansible-collections/infrastructure
documentation: https://docs.example.com/ansible
issues: https://git.example.com/ansible-collections/infrastructure/issues
Epingler les versions en production
En environnement de production, specifier des versions exactes dans requirements.yml plutôt que des contraintes souples. Committer ce fichier avec le code et le rejouer systematiquement en CI garantit la reproductibilite des déploiements.
Collections par domaine fonctionnel — taxonomie nuevolia¶
L'architecture d'automatisation s'organisé en collections alignees sur les domaines d'exploitation. Chaque collection regroupe des rôles fonctionnels nommes d'après ce qu'ils font, pas d'après les outils qu'ils utilisent. Le provider ou l'outil est un parametre du rôle, pas son nom.
Namespace racine : nuevolia
Vue d'ensemble¶
graph TB
N["nuevolia"]
N --> SYS["system"]
N --> NET["network"]
N --> MON["monitoring"]
N --> APP["application"]
N --> DB["database"]
N --> ID["identity"]
N --> CLD["cloud"]
SYS --> SYS1["hardening"]
SYS --> SYS2["local_accounts"]
SYS --> SYS3["time_sync"]
SYS --> SYS4["backup"]
SYS --> SYS5["scheduler"]
NET --> NET1["packet_filter"]
NET --> NET2["ingress_gateway"]
NET --> NET3["egress_proxy"]
NET --> NET4["dns"]
NET --> NET5["vpn"]
MON --> MON1["system_metrics"]
MON --> MON2["app_metrics"]
MON --> MON3["system_logs"]
MON --> MON4["app_logs"]
MON --> MON5["tracing"]
MON --> MON6["alerting"]
APP --> APP1["container_engine"]
APP --> APP2["reverse_proxy"]
APP --> APP3["runtime"]
APP --> APP4["message_queue"]
DB --> DB1["relational_store"]
DB --> DB2["document_store"]
DB --> DB3["key_value_store"]
DB --> DB4["column_store"]
DB --> DB5["high_availability"]
ID --> ID1["tls_certificates"]
ID --> ID2["directory_service"]
ID --> ID3["authentication"]
ID --> ID4["secret_management"]
CLD --> CLD1["compute"]
CLD --> CLD2["storage"]
CLD --> CLD3["network"]
CLD --> CLD4["identity"]
CLD --> CLD5["image"]
CLD --> CLD6["guest"]
CLD --> CLD7["mail_gateway"] nuevolia.system¶
Socle système local, indépendant du provider.
| Rôle | Fonction | Implémentations |
|---|---|---|
hardening | Durcissement sécurité OS | SSH config, SELinux, sysctl, audit |
local_accounts | Comptes et droits locaux | users, groupes, sudo, clés SSH |
time_sync | Synchronisation horloge | chrony, NTP |
backup | Sauvegarde fichiers et bases | rsync, restic, barman, xtrabackup |
scheduler | Tâches planifiees système | cron, systemd timers, anacron |
nuevolia.network¶
Services réseau des cloud providers. Si le provider ne propose pas de service manage, utiliser nuevolia.application.reverse_proxy en fallback pour le load balancing applicatif.
| Rôle | Fonction | Implémentations |
|---|---|---|
packet_filter | Règles firewall plateforme | NSX DFW, AWS SG, Azure NSG, GCP firewall rules, firewalld |
ingress_gateway | Load balancer manage | NSX LB, ALB/NLB, Azure LB, GCP LB |
egress_proxy | Proxy sortant plateforme | NSX gateway, NAT gateway, squid manage |
dns | Résolution DNS plateforme | NSX DNS, Route53, Cloud DNS, Azure DNS |
vpn | Tunnels plateforme | NSX VPN, AWS VPN, Azure VPN GW |
nuevolia.monitoring¶
Observabilité système et applicative. Les agents système et applicatifs sont des rôles distincts pour permettre un déploiement granulaire.
| Rôle | Fonction | Implémentations |
|---|---|---|
system_metrics | Agent métriques machine | node_exporter, telegraf |
app_metrics | Instrumentation métriques applicatives | endpoints /metrics, SDK OpenTelemetry |
system_logs | Agent logs système | promtail, fluentbit, rsyslog |
app_logs | Agent logs applicatifs | stdout conteneurs, fichiers app |
tracing | Traces distribuées | OpenTelemetry collector, agents APM |
alerting | Règles d'alerte et notification | Alertmanager, PagerDuty, webhooks |
nuevolia.application¶
Déploiement applicatif. Inclut les solutions de fallback réseau quand le provider ne dispose pas de service manage.
| Rôle | Fonction | Implémentations |
|---|---|---|
container_engine | Moteur de conteneurs | Docker CE, Podman |
reverse_proxy | Reverse proxy applicatif (fallback LB) | nginx, haproxy, traefik |
runtime | Environnement d'exécution | JRE, Node.js, Python |
message_queue | Broker de messages et files de travail | RabbitMQ, Kafka, ActiveMQ |
nuevolia.database¶
Déploiement de bases de données organisé par famille de topologie de données.
| Rôle | Fonction | Implémentations |
|---|---|---|
relational_store | SGBDR | PostgreSQL, MariaDB, SQL Server |
document_store | NoSQL document | MongoDB, CouchDB |
key_value_store | NoSQL clé-valeur | Redis, etcd |
column_store | Tables orientees colonnes | Cassandra, ClickHouse, HBase |
high_availability | Réplication, failover | Patroni, Galera, replica sets |
nuevolia.identity¶
Services partages d'identité et de secrets, consommes par toutes les autres collections.
| Rôle | Fonction | Implémentations |
|---|---|---|
tls_certificates | CA internes, émission, renouvellement, trust store | cert-manager, ACME, step-ca |
directory_service | Annuaire, jonction domaine | LDAP, AD join, SSSD |
authentication | Fédération SSO | SAML, OIDC, Keycloak |
secret_management | Gestion des secrets applicatifs | Vault, OpenBao |
nuevolia.cloud¶
Consommation des services cloud. Chaque rôle représenté un objet cloud unique valide quel que soit le provider cible. Le provider est un parametre du rôle.
| Rôle | Fonction | Implémentations |
|---|---|---|
compute | VM, instance, template | vSphere VM, EC2, Azure VM, GCE, Nova |
storage | Disque, bucket, datastore | vSAN, S3, Azure Blob, GCS, Cinder |
network | VPC, vSwitch, port group, subnet | NSX, VPC, VNet, GCP VPC, Neutron |
identity | Service account, IAM, permissions | vCenter rôles, IAM, Azure RBAC |
image | Template VM, AMI, image disque | vSphere template, AMI, Azure image, GCE image, Glance |
guest | Agent hyperviseur, cloud-init, customisation | open-vm-tools, GCP guest agent, Azure agent, cloud-init |
mail_gateway | MTA, relay SMTP, filtrage | Postfix, relay cloud, SPF/DKIM/DMARC |
galaxy.yml et requirements.yml¶
galaxy.yml d'une collection nuevolia¶
# nuevolia/system/galaxy.yml
---
namespace: nuevolia
name: system
version: 1.0.0
description: Socle systeme — hardening, comptes locaux, synchronisation temps, backup
authors:
- Equipe Infrastructure <infra@nuevolia.dev>
dependencies:
ansible.posix: ">=1.5.0"
community.general: ">=8.0.0"
repository: https://git.nuevolia.dev/ansible-collections/system
documentation: https://docs.nuevolia.dev/ansible/collections/system
issues: https://git.nuevolia.dev/ansible-collections/system/issues
requirements.yml multi-sources¶
Un projet typique consomme des collections nuevolia depuis le registry prive et des collections communautaires depuis Galaxy public.
# requirements.yml
---
collections:
# Collections internes nuevolia (registry prive)
- name: nuevolia.system
version: "==1.2.0"
source: https://hub.nuevolia.dev/api/galaxy/
- name: nuevolia.cloud
version: "==2.0.1"
source: https://hub.nuevolia.dev/api/galaxy/
- name: nuevolia.monitoring
version: "==1.1.0"
source: https://hub.nuevolia.dev/api/galaxy/
- name: nuevolia.application
version: "==1.0.3"
source: https://hub.nuevolia.dev/api/galaxy/
- name: nuevolia.identity
version: "==1.0.0"
source: https://hub.nuevolia.dev/api/galaxy/
# Collections communautaires (Galaxy public)
- name: community.vmware
version: ">=4.0.0"
- name: ansible.posix
version: ">=1.5.0"
- name: community.general
version: ">=8.0.0"
ansible.cfg associe¶
# ansible.cfg
[galaxy]
server_list = nuevolia_hub, galaxy
[galaxy_server.nuevolia_hub]
url=https://hub.nuevolia.dev/api/galaxy/
token=<NUEVOLIA_HUB_TOKEN>
[galaxy_server.galaxy]
url=https://galaxy.ansible.com/
Token en CI
Ne jamais committer le token dans ansible.cfg. En CI/CD, injecter la valeur via la variable d'environnement ANSIBLE_GALAXY_SERVER_NUEVOLIA_HUB_TOKEN ou via un secret du pipeline. Ansible résout automatiquement les variables d'environnement de la forme ANSIBLE_GALAXY_SERVER_<NAME>_TOKEN.