2016-04-13 88 views
0

我想通過避免調用某些不需要每天多次調用的部分來加速劇本的執行速度。如何使用可靠的事實來跳過某些部分的執行?

我知道事實應該可以讓我們實現這一點,但似乎幾乎不可能找到一些基本的例子:設置一個事實,閱讀它並做某件事,如果它有一個特定的值,設置一個默認值爲事實。

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

如果我的印象或事實無非是可以在執行之間保存,加載和緩存的變量嗎?

我們假設帽子ansible.cfg已配置爲啓用事實緩存兩個小時。

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

回答

0

由於其作爲工作站CLI工具的性質,Ansible沒有任何內置的持久性機制(幾乎沒有設計)。有一些事實緩存插件會使用外部存儲(例如,Redis, jsonfile),但我通常不是粉絲。

如果您希望在目標機器上運行自己之間的東西,您可以將它們作爲本地事實存儲在/etc/ansible/facts.d中(如果您自己調用setup,則可以將它們存儲爲任意位置) ,他們會從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