2017-01-19 7 views
0

getestet auf: ansible 2.2.0.0, 2.2.1.0 & 2.1.4.0ansible liefert falsche Vars, wenn eine dynamische Bestandsaufnahme mit

ich ein Inventar-Skript, das diese json zurückgibt, wenn laufen (zum Beispiel willen minimiert):

{ 
    "componentA-service_ci": { 
    "hosts": [ 
     "host1.example.com", 
     "host2.example.com" 
    ], 
    "vars": { 
     "httpport": "8100", 
     "nginxpool": "componentA_pool" 
    } 
    }, 
    "componentB-service_ci": { 
    "hosts": [ 
     "host1.example.com", 
     "host3.example.com" 
    ], 
    "vars": { 
     "httpport": "9999", 
     "nginxpool": "componentB_pool" 
    } 
    } 
} 

Das Playbook, das ich schreibe, sind für die Bereitstellung von Anwendungen. Die Variablen in der Bestandsliste sind für die Gruppen eindeutig, d. H. Jeder Dienst hat seinen eigenen lb-Pool und seinen http-Port. Es kann auch mehrere Anwendungen auf einem Host geben. Und hier ist es, was das Textbuch mag wie:

--- 
- hosts: all 
    remote_user: deployment 
    become: true 
    become_method: sudo 
    become_user: root 
    gather_facts: yes 
    serial: 1 
    roles: 
    - app-deploy 

Die Aufgaben in der Rolle einfach druckt die Variablen nginxpool und httpport.

Ich betreibe das Textbuch wie folgt aus:

ansible-playbook deploy.yml -i inventory.py --limit componentA-service_ci 

Erwartetes Ergebnis:

TASK [app-deploy : debug] ****************************************************** 
ok: [host1.example.com] => { 
    "msg": "pool componentA_pool port 8100" 
} 

TASK [app-deploy : debug] ****************************************************** 
ok: [host2.example.com] => { 
    "msg": "pool componentA_pool port 8100" 
} 

Tatsächliches Ergebnis:

TASK [app-deploy : debug] ****************************************************** 
ok: [host1.example.com] => { 
    "msg": "pool componentB_pool port 9999" 
} 

TASK [app-deploy : debug] ****************************************************** 
ok: [host2.example.com] => { 
    "msg": "pool componentA_pool port 8100" 
} 

Die --limit Werke in dass ansible auf den Hosts ausgeführt wird, die für componentA-service_ci aufgelistet sind, aber für host1.example.com Ich bekomme den Wert von nginxpool und httpport von componentB-service_ci vars. Ich lese die documentation aber nicht verstehen, wie dies passieren kann? Ist das ein Fehler oder verstehe ich einfach nicht, wie gut hier funktioniert?

+0

Mögliches Duplikat von [Anisible auf bestimmter Hostgruppe ausführen] (http://stackoverflow.com/questions/41500463/run-ansible-on-specific-hosts-group) – techraf

Antwort

0

Ich denke, der Punkt ist, ansible erstellt das komplette Inventar zuerst und sucht dann nach den Spielen, die Ihren Grenzen entsprechen.

Da ein Host (host1.example.com) zu zwei Gruppen gehört, die dieselbe Variable angeben, werden die Informationen beim Einrichten des Inventars durcheinander gebracht. Der Inhalt der Variablen httpport von host1.example.com könnte aus der componentA-Gruppe oder aus componentB-Gruppe stammen.

Nachdem das Inventar erstellt wird, ansible versucht, die Spiele auf diese Hosts enthalten, von der angegebenen Begrenzung Gruppe

Benennen Sie Ihre Variablen zu begrenzen, so dass die Variablennamen eindeutig sind und dann die spezifischen Variablennamen in der bestimmten Gruppe verwenden in Stücken:

{ 
    "componentA-service_ci": { 
    "hosts": [ 
     "host1.example.com", 
     "host2.example.com" 
    ], 
    "vars": { 
     "componentA_httpport": "8100", 
     "componentA_nginxpool": "componentA_pool" 
    } 
    }, 
    "componentB-service_ci": { 
    "hosts": [ 
     "host1.example.com", 
     "host3.example.com" 
    ], 
    "vars": { 
     "componentB_httpport": "9999", 
     "componentB_nginxpool": "componentB_pool" 
    } 
    } 
} 

Nun ist die Host-host1.example.com hat vier Variablen componentA_httpport, componentA_nginxpool und componentB_httpport, componentB_nginxpool.

+0

Thx für den Einblick. Ich fand dieses Problem später bei github https://github.com/ansible/ansible/issues/9065 Ich denke wirklich, dass dies ein Fehler ist, die Verwendung verschiedener Variablennamen wird nicht funktionieren, da es ein generisches Playbook ist, endete ich mit einem Wrapper-Skript, das die Suche vor dem Ausführen von ansible-playbook ausführt und die Variablen als extra-vars einfügt. –

Verwandte Themen