2016-07-18 4 views
1

Ich habe einen tasks.yml, dass so etwas enthält:Abort, wenn keine der vorherigen Aufgaben ausgeführt wurden

- name: something on Debian wheezy 
    when: ansible_distribution == 'Debian' and ansible_distribution_version == '7' 

- name: something on Debian jessie 
    when: ansible_distribution == 'Debian' and ansible_distribution_version == '8' 

- name: something on Ubuntu 
    when: ansible_distribution == 'Ubuntu' 

Ich möchte eine neue Aufgabe (oder etwas) hinzuzufügen, die die Textbuch wird abgebrochen, wenn keine dieser Aufgaben ausgeführt wurden.

Vielleicht "etwas" installiert ein Paket, und einige Aufgaben, die danach kommen, konfigurieren das neu installierte Paket. Wenn ich das Playbook auf einem RedHat-System laufe, wird dieses Paket nicht installiert, und ich möchte es abbrechen, bevor ich die Aufgaben ausführe, die es konfigurieren.

Ich glaube, ich könnte etwas tun, wie:

- fail: msg="abort!" 
    when: not (ansible_distribution == 'Debian' and ansible_distribution_version == '7') and not (ansible_distribution == 'Debian' and ansible_distribution_version == '8') and not ansible_distribution == 'Ubuntu' 

... aber das ist ärgerlich. Gibt es eine bessere Lösung?

+0

Sind Sie sicher, dass dies ein gutes Spielbuch Design ist? Ich würde es vorziehen, am Anfang der Playbook-Ausführung zu versagen, wenn das Betriebssystem nicht unterstützt wird, oder wenn es nicht wichtig ist, einfach die unnötigen Aufgaben zu überspringen. –

+0

Richtig, das ist vielleicht besser, wenn man früh versagt, aber das bedeutet, dass man an zwei recht weit auseinander liegenden Orten nach unterstützten Betriebssystemen sucht, was ich auch nicht mag. Ich würde lieber dort versagen und wissen, dass das ist, warum dieses bestimmte Betriebssystem nicht unterstützt wird, und fügen Sie dann den Code hinzu, um etwas für dieses OS zu installieren und es einen Tag zu nennen. – Gohu

Antwort

1
--- 
- name: test 
    hosts: localhost 

    tasks: 
    - name: Install pkg 
    debug: msg="Installed pkg" 
    when: "{{ ansible_distribution == 'Debian' }}" 
    register: debian_pkg 

    - name: Install pkg 
    debug: msg="Installed pkg" 
    when: "{{ ansible_distribution == 'Ubuntu' }}" 
    register: ubuntu_pkg 

    - fail: msg="Unsupported OS" 
    when: "debian_pkg|skipped and ubuntu_pkg|skipped" 
+0

'pkg_installed' in diesem Beispiel ist in jeder Task registriert - also löst es eine fehlgeschlagene Aufgabe aus, wenn die Debian-Aufgabe erledigt ist und die Ubuntu-Aufgabe übersprungen wird. –

+0

@KonstantinSuvorov Ich habe das gerade erkannt. Das Snippet wurde bereits repariert. –

+1

Ja, gut. Aber ich werde meinen Kommentar für Leute hinterlassen, die denken, warum es verschiedene registrierte Variablen gibt und nicht die gleiche :) –

0

Ich ging endlich eine einfachere, mehr "Business" - genaue Art und Weise. Ich möchte something installieren, und ich erwarte dann something installiert werden. In der Tat, in meiner Infrastruktur, wo nicht alles automatisiert ist (ich bin nicht root überall) kann ich manchmal nicht installieren something, aber ich möchte immer noch überprüfen, dass es installiert ist (es wurde Out-of-Band installiert).

Also, nach den Aufgaben, die something je nach Betriebssystem installieren, fügte ich eine Aufgabe, die überprüft, ob es installiert ist, einfach, indem Sie versuchen, es auszuführen. Etwas wie das:

- include: install_something.yml # contains the install tasks for each OS 
    when: can_become_root 

- name: Check that something is installed 
    command: something --version 
Verwandte Themen