如何在本地下载的软件包安装时解决依赖关系

68次阅读
没有评论

问题描述

在使用Ansible的playbook时,尝试在本地服务器上安装Debian软件包。该playbook在本地主机上运行,并在同一系统中安装Debian软件包。但是,即使本地存储库中存在依赖软件包,该playbook也会出现“依赖关系无法满足”的错误。
用户可以使用apt-get install --download-only package_name命令将特定软件包所需的所有依赖项下载到本地存储库中。
但是,在playbook中,用户希望有一种机制可以先安装依赖项,然后再安装实际的软件包。这个任务应该是动态的,playbook应该能够自动解决任何软件包的依赖关系。

install_dependencies.yml

---- 
hosts: localhost  
vars:    
  remote_media_directory: "/home/local_repository"  
become: yes  
tasks:    
  - name: find all debian Packages      
    find:         
      paths:             
        - "{{ remote_media_directory }}"         
      file_type: file         
      recurse: yes         
      use_regex: yes         
      patterns:           
        - '.*deb$'      
    register: files_matched_subdirectory    
  - name: installation debian packages      
    apt:        
      deb: "{{ item.path }}"      
    with_items: "{{ files_matched_subdirectory.files }}"      
    when: ansible_distribution == "Ubuntu"

用户在评论中提到了一些选项,但是对此没有任何了解。他们尝试过使用dkpg -i命令安装,然后执行apt-get install -f命令吗?可能需要使用带有dpkg_options选项的APT模块。他认为这是一个与Debian相关的问题,而不是Ansible的问题。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

首先,我建议您考虑使用自己的真实软件包存储库。如果您使用Ansible,那么您似乎看到了自动化的好处,因此这将是一个自然的步骤。它将根据依赖关系图和可用的软件包自动确定适当的安装顺序。还有其他工具可以完成这项工作,但是reprepo易于使用,似乎非常适合较小规模的软件包存储库。
您没有提供有关此playbook失败的系统的信息。但是,症状非常明显。而且这与Ansible没有任何关系。
/home/local_repository/wireshark_3.0.5-1_amd64.deb无法安装,因为它需要wireshark-qt (= 3.0.5-1)(即wireshark-qt软件包的确切版本)
/home/local_repository/wireshark-qt_3.0.5-1_amd64.deb(前一项中命名的依赖项)失败,因为它的依赖项libc6 (>= 2.29)不可用。

为了弄清楚到底发生了什么,您需要提供有关系统的更多详细信息。但是,我可以告诉您如何查找更多详细信息。
只需在依赖项(wireshark-qtlibc)上使用apt-cache policy <package-name>命令,以查看可用的软件包版本。
如果我要猜测,您的问题是您尝试在旧于软件包所需的先决条件的系统上安装此软件包。尝试强制安装更新的libc软件包是一个非常糟糕的主意,因为它在系统中的作用。它可能导致您的系统无法使用。
例如,如果您尝试在当前的Debian 10(即当前的Buster==stable)上执行此操作,您可以在此表中(内容可能会更改,因此我包含了屏幕截图)中看到,仅libc6 (>= 2.29)先决条件无法满足:
如何在本地下载的软件包安装时解决依赖关系
或者,您可以在此处查看,并在右上角的当前版本之间导航(在撰写本文时):
如何在本地下载的软件包安装时解决依赖关系
找出是否有更新的软件包可用的第一步是查看当前版本的软件包搜索。要找出当前版本,请使用lsb_release -a(查看所有信息)或lsb_release -cs(查看短代码名称,例如buster)。
这是Ubuntu的类似概述:
如何在本地下载的软件包安装时解决依赖关系
根据您尝试安装的软件包版本,我猜测您正在尝试在旧版Ubuntu上安装eoan(19.10)软件包,我是对的吗?
您可以尝试下载这两个软件包(wiresharkwireshark-qt)的源代码(apt-get source <package-name>)并尝试自己构建它。如果幸运的话,您可以根据特定版本的Qt和libc构建新版本的Wireshark。可以说,Qt(及其依赖项)可能比libc更容易出现问题。
但是,很可能更容易将系统升级到19.10,等待大约4个月,直到发布focal(即Ubuntu 20.04),或者安装一个VM或容器,以便您可以运行较新版本的Wireshark。
但是,请注意,除了使用Ansible调用安装命令之外,这些都与Ansible无关。

方案2

如果您仍然希望在本地安装软件包并解决依赖关系,您可以尝试使用dpkg命令手动安装软件包并使用apt-get install -f命令解决依赖关系。
以下是一个示例脚本,可以在容器A启动后启动容器B:

#!/bin/bash
# 启动容器A
docker run -d --name container_a your_image_a
# 等待容器A完全启动
while ! docker exec container_a echo "Container A is ready"; do
  sleep 1
done
# 启动容器B
docker run -d --name container_b your_image_b

在这个示例中,我们首先使用docker run命令启动容器A,并将其命名为container_a。然后,使用一个循环来等待容器A完全启动(这里是通过在容器内运行echo命令来测试)。一旦容器A就绪,我们再使用docker run命令启动容器B,并将其命名为container_b
请注意,这只是一个示例脚本,您需要根据实际情况进行修改和调整。

正文完