问题描述
在使用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
模块来刷新软件包事实。
请注意,这种方法需要手动执行脚本或命令来刷新软件包事实,并确保在适当的时机执行。