2017-06-07 5 views
0

J'essaie d'obtenir d'un groupe d'inventaire une liste d'adresses IP au lieu de noms d'hôtes. Ces adresses IP sont déjà dans mon hostvars mais je ne peux pas les faire correspondre à une liste de leur nom de groupe.Ansible - obtient les variables de group_vars et de host_vars ensemble dans une liste

Voici mon livre de jeux d'origine:

- name: Install Kafka 
    hosts: kafka 
    roles: 
    - role: kafka 
     kafka_hosts: "{{ groups['kafka'] | list }}" 
     kafka_zookeeper_hosts: "{{ groups['zookeeper'] | list }}" 

Comme vous pouvez le voir, kafka_hosts et kafka_zookeeper_hosts sont des listes. Le résultat de cette PlayBook à ma configuration de serveurs est correcte:

/etc/kafka/consumer.properties:zookeeper.connect=opo-4:2181,opo-5:2181,opo-6:2181 
/etc/kafka/producer.properties:metadata.broker.list=opo-1:9092,opo-2:9092,opo-3:9092 

Malheureusement, cette configuration ne fonctionne pas pour tous mes serveurs en raison de problèmes de DNS. J'ai besoin d'une liste d'adresses IP au lieu de noms d'hôtes.

Si je mets manuellement les adresses IP dans mon livre de jeux, mes travaux de configuration, malheureusement pas dynamiquement:

kafka_hosts: 
    - 192.168.48.1 
    - 192.168.48.2 
    - 192.168.48.3 
    kafka_zookeeper_hosts: 
    - 192.168.48.4 
    - 192.168.48.5 
    - 192.168.48.6 

Et le résultat sur mes serveurs rendent travail:

/etc/kafka/consumer.properties:zookeeper.connect=192.168.48.4:2181,192.168.48.5:2181,192.168.48.6:2181 
/etc/kafka/producer.properties:metadata.broker.list=192.168.48.1:9092,192.168.48.2:9092,192.168.48.3:9092 

En cette configuration je dois maintenir manuellement mes groupes et mon playbook avec la même information. Donc, je voudrais obtenir le hostvars des groupes kafka et zookeeper.

Voici hostvars et des groupes, définis dans le principal fichier d'inventaire:

[opo] 
opo-1 ansible_host=192.168.48.1 
opo-2 ansible_host=192.168.48.2 
... 
opo-6 ansible_host=192.168.48.6 

[zookeeper] 
opo-1 
opo-2 
opo-3 

[kafka] 
opo-4 
opo-5 
opo-6 

Ce que j'ai essayé - en fonction des réponses trouvées sur stackoverflow des questions similaires:

  • kafka_hosts: " {{groups [['kafka'] ['ansible_host']] | liste}} "
  • kafka_hosts:" {{[hostvars [groupes ['kafka'] [0]] ['hôte_chaîne]] | liste} } "# la liste contient seulement la première adresse IP 012 Kafka_hosts: "{{[hostvars [groups ['kafka']] ['ansible_host']] | liste}} "
  • kafka_hosts:" {{hostvars [groupes ['kafka']]. ansible_host | liste}} "
  • kafka_hosts:" {{[hostvars. [groupes ['kafka']]. ansible_host] | liste}} "
  • kafka_hosts:" {{groups ['kafka']. ansible_host | liste}} »

Aucun d'entre eux donne la

Répondre

1

liste attendue des adresses IP Vous devez utiliser extract and map combination:..

kafka_hosts: "{{ groups['kafka'] | map('extract',hostvars,'ansible_host') | list }}" 
+0

C'était la bonne syntaxe Fonctionne bien Merci Konstantin!. –