使用Ansible按第二个列表的特定顺序映射Debian软件包列表

使用Ansible按第二个列表的特定顺序映射Debian软件包列表,ansible,Ansible,我正在尝试将文件列表映射到文件名列表。目标是按特定顺序安装Debian文件(基于名称列表)。我可以使用shell命令检索文件列表,并将它们注册到列表中。目标是按照预定义名称列表的顺序生成文件名列表。然后按顺序安装它们 ms2Num.stdout_line是shell命令中的文件列表: # use List -1 to find the file names for the deb files.| grep - name: Find the needed deb files shell: &q

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

ms2Num.stdout_line是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\u行
。 以下是文件列表:

    "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", 
    ]
后面的一些文件使用前面的文件作为依赖项,因此我需要按特定顺序安装它们

工作任务:(已解决) 我现在可以循环浏览此列表并安装所需的软件包。

下面的任务

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

下面的任务

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


您在“订单列表”(
MS2Packages
)循环中对包名列表(
ProviderDebList
)应用
regex\u search
过滤器的想法实际上是很好的。您错过的是,您必须应用
regex_search
过滤器(它将对列表中的每个项目应用过滤器)

因此,以下是可行的解决方案:

- name: List sorting
  hosts: localhost
  gather_facts: no
  vars:
    MS2Packages:
      - ms2-desert
      - ms2-ctps
      - ms2-apache
      - ms2-w3gui
      - ms2-provider
    ProviderDebList:
      - 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

  tasks:
    - name: Print package in the right order
      debug:
        msg: " - {{ ProviderDebList | map('regex_search', '.*'+order+'.*') | select('string') | list }}"
      loop: "{{ MS2Packages }}"
      loop_control:
        loop_var: order

您在“订单列表”(
MS2Packages
)循环中对包名列表(
ProviderDebList
)应用
regex\u search
过滤器的想法实际上是很好的。您错过的是,您必须应用
regex_search
过滤器(它将对列表中的每个项目应用过滤器)

因此,以下是可行的解决方案:

- name: List sorting
  hosts: localhost
  gather_facts: no
  vars:
    MS2Packages:
      - ms2-desert
      - ms2-ctps
      - ms2-apache
      - ms2-w3gui
      - ms2-provider
    ProviderDebList:
      - 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

  tasks:
    - name: Print package in the right order
      debug:
        msg: " - {{ ProviderDebList | map('regex_search', '.*'+order+'.*') | select('string') | list }}"
      loop: "{{ MS2Packages }}"
      loop_control:
        loop_var: order

几乎奏效了。我需要将
.stdout\u行
添加到Deb列表中<代码>消息:“-{ProviderDebList.stdout_line | map('regex_search','.''+order+'.')| select('string')| list}}”有效。我按照我需要的顺序得到了文件列表。事实上,我在我的测试剧本中模拟了你输入的文件和包列表。几乎有效。我需要将
.stdout\u行
添加到Deb列表中<代码>消息:“-{ProviderDebList.stdout_line | map('regex_search','.''+order+'.')| select('string')| list}}”有效。我按照需要的顺序得到了文件列表。事实上,我在测试手册中模拟了您输入的文件和包列表。