如何使用ansible事实跳过某些部分的执行?

如何使用ansible事实跳过某些部分的执行?,ansible,ansible-facts,Ansible,Ansible Facts,我希望通过避免调用一些不必一天调用一次以上的部分来加速ansible playbook的执行 我知道事实应该允许我们实现这一点,但似乎不可能找到一些基本的例子:设置一个事实,阅读它并做一些事情,如果它有一个特定的值,为一个事实设置一个默认值 - name: "do system update" shell: echo "did it!" - set_fact: os_is_updated: true 如果我的印象或事实只是可以在执行之间保存、加载和缓存的变量 假设hatansibl

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

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

- name: "do system update"
  shell: echo "did it!"
- set_fact:
    os_is_updated: true
如果我的印象或事实只是可以在执行之间保存、加载和缓存的变量

假设hat
ansible.cfg
已配置为启用事实缓存两小时

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

Ansible本质上是一个工作站CLI工具,它没有任何内置的持久性机制(基本上是设计上的)。有一些事实缓存插件将使用外部存储(例如),但我一般不喜欢

如果您想在目标机器上运行之间保存类似的内容,可以将它们作为本地事实存储在/etc/ansible/facts.d中(如果您自己调用setup,则存储在任意位置),它们将从ansible\u local dictionary变量下的gather\u 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 existence的内容是安装样板,但我想向您展示一个完整的工作示例。

如果我不清楚,很抱歉,但我假设我已经配置了缓存,因此我正在寻找一个“如果x在过去2小时内没有完成,则执行x(缓存超时)”的示例。由于某些原因,set_事实未显式保留到事实缓存(不确定原因)。