Suche…


Bemerkungen

Offizielle Dokumente erklären die Bedingungen für das Playbook.

Ansible (Github)

Welche Arten von Bedingungen sollten verwendet werden?

Verwenden Sie Conditionals via (Syntax steht in [brackets] ):

  • wann [ wann: ]

    Task:
       - name: run if operating system is debian
         command: echo "I am a Debian Computer"
         when: ansible_os_family == "Debian"
    
  • Schleifen [ with_items: ]

  • Schleifen [ with_dicts: ]

  • Benutzerdefinierte Fakten [ when: my_custom_facts == '1234']

  • Bedingte Einfuhren

  • Wählen Sie Dateien und Vorlagen basierend auf Variablen aus

[When] Bedingung: `ansible_os_family` Listen

Allgemeiner Gebrauch

  • wann: ansible_os_family == "CentOS"
  • wann: ansible_os_family == "Redhat"
  • wann: ansible_os_family == "Darwin"
  • wann: ansible_os_family == "Debian"
  • wann: ansible_os_family == "Windows"

Alle Listen

basierend auf hier diskutieren http://comments.gmane.org/gmane.comp.sysutils.ansible/4685

OS_FAMILY = dict(
            RedHat = 'RedHat',
            Fedora = 'RedHat', 
            CentOS = 'RedHat', 
            Scientific = 'RedHat',
            SLC = 'RedHat', 
            Ascendos = 'RedHat', 
            CloudLinux = 'RedHat', 
            PSBM = 'RedHat',
            OracleLinux = 'RedHat', 
            OVS = 'RedHat', 
            OEL = 'RedHat', 
            Amazon = 'RedHat',
            XenServer = 'RedHat', 
            Ubuntu = 'Debian', 
            Debian = 'Debian', 
            SLES = 'Suse',
            SLED = 'Suse', 
            OpenSuSE = 'Suse', 
            SuSE = 'Suse', 
            Gentoo = 'Gentoo',
            Archlinux = 'Archlinux', 
            Mandriva = 'Mandrake', 
            Mandrake = 'Mandrake',
            Solaris = 'Solaris', 
            Nexenta = 'Solaris',  
            OmniOS = 'Solaris', 
            OpenIndiana = 'Solaris',
            SmartOS = 'Solaris', 
            AIX = 'AIX', 
            Alpine = 'Alpine', 
            MacOSX = 'Darwin',
            FreeBSD = 'FreeBSD', 
            HPUX = 'HP-UX'
        )

Wenn Bedingung

Grundlegende Verwendung

Mit der when-Bedingung können Sie steuern, ob eine Aufgabe oder Rolle ausgeführt wird oder übersprungen wird. Dies wird normalerweise verwendet, um das Spielverhalten basierend auf Fakten des Zielsystems zu ändern. Betrachten Sie dieses Spielbuch:

- hosts: all
  tasks:
    - include: Ubuntu.yml
      when: ansible_os_family == "Ubuntu"
    
    - include: RHEL.yml
      when: ansible_os_family == "RedHat"

Wo Ubuntu.yml und RHEL.yml eine verteilungsspezifische Logik enthalten.

Eine weitere häufige Verwendung ist das Begrenzen der Ergebnisse auf bestimmte Ansible-Bestandsgruppen. Betrachten Sie diese Bestandsdatei:

[dbs]
mydb01

[webservers]
myweb01

Und dieses Spielbuch:

- hosts: all
  tasks:
    - name: Restart Apache on webservers
      become: yes
      service:
        name: apache2
        state: restarted
      when: webservers in group_names

Hier wird die magische Variable group_names .

Bedingte Syntax und Logik

Einzelbedingung

Syntax

when: (condition)

Beispiel

  • when: ansible_os_family == "Debian"
  • when: ansible_pkg_mgr == "apt"
  • when: myvariablename is defined

Boolescher Filter

Beispiel

when: result|failed

Mehrere Bedingungen

Syntax

When: condition1 and/or condition2

Beispiel (einfach)

when: ansible_os_family == "Debian" and ansible_pkg_mgr == "apt"

Beispiel (komplex)

Verwenden Sie zur Klarheit oder zur Kontrolle der Rangfolge Klammern. "UND" hat eine höhere Priorität als "ODER".

Klauseln können Zeilen umfassen:

when:
  ansible_distribution in ['RedHat', 'CentOS', 'ScientificLinux'] and
  (ansible_distribution_version|version_compare('7', '<') or
  ansible_distribution_version|version_compare('8', '>='))
  or
  ansible_distribution == 'Fedora'
  or
  ansible_distribution == 'Ubuntu' and
  ansible_distribution_version|version_compare('15.04', '>=')

Beachten Sie die Verwendung von Klammern, um das "oder" bei der ersten Verteilungsprüfung zu gruppieren.

Holen Sie sich `ansible_os_family` und` ansible_pkg_mgr` mit dem Setup

Wir können Fakten ( ansible_os_family , ansible_pkg_mgr ) mit dem Ad-Hoc-Befehl des Setup-Moduls und des Filters erhalten.

  • ansible_os_family:

      $ ansible all -m setup -a 'filter=ansible_os_family'
      ra.local | SUCCESS => {
          "ansible_facts": {
              "ansible_os_family": "Debian"
          },
          "changed": false
      }
    
  • ansible_pkg_mgr:

      $ ansible all -m setup -a 'filter=ansible_pkg_mgr'
      debian.local | SUCCESS => {
          "ansible_facts": {
              "ansible_pkg_mgr": "apt"
          },
          "changed": false
      }
    

Einfache "Wann" -Beispiele

Gegeben:

---
variable_name: True

Dann laufen diese Aufgaben immer mit.

- name: This is a conditional task
  module: src=/example/ dest=/example
  when: variable_name 

- name: This is a conditional task
  module: src=/example/ dest=/example
  when: True

Diese Aufgabe wird niemals ausgeführt.

- name: This is a conditional task
  module: src=/example/ dest=/example
  when: False

Verwenden Sie bis, um eine erneute Wiederholung des Live-Checks zu versuchen

Dies ist ein Beispiel für die Verwendung einer Option / retries / delay, um eine Live-Überprüfung für eine startende Webanwendung zu implementieren. Es wird davon ausgegangen, dass es einige Zeit (bis zu 3 Minuten) gibt, in der die Webapp Socket-Verbindungen ablehnt. Danach wird die / Alive-Seite nach dem Wort "OK" durchsucht. Es delegiert auch den Abruf der URL an den localhost, der ausgeführt wird. Dies ist als letzte Aufgabe in einem Bereitstellungsspielbuch sinnvoll.

---
- hosts: my-hosts
  tasks:
  - action: uri url=http://{{ ansible_all_ipv4_addresses }}:8080/alive return_content=yes
    delegate_to: localhost
    register: result
    until: "'failed' not in result and result.content.find('OK') != -1"
    retries: 18
    delay: 10

Das Muster für das Wiederholungsversuch kann mit jeder Aktion verwendet werden. Die Ansible-Dokumentation enthält ein Beispiel für das Warten, bis ein bestimmter Shell-Befehl ein gewünschtes Ergebnis zurückgibt: http://docs.ansible.com/ansible/playbooks_loops.html#do-until-loops .



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow