Loops 通过嵌套循环进行循环,但限制性更强
我正在写一本Ansible playbook,它检查并下载特定版本和补丁级别的RPM包。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 我的任务如下所示: -名称:检查文件是否已存在 斯达
我想让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