2017-11-30 2 views
1

Gibt es eine Möglichkeit, immer eine Rolle zu führen? Ich erstelle Sperrdatei vor dem Start jede Bereitstellung, um parallele Bereitstellung zu verhindern. Im Falle eines Fehlers/Erfolges möchte ich die Sperrdatei löschen.Ansible run immer Rolle

- { role: lock-deployment, tags: always } 
- { role: fetch-artifactory, tags: always } 
- { role: unlock-deployment, tags: always } 

Ich möchte Unlock-Deployment-Rolle unabhängig von Fehler/Erfolg ausführen.

Antwort

2

Problem ist, ich möchte nicht blockieren, Rettung für jede Aufgabe. Ich möchte nur die Sperrdatei im Falle eines Fehlers in einer der Aufgaben löschen. Ich habe versucht, mich umzusehen, ob die Rolle selbst in den Block gesteckt werden kann, aber keine gefunden hat. ref

Sie können Verwendung block mit always Konstrukt. Rollen können mit include_role aufgenommen werden:

tasks: 
    - include_role: 
     name: lock-deployment 
    - block: 
    - include_role: 
     name: fetch-artifactory 
    always: 
     - include_role: 
      name: unlock-deployment 

Diese gewünschten Strömung erzeugt (fetch-artifactory enthält fail Aufgabe Scheitern zu emulieren):

PLAY [localhost] *************************************************************************************** 

TASK [include_role] ************************************************************************************ 

TASK [lock-deployment : file] ************************************************************************** 
changed: [localhost] 

TASK [include_role] ************************************************************************************ 

TASK [fetch-artifactory : fail] ************************************************************************ 
Unaltered: {'msg': u'Failed as requested from task', 'failed': True, 'changed': False} 
fatal: [localhost]: FAILED! => {"changed": false, "failed": true, "msg": "Failed as requested from task"} 

TASK [include_role] ************************************************************************************ 

TASK [unlock-deployment : file] ********************************************************************** 
changed: [localhost] 
+0

Dank @ Techraf. Ich würde diese Lösung ausprobieren und die Ergebnisse bald aktualisieren. –

0

könnten Sie verwenden ansible Block und immer für diese Situation

http://docs.ansible.com/ansible/latest/playbooks_blocks.html

+0

Problem ist, ich will nicht blockieren tun, Rettung für jede Aufgabe . Ich möchte nur die Sperrdatei im Falle eines Fehlers in einer der Aufgaben löschen. Ich habe versucht, mich umzusehen, ob die Rolle selbst in den Block gesteckt werden kann, aber keine gefunden hat. –

0

Was block mit und einschließlich der YAML-Datei aus der Rolle statt erklärt, die Rolle als Abhängigkeit:

tasks: 
    - name: "start deployment" 
    block: 
     - include: "<path to roles>/lock-deployment/tasks/main.yaml" 
     - include: "<path to roles>/fetch-artifactory/tasks/main.yaml" 
     - include: "<path to roles>/unlock-deployment/tasks/main.yaml" 
    always: 
     - name: "remove lock file" 
     ... 

Wenn Sie default Variablen von Ihremeinschließen müssenSie tun können:

roles: 
    - { role: lock-deployment, 
     when: False 
    } 

Meine Lösung nicht ein elegantes ist, aber ich würde wirklich vorschlagen, um von roles für diese Art von Aktionen Anfahren und stattdessen includes tun.

Auch: Ich habe die Lösung nicht getestet und könnte tatsächlich nicht funktionieren. Aber es gibt eine Idee zu alternativen Lösungen.

+0

Danke tehmoon. Ich bin sehr neu in ansible, also probiere verschiedene Lösungen für das Problem aus. Ich würde diese Lösung auch versuchen und wählen, was auch immer sinnvoll ist. –

Verwandte Themen