2016-04-20 30 views
8

Penso di aver visto una risposta a questo da qualche parte, ma non riesco a trovarlo ora. Sto creando un file di inventario dinamico development per le mie istanze EC2. Vorrei raggruppare tutte le istanze contrassegnate con Stack=Development. Inoltre, mi piacerebbe identificare in modo specifico i server API di sviluppo. Quelli non avrebbero solo il tag Stack=Development, ma anche il tag API=Yes.Filtro di più tag nell'inventario dinamico Ansible

La mia configurazione di base utilizza le cartelle di inventario:

<root>/development 
    ├── base 
    ├── ec2.ini 
    └── ec2.py 

Nel mio file base, mi piacerebbe avere qualcosa di simile:

[servers] 
tag_Stack_Development 

[apiservers] 
tag_Stack_Development && tag_API_Yes 

allora sarei in grado di eseguire questo per ping tutti i miei server API di sviluppo:

ansible -i development -u myuser apiservers -m ping 

Si può fare qualcosa del genere? So che la sintassi non è giusta, ma si spera che l'intento sia ragionevolmente chiaro? Non riesco ad immaginarmi di essere l'unico che abbia mai avuto bisogno di filtrare su più tag, ma non sono riuscito a trovare nulla che mi portasse dove sto cercando di andare.

risposta

5

Non è la risposta che ho nella mia testa, ma a volte quello che mi passa per la testa si mette di mezzo. Poiché ogni directory di inventario ha il proprio ec2.ini, filtro solo lo stack lì e quindi raggruppo all'interno di quel filtro.

# <root>/development/ec2.ini 
... 
instance_filters = tag:Stack=Development 

# <root>/development/base 
[tag_Role_webserver] 
[tag_API_Yes] 

[webservers:children] 
tag_Role_webserver 

[apiservers:children] 
tag_API_Yes 
2

La documentazione Ansible ha a section on patterns. Piuttosto che creare una nuova sezione, si può fare un tag intersezione quando si specificano i padroni di casa:

[$] ansible -i development -u myuser tag_Stack_Development:&tag_API_Yes 

Questo funziona anche all'interno di Playbook.

+0

Non penso che funzioni per i tag EC2. – kev

+0

@kev Al momento non ho un account ec2, ma penso di averlo già fatto prima. Cosa ti sta portando a credere che non funzioni? –

+0

L'ho provato. – kev

1

La risposta fornita da xiong-chiamiov funziona effettivamente. L'ho appena usato nel mio spiegamento ansibile.

Quindi ho una cartella di gioco che utilizza lo script di inventario dinamico. con questo codice:

--- 
    - name: AWS Deploy 
     hosts: tag_Environment_dev:&tag_Project_integration 
     gather_facts: true 

E il processo filtra gli host con entrambi i tag.

EDIT

realtà in espansione su questo, è anche possibile utilizzare le variabili per rendere il gruppo di accoglienza specifica dinamica. in questo modo:

--- 
    - name: AWS Deploy 
     hosts: "tag_Environment_{{env}}:&tag_Project_{{tag_project}}" 
     sudo: true 
     gather_facts: true 

uso il {{env}} e {{}} tag_project vars da file variabili e argomenti dati per ansible in fase di esecuzione. Cambia con successo gli host in cui viene eseguito il playbook.

Problemi correlati