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