首页 > 解决方案 > 使用 Ansible 按第二个列表的特定顺序映射 Debian 软件包列表

问题描述

我正在尝试将文件列表映射到文件名列表。目标是以特定顺序安装 Debian 文件(基于名称列表)。我可以使用 shell 命令检索文件列表并将它们注册到列表中。目标是按照我的预定义名称列表的顺序生成文件名列表。然后按该顺序安装它们。

ms2Num.stdout_lines 是来自 shell 命令的文件列表:

# use List -1 to find the file names for the deb files.| grep
- name: Find the needed deb files
  shell: "ls -1 {{ DestDir | join }}/ms2install/ms2install/ | grep {{ ms2Num.stdout_lines[0] | join }}"
  register: ProviderDebList

此任务生成一个列表ProviderDebList.stdout_lines。这是文件列表:

    "stdout_lines": [
        "ms2-apache_1.6.1.8~20160324_amd64.deb", 
        "ms2-ctps_1.6.1.8~20160324_amd64.deb", 
        "ms2-desert_1.6.1.8~20160324_amd64.deb", 
        "ms2-provider_1.6.1.8~20160324_amd64.deb", 
        "ms2-w3gui_1.6.1.8+1~20160324_amd64.deb"
    ]

映射任务

- name: Display files in order from MS2-list
  debug:
    msg: "File name: {{ ms2Num.stdout_lines | regex_search( item | string ) | string }}"
  loop: "{{ MS2Packages }}"

运行我得到的映射任务:但我得到一个错误:

fatal: [10.0.2.25]: FAILED! => {
    "msg": "Unexpected templating type error occurred on (File name: {{ ms2Num.stdout_lines | regex_search( item | string ) | string }}): expected string or buffer"

我对 Ansible 过滤器的了解相当基础,因此这些错误仍然很难解析。我知道我错过了什么,但是什么?

目标:

目标是按照MS2Packages. 我想获取我的名单并映射文件名对其进行排序。

以下是安装顺序的基础列表:

MS2Packages:
  - ms2-desert
  - ms2-ctps
  - ms2-apache
  - ms2-w3gui
  - ms2-provider
    ]

结果列表应为:

    "stdout_lines": [
        "ms2-desert_1.6.1.8~20160324_amd64.deb", 
        "ms2-ctps_1.6.1.8~20160324_amd64.deb", 
        "ms2-apache_1.6.1.8~20160324_amd64.deb", 
        "ms2-w3gui_1.6.1.8+1~20160324_amd64.deb"
        "ms2-provider_1.6.1.8~20160324_amd64.deb", 
    ]

后面的一些文件使用较早的文件作为依赖项,因此我需要按特定顺序安装它们。

工作任务:(已解决)

# print the files names in order of the deb list
- name: Create the list files in order from MS2-list
  set_fact:
    OrderProviderList: "{{ OrderProviderList | default([]) + ProviderDebList.stdout_lines | map('regex_search', '.*' + order + '.*') | select('string') | list }}"
  loop: "{{ MS2Packages }}"
  loop_control:
    loop_var: order

我现在可以遍历这个列表并安装所需的包。

标签: ansible

解决方案


下面的任务

- set_fact:
    my_pkg: "{{ my_pkg|default([]) +
                ms2Num.stdout_lines|
                select('search', item)|
                list }}"
  loop: "{{ MS2Packages }}"
- debug:
    var: my_pkg

"my_pkg": [
    "ms2-desert_1.6.1.8~20160324_amd64.deb", 
    "ms2-ctps_1.6.1.8~20160324_amd64.deb", 
    "ms2-apache_1.6.1.8~20160324_amd64.deb", 
    "ms2-w3gui_1.6.1.8+1~20160324_amd64.deb", 
    "ms2-provider_1.6.1.8~20160324_amd64.deb"
]

推荐阅读