2016-04-13 13 views
0

Ich möchte die Ausführung von Ansible Playbook beschleunigen, indem ich einige Abschnitte vermeiden möchte, die nicht öfter als einmal am Tag aufgerufen werden müssen.Wie kann ich zulässige Fakten verwenden, um die Ausführung einiger Abschnitte zu überspringen?

Ich weiß, dass Fakten uns erlauben, dies zu implementieren, aber es scheint fast unmöglich, ein grundlegendes Beispiel zu finden: ein Fakt zu setzen, es zu lesen und etwas zu tun, wenn es einen bestimmten Wert hat, einen Standardwert für eine Tatsache.

Wenn mein Eindruck oder Fakten nichts anderes sind als Variablen, die zwischen Ausführungen gespeichert, geladen und zwischengespeichert werden können?

Nehmen wir an, dass ansible.cfg bereits konfiguriert ist, um das Fakt-Caching für zwei Stunden zu aktivieren.

[defaults] 
gathering = smart 
fact_caching = jsonfile 
fact_caching_timeout = 7200 
fact_caching_connection = /tmp/facts_cache 

Antwort

0

Mit seiner Art als Workstation CLI-Tool, hat ansible hat keine eingebaute in Persistenzmechanismus (ziemlich viel von Design). Es gibt einige Fact-Caching-Plugins, die externe Speicher verwenden (zB Redis, jsonfile), aber ich bin im Allgemeinen kein Fan.

Wenn Sie solche Dinge zwischen den Zielmaschinen beibehalten wollen, können Sie sie als lokale Fakten in /etc/ansible/facts.d speichern (oder an einem beliebigen Ort, wenn Sie sich selbst anrufen) , und sie werden von gather_facts unter dem ansible_local dictionary var zurückkommen. Angenommen, Sie sind auf einer * nix-Geschmack Plattform laufen lassen, so etwas wie:

- hosts: myhosts 
    tasks: 
    - name: do update no more than every 24h 
    shell: echo "doing updates..." 
    when: (lookup('pipe', 'date +%s') | int) - (ansible_local.last_update_run | default(0) | int) > 86400 
    register: update_result 

    - name: ensure /etc/ansible/facts.d exists 
    become: yes 
    file: 
     path: /etc/ansible/facts.d 
     state: directory 

    - name: persist last_update_run 
    become: yes 
    copy: 
     dest: /etc/ansible/facts.d/last_update_run.fact 
     content: "{{ lookup('pipe', 'date +%s') }}" 
    when: not update_result | skipped 

Offensichtlich ist das facts.d dir Existenz Zeug ist Setup vorformulierten, aber ich wollte Ihnen ein voll funktionstüchtiges Beispiel zeigen.

+0

Entschuldigung, wenn ich nicht klar war, aber ich nahm an, dass ich das Caching bereits konfiguriert habe, also suche ich nach einem Beispiel von "do x, wenn x in den letzten 2 Stunden noch nicht gemacht wurde (Caching Timeout). – sorin

+0

Aus irgendeinem Grund wird set_fact explizit nicht in einem Faktcache gespeichert (nicht sicher warum). Https://github.com/ansible/ansible/blob/26209342a28ad70775fa303035a12f4ff77c5f2e/lib/ansible/plugins/strategy/__init__.py#L328 – nitzmahone