如何通过不经常运行整个部分来加速ansible?

时间:2016-03-02 16:57:17

标签: ansible

假设正常的部署脚本做了很多事情,其中​​许多都与准备操作系统本身有关。

即使没有什么新事可做,这些任务也需要很长时间才能运行,而且我希望比每天一次更频繁地阻止它们运行。

我知道我可以使用标签来过滤我正在运行的内容,但这不是重点:我需要让ansible意识到这些“部分”在一小时前成功执行,因此,它现在会跳过整个块

我原本以为缓存事实应该这样做,但不知何故,我无法看到任何阅读案例。

2 个答案:

答案 0 :(得分:1)

你需要弄清楚如何确定"成功执行了什么"手段。只是一个给定的剧本跑完了吗?某些角色跑完了?有哪些指标可以让您确定成功?

正如您所提到的,我不认为事实缓存会帮助您,除非您想要将自定义事实引入每个主机(http://docs.ansible.com/ansible/playbooks_variables.html#local-facts-facts-d

我通常会想出一组表明角色已经运行的变量/事实。有时这涉及进行shell调用和注册变量,查看收集的事实并确定是否存在某些文件。我对角色的典型模式看起来像这样

<强>角色/ my_role / main.yml

- name: load facts
  include: facts.yml

- name: run config tasks if needed
  include: config.yml
  when: fact_var1 and fact_vars2 and inv_var1 and reg_var1

您还可以动态编写一个yaml变量文件,该文件包含在您的剧本中,并包含有关配置的环境状态的变量。这是一个更全球化的选项,如果您需要查看单个计算机的已配置状态,则无法正常工作。对此的扩展是将状态变量写入host_vars或group_vars库存变量文件。这些将按主机自动加载到主机上。

答案 1 :(得分:1)

不幸的是,据我所知,事实缓存只会缓存host based facts模块中创建的setup,因此不允许您使用set_fact来注册事实上,例如,角色已经完成,然后在角色开始时有条件地检查角色。

相反,您可能需要考虑将Ansible与其他产品一起使用,以更复杂的方式编排它。