TL;博士; 是的,使用 Ansible debconf 但mv /var/lib/dpkg/info/<package>.config
在重新配置时将文件放在一边。
剩下的内容是为其他寻求深入了解 debconf 和 Ansible 的 debconf 模块的人准备的。
我花了一些时间对此进行了深入研究,并向 Ansible debconf 模块提交了一些文档,为此我对其进行了一些编辑。
在 Debian 中使用重新配置软件包debconf
并不简单!
Ansible debconf 模块不会重新配置包,它只是更新 debconf 数据库。需要一个额外的剧本步骤(通常通过通知 debconf 进行更改)来重新配置包并应用更改。
Nowdebconf
主要用于安装前的预播种配置。
因此,虽然dpkg-reconfigure
确实使用 debconf 数据,但它并不总是具有权威性,您可能需要检查您的包是如何处理的。
dpkg-reconfigure
是一个 3 阶段的过程。/var/lib/dpkg/info
它使用以下参数从目录调用控制脚本:
<package>.prerm reconfigure <version>
<package>.config reconfigure <version>
<package>.postinst control <version>
主要问题是<package>.config
许多软件包的重新配置步骤将首先通过检查磁盘配置来重置 debconf 数据库(覆盖 Ansible 模块所做的更改)。如果您的包是这种情况,那么将有效地忽略此模块dpkg-reconfigure
所做的更改。debconf
然而,虽然dpkg-reconfigure
finally 调用:
/var/lib/dpkg/info/<package>.postinst configure <version>
实际配置包;事实证明,使用它并不是那么简单。该脚本预计将从“debconf 前端”运行,并使用 IPC 响应_db_cmd
脚本中的语句。
要更详细地了解这一点
export DPKG_MAINTSCRIPT_PACKAGE=<package>
export DPKG_MAINTSCRIPT_NAME=<script path>
export DEBIAN_HAS_FRONTEND=1
并运行脚本。我试图设置无人值守升级,所以我跑了:
sh -x /var/lib/dpkg/info/unattended-upgrades.postinst configure 1.11.2
然后停止等待来自前端的响应。
跑步
/usr/share/debconf/frontend /var/lib/dpkg/info/unattended-upgrades.postinst configure 1.11.2
工作......但有完全相同的问题dpkg-reconfigure
- 它重置 debconf 数据库:(
这是因为运行
/var/lib/dpkg/info/unattended-upgrades.postinst configure 1.11.2
source
s /usr/share/debconf/confmodule
which exec()s/usr/share/debconf/frontend
强制<package>.config
配置阶段发生。
这是基于 .config 文件的存在(即使用 shell [-e])完成的,无法避免。
解决方案是mv /var/lib/dpkg/info/<package>.config
在dpkg-reconfigure
(或其他相关的 debconf 代码)运行时不碍事。
注意 Debian 程序员手册说配置脚本的唯一目的是填充 debconf 并且不能影响其他文件;所以在剧本中这样做(据我了解)符合 debian 政策:http ://www.fifi.org/doc/debconf-doc/tutorial.html#AEN113
HTH