2016-04-13 4 views
0

私は、1日に1回程度以上呼ばれる必要がないセクションを呼び出すことを避けることによって、プレイブックの実行をスピードアップしたいと考えています。いくつかのセクションの実行をスキップするにはどうすればよい事実を使用できますか?

私は実際にこれを実装することができると知っていますが、基本的な例を見つけることはほとんど不可能です:事実を設定し、それを読んで何かします。事実。

- name: "do system update" 
    shell: echo "did it!" 
- set_fact: 
    os_is_updated: true 

私の印象や事実が、実行の間に保存、ロード、キャッシュすることができる変数以外のものであれば?

帽子ansible.cfgは、すでにファクトキャッシングを2時間有効に設定しているとしましょう。

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

答えて

0

その性質上、ワークステーションのCLIツールとして、Anabilitiesには永続的なメカニズム(ほとんどの場合、設計上)がありません。外部ストアを使用するキャッシングプラグインはいくつかありますが(例:Redis, jsonfile)、一般的にファンではありません。

ターゲットマシンで自分自身を実行する間に、そのようなものを永続化したい場合は、/etc/ansible/facts.d(または自分でセットアップを呼び出すと任意の場所)にローカルファクトとして保存できます。そして、それらはansible_local辞書varのもとでgather_factsから戻ってきます。あなたは* nixの風味のプラットフォーム上で実行していると仮定すると、のようなもの:

- 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 

は明らかfacts.dでdir存在のものは、セットアップ定型ですが、私はあなたに完全に動作するサンプルを見せたかったです。

+0

申し訳ありませんが、私はすでにキャッシングが設定されていると仮定していますので、私が探しているのは、xが最後の2時間でキャッシュされていない場合(キャッシングタイムアウト)の例です。 – sorin

+0

何らかの理由で、set_factがファクトキャッシュに明示的に保持されません(理由は不明)。https://github.com/ansible/ansible/blob/26209342a28ad70775fa303035a12f4ff77c5f2e/lib/ansible/plugins/strategy/__init__.py#L328 – nitzmahone

関連する問題