Ansible 将输出格式化为列表
我正在写一本ansible剧本。我正在检查新的软件包补丁版本,这些版本是列表的一部分 我的代码看起来像这台自动取款机,用于创建列表的信用卡转到@ZeitounatorAnsible 将输出格式化为列表,ansible,Ansible,我正在写一本ansible剧本。我正在检查新的软件包补丁版本,这些版本是列表的一部分 我的代码看起来像这台自动取款机,用于创建列表的信用卡转到@Zeitounator -name:获取所有受支持版本包的列表 外壳:| 设置-o管道故障 repoquery--cache--showduplicates--qf“%{VERSION}”--启用repo xyz abc\ |grep-E--“13。”\ |排序--唯一--版本排序 更改时间:false 注册:版本 -名称:获取主要版本 设定事实: 主要
-name:获取所有受支持版本包的列表
外壳:|
设置-o管道故障
repoquery--cache--showduplicates--qf“%{VERSION}”--启用repo xyz abc\
|grep-E--“13。”\
|排序--唯一--版本排序
更改时间:false
注册:版本
-名称:获取主要版本
设定事实:
主要版本:>-
{{
versions.stdout\u行
|映射('regex\u replace','^(\d*\.\d*)\.\d*$,'\g')
|独特的
|分类
}}
-名称:创建每个主要版本的合并列表
设定事实:
合并版本:>-
{{
合并版本|默认值([])
+
[{'major_version':项,'patch_versions':versions.stdout_line |选择('contains',item)|列表}]
}}
循环:“{major_versions}}”
我的第一个任务是只通过相应的主要版本检查补丁级别。
例如:
仅在文件夹13.0中检查版本13.0.[1-10],仅在文件夹13.1中检查版本13.1.[1-5]等。
这正如预期的那样有效
我现在想做的是只下载主要版本的最新软件包版本,所以我只需要一个带有补丁版本号的列表,如下所示:
ok: [localhost] => {
"patch_version": [
"13.0.10",
"13.1.5",
"13.2.2"
]
}
- 13.0.10
- 13.1.5
- 13.2.2
- 13.0.10
- 13.1.5
- 13.2.2
set\u-fact
像这样:
-name:获取受支持版本的最新补丁版本
设定事实:
修补程序版本:“{{consolidated_versions}json_查询('[*].patch_versions[-1]')}”
-名称:输出最新版本
调试:
var:patch\u版本
这给了我如下输出:
ok: [localhost] => {
"patch_version": [
"13.0.10",
"13.1.5",
"13.2.2"
]
}
- 13.0.10
- 13.1.5
- 13.2.2
这确实是我需要的数据。
我需要在一个循环中使用这3个元素来下载这样的包:
ok: [localhost] => {
"patch_version": [
"13.0.10",
"13.1.5",
"13.2.2"
]
}
- 13.0.10
- 13.1.5
- 13.2.2
-name:下载文件
获取url:
网址:https://packages.xyz.com/abc/def/packages/el/{{ansible_distribution_major_version}/abc def-{{{item}-ee.0.el{{ansible_distribution_major_version}.x86_64.rpm/download.rpm
dest:/var/www/html/abc/{date}}/abc def-{{item}}-ee.0.el{{ansible\u distribution\u major\u version}}.x86\u 64.rpm
循环:“{patch_version}}”
现在的问题是ansible没有将事实作为列表处理,所以它将
{{patch_version}}
替换为:['13.0.10','13.1.5','13.2.2']
当然,这行不通
如何将此输出转换为可循环列表?
我已经试着把它列成一个列表,但后来我把整个输出作为一个字符串作为一个元素。如何将其拆分为如下列表:
ok: [localhost] => {
"patch_version": [
"13.0.10",
"13.1.5",
"13.2.2"
]
}
- 13.0.10
- 13.1.5
- 13.2.2
?
提前谢谢,我很困惑。我无法重现您的问题,因为事实在我的ansible版本(ansible 2.9.6,python 3.7.3)中是按列表处理的 尽管如此,如果事实是字符串,请尝试从_json筛选器传递它:
loop: "{{ patch_version | from_json }}"
FWIW,您可以检查变量类型,将其导入类型_调试:
- debug:
msg: "{{ patch_version | type_debug }}"
我无法重现您的问题,因为事实在我的ansible版本(ansible 2.9.6,python 3.7.3)中被作为列表处理 尽管如此,如果事实是字符串,请尝试从_json筛选器传递它:
loop: "{{ patch_version | from_json }}"
FWIW,您可以检查变量类型,将其导入类型_调试:
- debug:
msg: "{{ patch_version | type_debug }}"
我自己修复了它,不确定是什么错误,可能只是我的一团糟;)。 出于测试目的,我尝试了一些使用
和循环的方法。
所以我的代码有一段时间是这样的:
-name:下载文件
获取url:
网址:https://packages.xyz.com/abc/def/packages/el/{{ansible_distribution_major_version}/abc def-{{{item}-ee.0.el{{ansible_distribution_major_version}.x86_64.rpm/download.rpm
dest:/var/www/html/abc/{date}}/abc def-{{item}}-ee.0.el{{ansible\u distribution\u major\u version}}.x86\u 64.rpm
循环:
-“{{patch_version}}”
#-注释掉循环
#-另一个注释掉的循环
在本例中,列表似乎被读取为字符串。
所以ansible将变量替换为字符串形式的所有值
在我将代码更改为:
-name:下载文件
获取url:
网址:https://packages.xyz.com/abc/def/packages/el/{{ansible_distribution_major_version}/abc def-{{{item}-ee.0.el{{ansible_distribution_major_version}.x86_64.rpm/download.rpm
dest:/var/www/html/abc/{date}}/abc def-{{item}}-ee.0.el{{ansible\u distribution\u major\u version}}.x86\u 64.rpm
循环:“{patch_version}}”
它像预期的那样工作。谢谢你的提示,也许在花了一整天的时间写剧本之后,我的大脑有点糊涂了;) 我自己修复了,不确定是什么错误,可能只是我的一团糟;)。
出于测试目的,我尝试了一些使用和循环的方法。
所以我的代码有一段时间是这样的:
-name:下载文件
获取url:
网址:https://packages.xyz.com/abc/def/packages/el/{{ansible_distribution_major_version}/abc def-{{{item}-ee.0.el{{ansible_distribution_major_version}.x86_64.rpm/download.rpm
dest:/var/www/html/abc/{date}}/abc def-{{item}}-ee.0.el{{ansible\u distribution\u major\u version}}.x86\u 64.rpm
循环:
-“{{patch_version}}”
#-注释掉循环
#-另一个注释掉的循环
在本例中,列表似乎被读取为字符串。
所以ansible将变量替换为字符串形式的所有值
在我将代码更改为:
-name:下载文件
获取url:
网址:https://packages.xyz.com/abc/def/packages/el/{{ansible_distribution_major_version}/abc def-{{{item}-ee.0.el{{ansible_distribution_major_version}.x86_64.rpm/download.rpm
dest:/var/www/html/abc/{date}}/abc def-{{item}}-ee.0.el{{ansible\u distribution\u major_