在更改应用程序的 debconf 设置后,如何让 Ansible 真正编译配置文件?

在更改应用程序的 debconf 设置后,如何让 Ansible 真正编译配置文件?

我正在使用 Ansible 尝试配置与特定项目相关的所有工作站,以便能够使用标准配置的 BitTorrent 同步(这实际上只是我想要做的事情的一个示例)。

当我执行剧本时,我可以确认远程电脑上的 debconf 设置已更新,但是应用程序的配置文件尚未更新。

有没有办法让 ansible 完成这项工作——提供了一堆配置数据后,我只想重新编译实际的配置文件,然后重新启动服务。

我在 Ubuntu 14.10 64 位主机上使用最新的 Ansible(来自 PyPi)。

- hosts: btsync
  sudo: True
  tasks:
    - apt_repository: repo='ppa:tuxpoldo/btsync' update_cache=yes state=present
    - apt: name=btsync state=present
    - apt: name=debconf-utils state=present
    - apt: name=btsync-gui state=present
    - file: name='create a directory for BT Sync' path=/home/sal/bittorrent_sync state=directory owner=sal group=users mode=0755
    - debconf: name='btsync' question='btsync/runas' value='sal' vtype='string'
    - debconf: name='btsync' question='btsync/directory_root' value='/home/sal/bittorrent_sync' vtype='string'
    - debconf: name='btsync' question='btsync/webgui-bindaddr' value='0.0.0.0' vtype='string'
    - debconf: name='btsync' question='btsync/folder_defaults-use_lan_broadcast' value='true' vtype='boolean'
    - debconf: name='btsync' question='btsync/log_size' value='1' vtype='string'
    - debconf: name='btsync' question='btsync/folder_defaults-use_dht' value='true' vtype='boolean'
    - service: name='btsync' state=restarted

我可以强制从 debconf 重新配置配置文件,如下所示:

sudo dpkg-reconfigure -f noninteractive btsync

我想我可以强制 Ansible 远程执行该语句,但肯定有更好、更像 Ansible 的方法来做到这一点?

答案1

这就是 debconf 的工作方式,如果您刚刚编辑了文件,您也不会期望软件包会自动重新配置。

您需要的是一个通知处理程序,它在游戏结束时执行一次 dpkg 重新配置。

- debconf:
  name: 'btsync'
  question: 'btsync/folder_defaults-use_dht'
  value: 'true'
  vtype: 'boolean'
notify: reconfigure btsync

并在您的处理程序文件中:

- name: reconfigure btsync
  command: sudo dpkg-reconfigure -f noninteractive btsync

现在,如果 debconf 确实改变了任何东西(并且只有当幂等时),当所有任务都运行时,btsync 将重新配置一次。

答案2

TL;DR; 使用 Ansible debconf,然后mv /var/lib/dpkg/info/<package>.config在重新配置时将文件放在一边dpkg-reconfigure

其余部分适合那些想深入了解 debconf 和 A​​nsible 的 debconf 模块的人。

我花了一些时间研究这个问题,并向 Ansible debconf 模块提交了一些文档,为了得到这个答案我对其进行了一些编辑。

在 Debian 中重新配置软件包debconf并不简单!

Ansible debconf 模块不会重新配置软件包,它只会更新 debconf 数据库。需要额外的 playbook 步骤(通常通过 debconf 发生更改时通知)来重新配置软件包并应用更改。

现在debconf主要用于安装之前的预先播种配置。

因此,虽然dpkg-reconfigure确实使用 debconf 数据,但它并不总是权威的,您可能需要检查您的包是如何处理的。

dpkg-reconfigure/var/lib/dpkg/info是一个 3 阶段过程。它使用以下参数从目录调用控制脚本:

  <package>.prerm  reconfigure <version>
  <package>.config reconfigure <version>
  <package>.postinst control <version>

主要问题是,<package>.config许多软件包的重新配置步骤将首先通过检查磁盘配置来重置 debconf 数据库(覆盖 Ansible 模块所做的更改)。如果您的软件包是这种情况,那么dpkg-reconfigure将有效地忽略此模块所做的更改debconf

然而尽管dpkg-reconfigure最终调用:

/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

sources /usr/share/debconf/confmoduleexec()/usr/share/debconf/frontend强制<package>.config进行配置阶段。

这是基于 .config 文件的存在(即使用 shell [-e])完成的,并且无法避免。

解决方案是在(或其他相关的 debconf 代码)运行mv /var/lib/dpkg/info/<package>.config时避开。dpkg-reconfigure

请注意,Debian 程序员手册说配置脚本的唯一的目的是为了填充 debconf 并且不能影响其他文件;所以在剧本中这样做(据我理解)符合 debian 政策:http://www.fifi.org/doc/debconf-doc/tutorial.html#AEN113

高血压

相关内容