0

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

我知道事实应该允许我们实现这一点,但似乎几乎不可能找到一些基本示例:设置事实,读取它并在它具有特定值时执行某些操作,为事实设置默认值。

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

如果我的印象或事实只不过是可以在执行之间保存、加载和缓存的变量?

假设 hatansible.cfg已经配置为启用事实缓存两个小时。

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

1 回答 1

0

就其作为工作站 CLI 工具的性质而言,Ansible 没有任何内置的持久性机制(几乎是设计使然)。有一些事实缓存插件会使用外部存储(例如,Redis、jsonfile),但我通常不是粉丝。

如果您想在目标机器上自己运行之间保留类似的东西,您可以将它们作为本地事实存储在 /etc/ansible/facts.d 中(或者如果您自己调用 setup 则存储在任意位置),并且它们'将从 ansible_local 字典变量下的 collect_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

显然 fact.d 目录存在的东西是设置样板,但我想向您展示一个完整的示例。

于 2016-04-13T18:51:22.427 回答