我怎样才能使用ansible事实来跳过某些部分的执行?

时间:2016-04-13 12:48:38

标签: ansible ansible-facts

我希望通过避免调用一些不必每天调用一次以上的部分来加速ansible playbook的执行。

我知道事实应该允许我们实现这一点,但似乎几乎不可能找到一些基本的例子:设置一个事实,阅读它并做一些事情,如果它有一个特定的值,设置一个默认值为事实。

- 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

1 个答案:

答案 0 :(得分:0)

作为工作站CLI工具的本质,Ansible没有任何内置的持久性机制(几乎是设计)。有一些事实缓存插件将使用外部存储(例如,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存在的东西是设置样板,但我想向你展示一个完整的样本。