使用Ansible按第二个列表的特定顺序映射Debian软件包列表
我正在尝试将文件列表映射到文件名列表。目标是按特定顺序安装Debian文件(基于名称列表)。我可以使用shell命令检索文件列表,并将它们注册到列表中。目标是按照预定义名称列表的顺序生成文件名列表。然后按顺序安装它们 ms2Num.stdout_line是shell命令中的文件列表:使用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
# 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}}”有效。我按照需要的顺序得到了文件列表。事实上,我在测试手册中模拟了您输入的文件和包列表。