Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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
Loops 通过嵌套循环进行循环,但限制性更强_Loops_Ansible - Fatal编程技术网

Loops 通过嵌套循环进行循环,但限制性更强

Loops 通过嵌套循环进行循环,但限制性更强,loops,ansible,Loops,Ansible,我正在写一本Ansible playbook,它检查并下载特定版本和补丁级别的RPM包。 我想让playbook在没有新文件时停止,所以我想我应该用stat试试 为了更好地理解,以下是我得到的: list1(软件包的主要版本) 13.0 13.1 13.2 list2(受支持的主要版本的补丁版本) 13.0.0 13.0.1 13.0.2 13.1.0 13.1.1 13.1.2 13.2.0 13.2.1 13.2.2 我的任务如下所示: -名称:检查文件是否已存在 斯达

我正在写一本Ansible playbook,它检查并下载特定版本和补丁级别的RPM包。
我想让playbook在没有新文件时停止,所以我想我应该用
stat
试试

为了更好地理解,以下是我得到的:

  • list1
    (软件包的主要版本)

    • 13.0
    • 13.1
    • 13.2
  • list2
    (受支持的主要版本的补丁版本)

    • 13.0.0
    • 13.0.1
    • 13.0.2
    • 13.1.0
    • 13.1.1
    • 13.1.2
    • 13.2.0
    • 13.2.1
    • 13.2.2
我的任务如下所示:

-名称:检查文件是否已存在
斯达:
路径:/var/www/html/softwarexyz/{{item[0]}}/{{date}}/softwarexyz-{{item[1]}-xyz.0.x86_64.rpm
使用嵌套的\u:
-“{list1.stdout_行[:]}”
-“{list2.stdout_行[:]}”
寄存器:统计结果
Ansible执行以下操作:

检查
13.0版
文件夹中
list2
中的所有项目是否都在那里,对于
13.1
13.2
也是如此。当然,ansible在文件夹
13.0
中查找以
13.1
13.2
开头的版本毫无意义


我该如何提高效率?因为检查需要花费大量时间,具体取决于列表大小。

实际上,您可以从修补程序版本的单个列表中执行此操作。如果出于任何原因确实需要保留两个列表,您可以修改以下内容以保留它们

在下面的解决方案中,我只需从补丁版本列表中提取主要版本,为每个主要版本创建一个补丁版本的合并列表,并使用
子元素
查找对其进行循环

---
-名称:主要/补丁版本演示
主机:本地主机
收集事实:错误
变量:
可用版本:
- 13.0.0
- 13.0.1
- 13.0.2
- 13.1.0
- 13.1.1
- 13.1.2
- 13.2.0
- 13.2.1
- 13.2.2
任务:
-名称:获取主要版本的列表
设定事实:
主要版本:>-
{{
可用版本
|映射('regex\u replace','^(\d*\.\d*)\.\d*$,'\g')
|独特的
|分类
}}
-名称:显示主要版本
调试:
var:major_版本
-名称:创建每个主要版本的合并列表
设定事实:
合并版本:>-
{{
合并版本|默认值([])
+
[{'major_version':项,'patch_versions':可用_versions |选择('contains',item)|列表}]
}}
循环:“{major_versions}}”
-名称:显示我们的综合列表
调试:
var:合并版本
-名称:循环每个主要版本的数据结构
调试:
主要版本是{{item.0.Major_version}。正在检查修补程序版本{item.1}
循环:“{lookup('subelements',consolidated_versions',patch_versions')}”
其中:

$ ansible-playbook test.yml 

PLAY [Major / Patch version demo] ******************************************************************************************************************************************************************************************************

TASK [Get a list of major versions] ****************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [Show major versions] *************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "major_versions": [
        "13.0",
        "13.1",
        "13.2"
    ]
}

TASK [Create a consolidated list per major version] *******************************************************************************************************************************************************************************************************
ok: [localhost] => (item=13.0)
ok: [localhost] => (item=13.1)
ok: [localhost] => (item=13.2)

TASK [Show our consolidated list] ******************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "consolidated_versions": [
        {
            "major_version": "13.0",
            "patch_versions": [
                "13.0.0",
                "13.0.1",
                "13.0.2"
            ]
        },
        {
            "major_version": "13.1",
            "patch_versions": [
                "13.1.0",
                "13.1.1",
                "13.1.2"
            ]
        },
        {
            "major_version": "13.2",
            "patch_versions": [
                "13.2.0",
                "13.2.1",
                "13.2.2"
            ]
        }
    ]
}

TASK [Loop over our data structure for each major version] *****************************************************************************************************************************************************************************
ok: [localhost] => (item=[{'major_version': '13.0'}, '13.0.0']) => {
    "msg": "Major version is 13.0. Checking patch version 13.0.0"
}
ok: [localhost] => (item=[{'major_version': '13.0'}, '13.0.1']) => {
    "msg": "Major version is 13.0. Checking patch version 13.0.1"
}
ok: [localhost] => (item=[{'major_version': '13.0'}, '13.0.2']) => {
    "msg": "Major version is 13.0. Checking patch version 13.0.2"
}
ok: [localhost] => (item=[{'major_version': '13.1'}, '13.1.0']) => {
    "msg": "Major version is 13.1. Checking patch version 13.1.0"
}
ok: [localhost] => (item=[{'major_version': '13.1'}, '13.1.1']) => {
    "msg": "Major version is 13.1. Checking patch version 13.1.1"
}
ok: [localhost] => (item=[{'major_version': '13.1'}, '13.1.2']) => {
    "msg": "Major version is 13.1. Checking patch version 13.1.2"
}
ok: [localhost] => (item=[{'major_version': '13.2'}, '13.2.0']) => {
    "msg": "Major version is 13.2. Checking patch version 13.2.0"
}
ok: [localhost] => (item=[{'major_version': '13.2'}, '13.2.1']) => {
    "msg": "Major version is 13.2. Checking patch version 13.2.1"
}
ok: [localhost] => (item=[{'major_version': '13.2'}, '13.2.2']) => {
    "msg": "Major version is 13.2. Checking patch version 13.2.2"
}

PLAY RECAP *****************************************************************************************************************************************************************************************************************************
localhost                  : ok=5    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 
问:检查13.0版本的文件夹和清单2的所有项目,13.1和13.2版本相同

A1:将补丁版本放入列表2中并使用。比如说

shell>cat playbook.yml
-主机:本地主机
变量:
清单1:
- 13.0
- 13.1
- 13.2
清单2:[0,1,2]
任务:
-调试:
msg://{item.0}}/software-{{item.0~'.~item.1}}.rpm
使用嵌套的\u:
-“{{list1}}”
-“{{list2}”
给予


A2:如果不同版本的补丁版本可能不同,请将列表2放入属性并使用。例如,下面的剧本给出了相同的结果

-hosts:localhost
变量:
清单1:
-版本:13.0
清单2:[0,1,2]
-版本:13.1
清单2:[0,1,2]
-版本:13.2
清单2:[0,1,2]
任务:
-调试:
msg://{item.0.ver}}/software-{{item.0.ver}.'.~item.1}}.rpm
带_子元素:
-“{{list1}}”
-清单2

注意:请参见,并可以选择将_嵌套到

循环:{{list1 |产品(list2)|列表}”
并将_子元素添加到

循环:{{list1 |子元素('list2')|列表}”

非常感谢您!这确实是我要找的,太好了!伟大的我还有一个问题,如何才能获得主要版本的最后一个补丁版本?我经常使用列表,但当我尝试使用“last”时,我只得到13.2版的所有补丁版本。我以为通过{{major_versions}循环就可以了,但是没有..想法?
shell> ansible-playbook playbook.yml | grep msg\:
  msg: /13.0/software-13.0.0.rpm
  msg: /13.0/software-13.0.1.rpm
  msg: /13.0/software-13.0.2.rpm
  msg: /13.1/software-13.1.0.rpm
  msg: /13.1/software-13.1.1.rpm
  msg: /13.1/software-13.1.2.rpm
  msg: /13.2/software-13.2.0.rpm
  msg: /13.2/software-13.2.1.rpm
  msg: /13.2/software-13.2.2.rpm