Bei der Nutzung von AWS zusammen mit ansible ist es sinnvoll, sich das Inventory automatisch zu generieren. In diesem Zusammenhang war es mir wichtig, einen möglichst sprechenden Hostnamen zu haben, trotzdem mussten die EC2-Instanzen über die interne IP angesprochen werden, da sie sich in einem nicht öffentlich erreichbaren VPC befanden. Hier habe ich sehr viel recherchiert und diverse Anleitungen gelesen. Als Ergebnis meiner Recherchen habe ich immer wieder die Antwort gefunden, dass man in der ini-Datei die folgenden Variablen setzen soll:
# die normale "Destination"-Variable, über die der Host angesprochen wird
destination_variable = ip_address
# mit dieser "Destination"-Variable wird die obere Variable überschrieben
vpc_destination_variable = private_ip_address
Leider hat das bei mir nie zum gewünschten Erfolg geführt und schlussendlich blieb mir nur übrig, die interne IP als Hostname zu setzen.
Darum habe ich mir den Code des AWS EC2-Plugin im Detail angesehen und bin dabei auf die Lösung gestoßen. Aufgrund der vielen, meiner Meinung nach fehlerhaften Anleitungen will ich hier kurz meine Lösung aufzeigen.
Um das Plugin zu nutzen wird die AWS-Bibliothek für Python (boto3) benötigt. Die Installation ist mit pip schnell erledigt:
pip install boto3
Im ersten Schritt aktiviert man das Plugin. Dazu fügt man in der Datei ansible.cfg die folgende Zeile ein:
enable_plugins = aws_ec2
Jetzt kann man entweder auf gleicher Ebene eine Datei erstellen, die auf aws_ec2.yml endet oder, das ist meine Lösung, man erstellt einen Unterordner (z.B. aws-inventory). In der Datei ansible.cfg verweist man dann mit der folgenden Zeile auf den erstellten Unterordner:
inventory = aws-inventory
In diesem Unterordner legt man dann die Datei an. Wie oben bereits genannt muss die Datei zwingend auf aws_ec2.yml oder aws_ec2.yaml enden. Hier ein Besispiel für eine solche Datei (z.B inventory_aws_ec2.yml)
plugin: aws_ec2
aws_access_key: "MEIN_AWS_ACCESS_KEY"
aws_secret_key: "MEIN_AWS_SECRET_KEY"
hostnames:
- tag:Name
- private-ip-address
keyed_groups:
- key: tags
prefix: tag
- key: instance_type
prefix: instance_type
- key: placement.region
prefix: aws_region
filters:
vpc-id: vpc-12341234123412341
compose:
ansible_host: private_ip_address
Diese Konfigurations-Datei für das Plugin nutzt die folgenden Variablen:
Die Variable compose kann man nutzen, um abschließend Variablen mit Werten zu überschreiben. In meinem Fall habe ich dieses Verhalten genutzt, um die ansible-Variable zu überscheiben, die für die Verbindung genutzt wird (ansible_host).
Wenn das Inventory häufig verwendet wird und sich die Instanzen nur selten ändern, dann sollte man ein Caching einrichten. Dazu setzt man folgende Variablen:
cache: yes
cache_connection: .cache/
cache_timeout: 86400
Es wird ein Unterordner .cache angelegt und dort die Daten der Instanzen für 24 Stunden gecacht. Die Cachezeit wird in Sekunden angegeben.