我正在尝试安装一堆来自存储在中央服务器上的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模块似乎是单独安装它们,即使文档声称它们一起完成它们(请参阅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,所以这是最近的合理。
为了说服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
我知道一种解决方法和解决方案。
解决方法是在yum install
或command
模块调用中运行shell
。
解决方案是将RPM文件加载到存储库并将其配置为包源,这通常使依赖项解析更容易。
有多种方法可以做到这一点。您可以先直接获取rpm包,然后像@ChrisSteele提到的那样安装它们,或者您可以在/etc/yum.repos.d/
中注册外部repo URL。
对于第二个选项,您基本上可以在您的剧本中创建2个任务。
1)在远程服务器的目录结构/etc/yum.repos.d/
中添加.repo文件。这看起来如下所示:
- 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
2)使用yum模块安装的所有软件包的循环。
- name: Install multiple rpm packages with its dependencies
yum:
name: "{{ item }}"
state: present
loop:
- rpm_package_dependency_1 (need not mention .rpm extension here)
- rpm_package_dependency_2
- rpm_package_1
- rpm_package_2