1

在 ansible (ver. 2.10) playbook 中,我需要调用 dpkg-reconfigure openssh-server 命令来重新创建 SSH 服务器密钥。

- name: Create new SSH host's keys
  shell: dpkg-reconfigure openssh-server
  notify: restart sshd

问题是 dpkg-reconfigure openssh-server 打开一个对话框,脚本被卡住了......

查看 ansible 文档,似乎 dpkg-reconfigure 可以由 debconf 模块管理:

与 locales 模块相关的代码示例:

- name: Set default locale to fr_FR.UTF-8
  debconf:
    name: locales
    question: locales/default_environment_locale
    value: fr_FR.UTF-8
    vtype: select

openssh-server debconf 模块的问题是:你想对修改后的配置文件 sshd_config 做什么?答案是:保持当前安装的本地版本。

我如何使用 ansible debconf 模块来管理它?

4

3 回答 3

2

这不是debconf问题。该文件被 Debian 打包标记为配置文件,并dpkg在通用级别处理它。dpkg --configure--force-confolddpkg-reconfigure没有。

https://wiki.debian.org/ConfigPackages也可能有用。

于 2021-04-08T12:28:38.203 回答
0

我正在寻找自己的解决方案,但我还没有找到一个可以通过 debconf 和 ansible 实现的解决方案。问题是,debconf 在 sshd_config 方面没有“选择”。当您查找 debconf 和 preseed(Debian 无人值守安装)时,根本没有参数可以指定保留当前的 ​​sshd_config。

例如活动 debconf 设置:

  sudo debconf-show openssh-server  
  openssh-server/permit-root-login: false
  openssh-server/password-authentication: false

这些是 ansible debconf 模块的问题。

我们正在寻找什么,但那是不可能的:

- debconf:
    name: openssh-server
    question: openssh-server/keep-current-sshd-config
    value: true

不幸的是,我们必须找到解决方法。就我而言,我想在我的树莓派上重新配置 openssh-server 幸运的是,在 raspbian OS /lib/systemd/system/regenerate_ssh_host_keys.service 上有一个 systemd 文件,正如其名。要使用它,只需删除 ssh_host_* 文件并重新启动机器。

如果您需要为不同的主机获取它,则需要找到另一种解决方法。也许通过 ansible 导入新的 ssh_host 密钥文件,或者构建一个小脚本。

于 2021-01-13T21:33:07.960 回答
0

TL;博士; 是的,使用 Ansible debconf 但mv /var/lib/dpkg/info/<package>.config在重新配置时将文件放在一边。

剩下的内容是为其他寻求深入了解 debconf 和 A​​nsible 的 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-reconfigurefinally 调用:

/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/confmodulewhich exec()s/usr/share/debconf/frontend强制<package>.config配置阶段发生。

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

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

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

HTH

于 2021-05-16T09:11:20.967 回答