
Pour piloter du parc AWS depuis Ansible, le plugin amazon.aws.aws_ec2 est le standard de fait. Il interroge l’API AWS et retourne toutes vos instances EC2 d’une région ou d’un compte, groupées automatiquement par tag, par VPC, par AZ. C’est le plugin officiel maintenu par Red Hat.
Cette page est didactique — sans lab pratique car AWS suppose un compte cloud et engendre de la facturation. Elle vous donne les patterns à appliquer le jour où vous gérez un parc AWS depuis Ansible.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Configurer le plugin
amazon.aws.aws_ec2(région, filtres, credentials). - Grouper automatiquement les instances par tag, par VPC, par état.
- Combiner avec un inventaire statique pour les hôtes on-prem.
- Comprendre les bonnes pratiques sécurité (IAM role > clés statiques).
- Anticiper les pièges courants (rate limiting, multi-région).
Prérequis
Section intitulée « Prérequis »- Compte AWS avec instances EC2 lancées.
amazon.awscollection installée.- Credentials AWS configurés (variables d’env ou IAM role sur le control node).
- Avoir lu Concepts des plugins d’inventaire.
Installation et activation
Section intitulée « Installation et activation »ansible-galaxy collection install amazon.awspip install boto3 botocoreLe plugin nécessite boto3 et botocore côté control node. Activer dans ansible.cfg :
[inventory]enable_plugins = host_list, script, auto, yaml, ini, amazon.aws.aws_ec2Configuration minimale
Section intitulée « Configuration minimale »Créer inventory/aws_ec2.yml (le suffixe _ec2.yml est attendu par Ansible) :
---plugin: amazon.aws.aws_ec2regions: - eu-west-3Tester :
ansible-inventory -i inventory/aws_ec2.yml --graphToutes vos instances EC2 de la région eu-west-3 apparaissent. Par défaut, elles sont nommées par leur instance_id (ex: i-0abc123def456).
Donner aux instances un nom lisible
Section intitulée « Donner aux instances un nom lisible »Par défaut, l’instance s’appelle i-0abc.... Pour utiliser le tag Name (ce que vous voyez dans la console AWS) :
plugin: amazon.aws.aws_ec2regions: - eu-west-3hostnames: - tag:Name - dns-name - private-ip-addresshostnames: est une liste : Ansible essaie le premier critère, puis le second si le premier est vide. Ici : tag Name en priorité, sinon DNS public, sinon IP privée.
Grouper par tag (le plus utile)
Section intitulée « Grouper par tag (le plus utile) »Les tags AWS sont la clé d’un parc bien organisé. Le plugin les expose automatiquement :
plugin: amazon.aws.aws_ec2regions: - eu-west-3
keyed_groups: # Un groupe par valeur du tag Environment (prod, staging, dev) - prefix: env key: tags.Environment
# Un groupe par valeur du tag Role (web, db, lb) - prefix: role key: tags.Role
# Groupes hiérarchiques par région et AZ - prefix: region key: placement.region - prefix: az key: placement.availability_zoneRésultat : ansible-inventory --graph montre :
@all: |--@env_prod: | |--web1.example.com | |--db1.example.com |--@env_staging: | |--web-staging.example.com |--@role_web: | |--web1.example.com | |--web-staging.example.com |--@role_db: | |--db1.example.com |--@region_eu-west-3: | |--... (toutes les instances) |--@az_eu-west-3a: | |--web1.example.comVous pouvez maintenant cibler env_prod:&role_web pour déployer uniquement sur les webservers de prod.
Filtres — réduire la liste
Section intitulée « Filtres — réduire la liste »Si vous avez 500 instances dont seulement 50 vous concernent, filtrer côté API évite les coûts :
plugin: amazon.aws.aws_ec2regions: - eu-west-3
filters: # Uniquement les instances en cours d'exécution instance-state-name: running
# Uniquement celles tagged Environment=prod tag:Environment: prod
# Uniquement celles dans un VPC spécifique vpc-id: vpc-0123abcdefAvantage : moins de payload réseau, plus rapide, et vos collègues qui regardent l’inventaire ne voient pas les instances qui ne les concernent pas.
Credentials AWS — les bonnes pratiques
Section intitulée « Credentials AWS — les bonnes pratiques »❌ Ne pas faire
Section intitulée « ❌ Ne pas faire »plugin: amazon.aws.aws_ec2aws_access_key_id: AKIAIOSFODNN7EXAMPLE # ← clés en clair !aws_secret_access_key: wJalrXUtnFEMI/K7MDENG/EXAMPLEJamais de clés en clair dans le fichier d’inventaire — qui finit dans Git, dans les logs CI, partagé en équipe.
✅ Variables d’environnement
Section intitulée « ✅ Variables d’environnement »export AWS_ACCESS_KEY_ID=AKIA...export AWS_SECRET_ACCESS_KEY=...export AWS_REGION=eu-west-3ansible-inventory -i inventory/aws_ec2.yml --list✅ AWS Profile
Section intitulée « ✅ AWS Profile »plugin: amazon.aws.aws_ec2aws_profile: productionregions: - eu-west-3Avec ~/.aws/credentials :
[production]aws_access_key_id = AKIA...aws_secret_access_key = ...✅ IAM Role (control node sur EC2)
Section intitulée « ✅ IAM Role (control node sur EC2) »Si Ansible tourne sur une instance EC2, attacher un IAM role à cette instance avec une policy EC2:Describe*. Pas de clés à gérer du tout — l’instance reçoit ses credentials via le metadata service AWS.
plugin: amazon.aws.aws_ec2regions: - eu-west-3# Pas de credentials — utilise l'IAM role automatiquementC’est le pattern le plus sûr en production.
Variables exposées par le plugin
Section intitulée « Variables exposées par le plugin »Pour chaque instance, le plugin expose un dict de facts très riche, accessible dans vos playbooks :
- name: Afficher l'IP privée de chaque webserver hosts: env_prod:&role_web tasks: - debug: msg: | {{ inventory_hostname }} : - private IP : {{ private_ip_address }} - public IP : {{ public_ip_address | default('aucune') }} - instance ID: {{ instance_id }} - VPC : {{ vpc_id }} - AZ : {{ placement.availability_zone }} - tag Owner : {{ tags.Owner | default('non défini') }}Toutes les variables AWS sont préfixées sans aws_ — accès direct.
Cache — éviter de marteler l’API
Section intitulée « Cache — éviter de marteler l’API »Sur un compte avec 200+ instances, chaque commande Ansible déclenche une API call DescribeInstances. Au-delà de quelques runs/min, AWS rate-limit. Activer le cache :
plugin: amazon.aws.aws_ec2regions: - eu-west-3
cache: truecache_plugin: jsonfilecache_timeout: 600 # 10 minutescache_connection: /tmp/ansible_aws_ec2_cachePour rafraîchir après création d’instances :
ansible-inventory -i inventory/aws_ec2.yml --list --refresh-cacheMulti-région
Section intitulée « Multi-région »Pour gérer un parc multi-région :
plugin: amazon.aws.aws_ec2regions: - eu-west-3 - us-east-1 - ap-southeast-1Toutes les instances des 3 régions sont fusionnées en un seul inventaire. Le keyed_groups: region les groupe automatiquement par région.
Combiner avec un inventaire on-prem
Section intitulée « Combiner avec un inventaire on-prem »Pattern courant : on-prem (statique) + AWS (dynamique) dans le même run :
inventory/├── 01-static.yml ← serveurs on-prem└── 02-aws_ec2.yml ← plugin AWSansible-playbook -i inventory/ playbook.ymlLe playbook.yml peut cibler webservers (groupe défini dans le statique on-prem) et env_prod (groupe AWS) sans problème.
Pièges courants
Section intitulée « Pièges courants »| Symptôme | Cause | Fix |
|---|---|---|
boto3 module not found | Module Python manquant | pip install boto3 botocore |
Unable to locate credentials | Pas de credentials configurés | Variables d’env ou aws_profile: ou IAM role |
RequestLimitExceeded (429) | Trop d’API calls (rate limit) | Activer le cache (cache: true) |
| Instances absentes | Filtre trop restrictif | --list -vvv pour voir l’API call exacte |
Hostname = i-0abc... | Pas de hostnames: configuré | hostnames: [tag:Name, ...] |
| Multi-région lent | Une seule call par région | Préférer un cache long (>= 600s) |
Comparaison rapide
Section intitulée « Comparaison rapide »| Critère | AWS EC2 | libvirt | Proxmox |
|---|---|---|---|
| Setup | Cloud + IAM | Local libvirt | Token API |
| Coût | Cloud bill | Zéro | Zéro |
| Retourne IP ? | Oui (privée + publique) | Non sans QEMU agent | Oui |
| Groupage | Tags AWS | Manuel via groups: | Tags Proxmox |
| Multi-source | Oui (multi-région) | Limité au host local | Limité au cluster |
À retenir
Section intitulée « À retenir »amazon.aws.aws_ec2= standard pour Ansible + AWS. Maintenu par Red Hat.hostnames:= utiliser le tagNameau lieu de l’instance ID pour des hostnames lisibles.keyed_groups:sur les tags AWS = pattern n°1 pour grouper automatiquement.filters:réduire le payload côté API pour les gros parcs.- Credentials : IAM role > AWS profile > variables d’env > jamais en clair dans le YAML.
- Cache mandatory au-delà de quelques runs/min (rate limit AWS).
- Multi-région supportée nativement via
regions:liste.