Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ansible 将输出格式化为列表_Ansible - Fatal编程技术网

Ansible 将输出格式化为列表

Ansible 将输出格式化为列表,ansible,Ansible,我正在写一本ansible剧本。我正在检查新的软件包补丁版本,这些版本是列表的一部分 我的代码看起来像这台自动取款机,用于创建列表的信用卡转到@Zeitounator -name:获取所有受支持版本包的列表 外壳:| 设置-o管道故障 repoquery--cache--showduplicates--qf“%{VERSION}”--启用repo xyz abc\ |grep-E--“13。”\ |排序--唯一--版本排序 更改时间:false 注册:版本 -名称:获取主要版本 设定事实: 主要

我正在写一本ansible剧本。我正在检查新的软件包补丁版本,这些版本是列表的一部分

我的代码看起来像这台自动取款机,用于创建列表的信用卡转到@Zeitounator

-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_