如何使用Ansible安装多个具有依赖关系的RPM?

时间:2017-10-27 12:13:18

标签: ansible yum

我正在尝试安装一堆来自存储在中央服务器上的tarball的RPM。这些RPM彼此依赖,但当我手动安装时,这不是问题,我只是使用:

# yum install *rpm

并且它们都已安装,yum认为依赖项包含在其他RPM中。

使用Ansible我使用以下游戏传输tarball:

- name: Unpack installation bundle
  unarchive:
    src: /media/shared/archive/{{ sw }}-{{ os }}.tar.gz
    dest: $HOME

将tarball复制到远程服务器并解压缩。这很有效。

问题是当我尝试安装RPM时。我目前有以下剧目:

- name: Finding RPM files
  find:
    paths: "$HOME/{{ sw }}"
    patterns: "*.rpm"
  register: rpm_result

- name: Install RPM
  yum:
    name: "{{ item.path }}"
    state: present
  with_items: "{{ rpm_result.files }}"
  become: yes
  become_method: sudo

rpm_result.files正确填充了所有RPM,但其中一些没有安装,因为yum模块似乎是单独安装它们,即使文档声称它一起完成它们(请参阅" Notes&# 34;在http://docs.ansible.com/ansible/latest/yum_module.html) 当我运行剧本时,我得到关于缺少依赖关系的投诉:

"Error: Package: snmpagent-1.2.0.0-1.el6.x86_64 (/snmpagent-1.2.0.0-1.el6.x86_64)
       Requires: utils >= 3.1.0.0\n", "rc": 1,

(Output shortened and sliced up to make it easier to read)

如果我尝试一次安装一个RPM,这就是我得到的错误。

如何说服yum同时安装所有 RPM?

我正在运行ansible-playbook v2.4.0.0,所以它最近才合理。

3 个答案:

答案 0 :(得分:2)

为了说服yum同时安装所有rpms,为了处理基于特定目录中的文件列表解析的依赖关系,需要将整个rpms列表传递给yum命令。以下代码对我有用。

# Get a list of rpms from a directory
- name: find rpm files and register the result 
  find:
    paths: /opt/rpms
    patterns: "*.rpm"
  register: rpm_files

# Create a list of the rpms to use with the yum install command
- set_fact:
    rpm_list: "{{ rpm_files.files | map(attribute='path') | list}}"

# Use yum to install with a list
- name: install rpm files using rpm_list
  yum:
    name: "{{rpm_list}}"
    state: present

答案 1 :(得分:0)

我知道一种解决方法和解决方案。

解决方法是在yum installcommand模块调用中运行shell

解决方案是将RPM文件加载到存储库并将其配置为包源,这通常会使依赖项解析更容易。

答案 2 :(得分:0)

有多种方法可以做到这一点。您可以先直接获取rpm软件包的源,然后像@ChrisSteele提到的那样安装它们,也可以在class UserCredentials { private let userDefaults: NSUserDefaults private let authorizationTokenKey = "AuthorizationTokenKey" init(userDefaults: NSUserDefaults) { self.userDefaults = userDefaults } func getAuthorizationToken() -> String { let value = userDefaults.stringForKey(authorizationTokenKey) guard let retVal = value else { return "" } return retVal } } 中注册外部仓库URL。

对于第二个选项,您基本上可以在剧本中创建2个任务。

1)用于在远程服务器的目录结构/etc/yum.repos.d/中添加.repo文件。如下所示:

/etc/yum.repos.d/

2)循环显示您要使用yum模块安装的所有软件包。

- name: Add .repo file where the rpm packages are present
  yum_repository:
    name: packages.repo   #can give any name with .repo extension
    description: adding repo URL in packages.repo file in yum.repo.d
    baseurl: "https://###.nexus.com/content/repositories/anything###/Packages/"
    enabled: yes
    gpgcheck: no