- 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é?

2
Uppi 30 nov. 2017 à 03:02

3 réponses

Meilleure réponse

Vous devez diviser votre playbook en deux parties:

  1. générer un inventaire en mémoire
  2. 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 }}
4
Konstantin Suvorov 30 nov. 2017 à 07:06

@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 }}'
0
kabanus 3 juil. 2019 à 09:08

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
1
Christina A 30 nov. 2017 à 17:47
47563848