我正在使用 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 和 Ansible 的 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
source
s /usr/share/debconf/confmodule
exec()/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
高血压