Ansible中如何在安装或删除软件包后自动使包事实失效

87次阅读
没有评论

问题描述

在使用Ansible时,想知道在安装或删除软件包后,包事实是否会自动失效。他在任务中使用了package_facts模块来收集软件包事实,并希望只在软件包发生变化时执行任务。然而,他无法找到有关软件包事实何时失效的信息。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

在Ansible中,软件包事实(以及其他事实,如设备、磁盘及其分区、IP地址等)不会自动刷新。但你可以使用handler来实现在可能使缓存失效的任务中刷新软件包事实。以下是一个示例:
1. 创建一个Playbook文件。
2. 在Playbook中定义主机和任务。
3. 在任务中使用package_facts模块来无条件地收集软件包事实。
4. 在可能使缓存失效的任务中使用notify关键字来通知刷新软件包事实的handler
5. 在handler中定义刷新软件包事实的任务。
以下是一个示例Playbook:

- name: Pseudo code demo for package facts refresh
  hosts: localhost
  tasks:
    - name: Gather the package facts unconditionally at play start
      package_facts:
    - name: Make sure package X is installed
      package:
        name: package_X
      notify: refresh_package_facts
      # By default, handlers run at the end of the play.
      # If you want to force them to run at a certain point,
      # you need the following meta task.
      # Note => this will run !!ALL!! notified handlers
    - name: Run handlers if notified
      meta: flush_handlers
    - name: This task will run with an up-to-date cache
      debug:
        msg: "{{ ansible_facts.packages | length }} packages are installed"
  handlers:
    - name: Refresh the package facts
      package_facts:
      listen: refresh_package_facts

在上面的示例中,我们定义了一个Playbook,其中包含了一个任务来收集软件包事实,并使用notify关键字通知刷新软件包事实的handler。当任务中的软件包发生变化时,handler会被触发,刷新软件包事实。
请注意,handler默认在Playbook的末尾运行。如果你想强制它们在特定位置运行,可以使用meta任务来刷新所有通知的handler

方案2

使用脚本或工具来管理软件包事实的刷新可能会增加复杂性,并且需要确保在适当的时机刷新软件包事实。
另一种方法是编写脚本或使用工具来控制软件包事实的刷新。你可以在任务中使用shell模块来手动刷新软件包事实,或者使用一些第三方工具来管理软件包事实的缓存。

示例:

以下是一个简单的bash脚本示例,可以在安装或删除软件包后刷新软件包事实:

#!/bin/bash
# 安装或删除软件包
# ...
# 刷新软件包事实
ansible localhost -m package_facts

在这个示例中,我们首先执行安装或删除软件包的操作。然后,使用ansible命令和package_facts模块来刷新软件包事实。
请注意,这种方法需要手动执行脚本或命令来刷新软件包事实,并确保在适当的时机执行。

正文完