首页 > 解决方案 > 如何解决 Ansible 中本地下载包的依赖关系?当包 A 依赖于包 B

问题描述

我有一个简单的剧本,试图在我的服务器上安装本地下载的 Debian 软件包。该剧本在 localhost 上运行,并将 Debian 软件包安装在同一系统中。但是这个剧本给出了一个错误“对于某些包的依赖关系是不满足的,即使依赖包在本地存储库中是可用的。

我可以使用在我的本地存储库中下载特定包所需的所有依赖项apt-get install --download-only package_name

但是在我的剧本中,我应该有一种机制来先安装依赖项而不是安装实际的包。此任务应该是动态的,剧本应该自行解决任何软件包安装的依赖关系。

当包依赖于另一个包时,剧本如何动态解析。

探索的一些选项:

Using ordered indexed_items, using gdebi.. Looking for efficient Logic.

本地存储库有包-> 它可以根据要求增长:

wireshark_3.0.5-1_amd64.deb  wireshark-qt_3.0.5-1_amd64.deb

这里wireshark_3.0.5-1_amd64.deb依赖于wireshark-qt_3.0.5-1_amd64.deb。

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"

ansible-playbook install_dependencies.yml

PLAY [localhost] **********************************************************************************************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************************************************************************************************
ok: [localhost]

TASK [find all debian Packages] *******************************************************************************************************************************************************************************
ok: [localhost]

TASK [installation debian packages] ***************************************************************************************************************************************************************************
failed: [localhost] (item={u'uid': 0, u'woth': False, u'mtime': 1571850269.5720358, u'inode': 31195175, u'isgid': False, u'size': 46700, u'roth': True, u'isuid': False, u'isreg': True, u'pw_name': u'root', u'gid': 0, u'ischr': False, u'wusr': True, u'xoth': False, u'rusr': True, u'nlink': 1, u'issock': False, u'rgrp': True, u'gr_name': u'root', u'path': u'/home/local_repository/wireshark_3.0.5-1_amd64.deb', u'xusr': False, u'atime': 1571850391.3553286, u'isdir': False, u'ctime': 1571850312.2437878, u'wgrp': False, u'xgrp': False, u'dev': 2051, u'isblk': False, u'isfifo': False, u'mode': u'0644', u'islnk': False}) => {"changed": false, "item": {"atime": 1571850391.3553286, "ctime": 1571850312.2437878, "dev": 2051, "gid": 0, "gr_name": "root", "inode": 31195175, "isblk": false, "ischr": false, "isdir": false, "isfifo": false, "isgid": false, "islnk": false, "isreg": true, "issock": false, "isuid": false, "mode": "0644", "mtime": 1571850269.5720358, "nlink": 1, "path": "/home/local_repository/wireshark_3.0.5-1_amd64.deb", "pw_name": "root", "rgrp": true, "roth": true, "rusr": true, "size": 46700, "uid": 0, "wgrp": false, "woth": false, "wusr": true, "xgrp": false, "xoth": false, "xusr": false}, "msg": "Dependency is not satisfiable: wireshark-qt (= 3.0.5-1)\n"}
failed: [localhost] (item={u'uid': 0, u'woth': False, u'mtime': 1571850269.4560366, u'inode': 31195174, u'isgid': False, u'size': 3605060, u'roth': True, u'isuid': False, u'isreg': True, u'pw_name': u'root', u'gid': 0, u'ischr': False, u'wusr': True, u'xoth': False, u'rusr': True, u'nlink': 1, u'issock': False, u'rgrp': True, u'gr_name': u'root', u'path': u'/home/local_repository/wireshark-qt_3.0.5-1_amd64.deb', u'xusr': False, u'atime': 1571850394.3993108, u'isdir': False, u'ctime': 1571850312.2437878, u'wgrp': False, u'xgrp': False, u'dev': 2051, u'isblk': False, u'isfifo': False, u'mode': u'0644', u'islnk': False}) => {"changed": false, "item": {"atime": 1571850394.3993108, "ctime": 1571850312.2437878, "dev": 2051, "gid": 0, "gr_name": "root", "inode": 31195174, "isblk": false, "ischr": false, "isdir": false, "isfifo": false, "isgid": false, "islnk": false, "isreg": true, "issock": false, "isuid": false, "mode": "0644", "mtime": 1571850269.4560366, "nlink": 1, "path": "/home/local_repository/wireshark-qt_3.0.5-1_amd64.deb", "pw_name": "root", "rgrp": true, "roth": true, "rusr": true, "size": 3605060, "uid": 0, "wgrp": false, "woth": false, "wusr": true, "xgrp": false, "xoth": false, "xusr": false}, "msg": "Dependency is not satisfiable: libc6 (>= 2.29)\n"}
ok: [localhost] => (item={u'uid': 0, u'woth': False, u'mtime': 1571850217.1323407, u'inode': 31195169, u'isgid': False, u'size': 40654, u'roth': True, u'isuid': False, u'isreg': True, u'pw_name': u'root', u'gid': 0, u'ischr': False, u'wusr': True, u'xoth': False, u'rusr': True, u'nlink': 1, u'issock': False, u'rgrp': True, u'gr_name': u'root', u'path': u'/home/local_repository/tree_1.7.0-5_amd64.deb', u'xusr': False, u'atime': 1571850397.4392931, u'isdir': False, u'ctime': 1571850312.2437878, u'wgrp': False, u'xgrp': False, u'dev': 2051, u'isblk': False, u'isfifo': False, u'mode': u'0644', u'islnk': False})
ok: [localhost] => (item={u'uid': 0, u'woth': False, u'mtime': 1571850217.0163412, u'inode': 31195168, u'isgid': False, u'size': 52132, u'roth': True, u'isuid': False, u'isreg': True, u'pw_name': u'root', u'gid': 0, u'ischr': False, u'wusr': True, u'xoth': False, u'rusr': True, u'nlink': 1, u'issock': False, u'rgrp': True, u'gr_name': u'root', u'path': u'/home/local_repository/dstat_0.7.3-1_all.deb', u'xusr': False, u'atime': 1571850399.3192823, u'isdir': False, u'ctime': 1571850312.2437878, u'wgrp': False, u'xgrp': False, u'dev': 2051, u'isblk': False, u'isfifo': False, u'mode': u'0644', u'islnk': False})
        to retry, use: --limit @/home/upgrade/ansible/install_dependencies.retry

PLAY RECAP ****************************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=1

标签: ansible

解决方案


首先在远程服务器中设置本地存储库并在远程服务器中下载安装包apt-get install --download-only package_name。修改本地系统 /etc/apt/sources.list 以指向本地存储库包。

当 ansible 脚本尝试使用 apt-get -y install 安装时,它将连接到本地存储库并获取包并解析依赖项。

请查看以下链接以获取更多信息

https://kerneltalks.com/package/how-to-configure-local-apt-repository/ https://askubuntu.com/questions/170348/how-to-create-a-local-apt-repository


推荐阅读