- hosts: ALL
gather_facts: true
remote_user:test
vars:
Env: "{{ env }}"
tasks:
- ec2_remote_facts:
region: us-east-1
aws_access_key: "{{ aws_access_key }}"
aws_secret_key: "{{ aws_secret_key }}"
filters:
"tag:Env": "{{ env }}"
register: instance_facts
- name: group_hosts
add_host: hostname={{ item }} groups=dev
with_items: "{{ instance_facts.instances|map(attribute="private_ip_address)|list }}"
- name: "loop over hosts for hostnames"
hostname:
name: {{ item }}
with_items: "{{ instance_facts.instances|map(attribute=' ')|list }}"
Mon intention dans ce playbook est d'obtenir le tag_Name et de définir le même nom d'hôte dans les instances. J'essayais différentes choses, mais je suis resté bloqué en utilisant l'attribut pour la balise dans la tâche "boucle sur les hôtes pour les noms d'hôte". Comment mentionner la balise = "Nom" pour l'enregistrer en tant que nom d'hôte, car ce serait un attribut imbriqué?
3 réponses
Vous devez diviser votre playbook en deux parties:
- générer un inventaire en mémoire
- exécuter des tâches sur des hôtes
Voici un exemple:
- hosts: localhost
gather_facts: no
tasks:
- ec2_remote_facts:
region: us-east-1
aws_access_key: "{{ aws_access_key }}"
aws_secret_key: "{{ aws_secret_key }}"
filters:
"tag:Env": "{{ env }}"
register: instance_facts
- add_host:
name: "{{ item.tags.Name }}"
ansible_host: "{{ item.private_ip_address }}"
group: dev
with_items: "{{ instance_facts.instances }}"
- hosts: dev
gather_facts: true
tasks:
- hostname:
name: {{ inventory_hostname }}
@Konstantin Suvorov merci, c'est un excellent exemple. J'ajouterai une pause après '- add_host:' pour que la deuxième partie se termine:
- name: Let's wait for SSH to come up. Usually that takes ~10 seconds
local_action: wait_for
host={{ item.private_ip }}
port=22
state=started
with_items: '{{ instance_facts.instances }}'
Je pense que la meilleure façon de procéder est de le définir dans les données utilisateur.
Sous Linux:
pip install awscli
ID=$(wget -q -O - http://169.254.169.254/latest/meta-data/instance-id)
REGION=$(wget -q -O - http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e "s/.$//")
NAME=$(aws ec2 describe-tags --filters "Name=resource-id,Values=$ID" --region $REGION --output=text | grep Name | awk '{ print $3 }')
#set the hostname according your distro
De nouvelles questions
amazon-ec2
Amazon EC2 signifie "Amazon Elastic Compute Cloud". Il fait partie d'Amazon Web Services (AWS) et permet aux utilisateurs de louer des instances de machine virtuelle. Vous pouvez créer des instances, les lancer et les gérer via une interface centrale, via une API web ou via une console.