dpkg-重新配置ansible剧本中的openssh服务器

在一个Ansible(2.10版)剧本中,我需要调用dpkg-reconfigure openssh-server命令来重新创建SSH服务器密钥。

[uwsgi]

#=======================
# DO NOT EDIT THIS FILE
#=======================

# chdir to the folder of this config file
chdir = %d
# %d is the dir this configuration file is in
#socket = %dapp.sock
http = :8001
# load the module from wsgi.py,it is a python path from
# the directory above.
module = geodjango_2021.wsgi:application
# allow anyone to connect to the socket (666). This is very permissive
chmod-socket=664

master = true
processes = 4
vacuum = true
#harakiri = 30
#threads = 2 

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

查看Ansible文档,看来dpkg-reconfigure可以由debconf模块管理:

与语言环境模块有关的代码示例:

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

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

如何使用ansible debconf模块对其进行管理?

kevinlee1986 回答:dpkg-重新配置ansible剧本中的openssh服务器

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

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

,

我正在寻找自己的解决方案,但我还没有找到可以通过 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 操作系统 /lib/systemd/system/regenerate_ssh_host_keys.service 上有一个 systemd 文件,它按照名称进行操作。 要使用它,只需删除 ssh_host_* 文件并重新启动机器即可。

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

,

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

剩下的内容供其他人使用,以深入了解 debconf 和 A​​nsible 的 debconf 模块。

我花了一些时间对此进行了深入研究,并向 Ansible debconf 模块提交了一些文档,我为此答案对其进行了一些编辑。

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

Ansible debconf 模块不会重新配置包,它只是更新 debconf 数据库。需要一个额外的剧本步骤(通常通过通知如果 debconf 进行更改)来重新配置包并应用更改。

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

因此,虽然 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 最终调用:

/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/confmodule which exec()s /usr/share/debconf/frontend 强制执行 <package>.config 配置阶段。

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

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

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

HTH

本文链接:https://www.f2er.com/1272588.html

大家都在问