2016-02-12 1 views
3

Version Ansible: 2.0.0.2Ansible Variable précédence Hashes

J'ai besoin de remplacer les variables par défaut de rôle par les variables d'accueil de l'inventaire. Pour autant que je comprenne lire Variable Precedence: Where Should I Put A Variable? dans Ansible Docs, c'est possible mais peut-être que cela ne pourrait pas être une bonne pratique, mais malheureusement il est nécessaire que certains hôtes modifient certains paramètres de configuration par défaut.

Je vais reproduire le cas réel, donc nous allons examiner la hiérarchie de répertoire suivant:

├── debug.yml 
├── host_vars 
│   └── test.localdomain 
├── inventory 
│   └── debug 
└── roles 
    └── debug 
     ├── tasks 
     │   └── main.yml 
     └── vars 
      └── main.yml 

debug.yml est notre fichier PlayBook.

--- 
- name: debug 
    hosts: debug 
    roles: 
    - debug 

host_vars/test.localdomain contient les variables que je veux avoir la priorité sur les valeurs par défaut.

--- 
foo: 
    bar: 
    - hey 

inventaire/debug est le fichier d'inventaire que nous allons utiliser.

[debug] 
test.localdomain 

rôles/debug/tâches/main.yml imprime foo.bar variables.

--- 
- debug: msg="{{foo.bar}}" 

rôles/debug/vars/main.yml contient des variables de rôle par défaut.

--- 
foo: 
    bar: 
    - hello 
    - world 

À ce stade, je pense que pendant le débogage d'exécution PlayBook, la valeur de foo.bar est [ "hey" ], mais évidemment je me trompe:

> ansible-playbook debug.yml -i inventory/debug 

PLAY [debug] ********************************** 

TASK [setup] ********************************** 
ok: [test.localdomain] 

TASK [debug : debug] ************************** 
ok: [test.localdomain] => { 
    "msg": [ 
     "hello", 
     "world" 
    ] 
} 

PLAY RECAP ************************************* 
test.localdomain : ok=2 changed=0 unreachable=0 failed=0 

Exécution module de débogage de cli ansible me donne le résultat attendu, donc je suis tout à fait sûr que les variables hôte sont évaluées correctement, mais peut-être pour une raison quelconque, elles ne prennent pas le pas sur les variables de rôle par défaut.

> ansible test.localdomain -i inventory/debug -m debug -a 'msg="{{foo.bar}}"' 
test.localdomain | SUCCESS => { 
    "msg": [ 
     "hey" 
    ] 
} 

Où est mon erreur?

Répondre

11

Le problème est que vous n'utilisez pas les variables par défaut des rôles, mais les variables de rôle.Jetez un coup d'œil à la liste des documents à nouveau:

  • par défaut de rôle
  • inventaire vars
  • inventaire group_vars
  • host_vars inventaire
  • PlayBook group_vars
  • PlayBook host_vars
  • faits de l'hôte
  • vars enregistrés
  • set_facts
  • jeu vars
  • jeu vars_prompt
  • jeu vars_files
  • rôle et comprennent vars
  • vars bloc (uniquement pour les tâches dans le bloc)
  • tâche vars (uniquement pour la tâche)
  • extra vars

les variables de rôle ont la priorité sur les variables de type hôte.

role defaults besoin d'être enregistré dans le répertoire defaults. Donc, en renommant simplement votre dossier vars en defaults vous devriez obtenir votre comportement attendu.