我希望通过避免调用一些不必每天调用一次以上的部分来加速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
答案 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存在的东西是设置样板,但我想向你展示一个完整的样本。