【问题标题】:Is it possible to setup a Debian system in a deterministic manner?是否可以以确定的方式设置 Debian 系统?
【发布时间】:2020-05-20 01:17:17
【问题描述】:

在工作中,我们开发了一些 Python 软件,可在 Raspberry Pi 上的 Raspbian(基于 Debian)上运行。

我们有一些 Ansible 脚本可以获取新的 Raspbian 映像,在 Raspberry Pi 上启动,并对其进行配置以运行我们的软件。 Ansible 做了一些事情:

  • 使用 apt 安装一些必需的软件包
  • 设置 Python 虚拟环境,并使用 pip 和需求文件来安装运行软件所需的 Python 库的确切版本

每次 Ansible 运行时,它都会安装我们测试过我们软件的 Python 库(来自 PyPi)的确切版本,这一点非常棒。不幸的是,这不适用于通过 apt 安装的软件包。

执行 apt-get install package 或 Ansible 等效项会安装该软件包的最新版本。今天的版本,可能与明天的版本不一样。这意味着如果我今天运行我的 Ansible 脚本来设置 Raspberry Pi,我的软件可能会完美运行,但明天在新的 Raspberry Pi 上运行 Ansible 可能会从 apt 安装更新版本的软件,这可能会破坏我们的软件。

有什么办法可以做 pip 所做的事情,但对于 apt 吗?冻结当前安装的软件包版本,然后在新系统上安装时,安装那些确切版本的软件包?或类似的东西。

我知道我们可以安装我们想要的任何版本的软件包,并将 SD 卡克隆到其他 PI,但这首先违背了拥有 Ansible 脚本的目的。

【问题讨论】:

  • 你的意思是像(docker)容器镜像吗?

标签: python linux ansible raspberry-pi


【解决方案1】:

有这个工具值得一提。 https://github.com/TrevorSundberg/apt-lock

apt 和 apt-get 的包装器,用于强制安装包的确定性。灵感来自 npm 的 package-lock.json。

【讨论】:

  • 嗯...我希望该工具被更广泛地使用。它没有那么多星星或解决的问题。
【解决方案2】:

使用 ansible,您可以通过这种方式指定要安装哪个版本的包。

- name: Install the version '1.00' of package "foo"
  apt:
    name: foo=1.00

然后为了防止在系统升级的情况下升级包,将包标记为保持这种方式

- dpkg_selections:
    name: python
    selection: hold

【讨论】:

  • 这比pip freeze > requirements.txtpip install -r requirements.txt 稍微费力一些,尤其是因为您可能使用apt 安装的任何软件包都可能有几十个要求,您可能需要记录并指定确切的版本,但它应该可以工作。我希望apt repos Raspbian 使用不要摆脱旧版本的包。
猜你喜欢
  • 1970-01-01
  • 2018-11-26
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
  • 2013-01-20
  • 2018-09-15
  • 1970-01-01
  • 2011-11-27
相关资源
最近更新 更多