ansible笔记(14):循环(一)
在使用ansible的过程中,我们经常需要处理一些返回信息,而这些返回信息中,通常可能不是单独的一条返回信息,而是一个信息列表,如果我们想要循环的处理信息列表中的每一条信息,我们该怎么办呢?这样空口白话的描述有些费力,不如通过一些小示例,结合场景来描述。
以下是我的配置清单:
192.168.10.2
192.168.10.3 [group1]
192.168.10.10 [group2]
192.168.10.20 [group:children]
group1
group2
我想获取配置清单中,没有分组的主机名,如下所示:
[root@ansible-control ansible]# ansible 192.168.10.2 -m debug -a "msg={{groups.ungrouped}}"
192.168.10.2 | SUCCESS => {
"msg": [
"192.168.10.2",
"192.168.10.3"
]
}
现在我想获得未分组的主机名中第2台主机的主机名信息,如下所示:
注意[ ]里面的标签号计数是从0开始,第一台主机就是[0],第二台就是[1],依此类推
[root@ansible-control ansible]# ansible 192.168.10.2 -m debug -a "msg={{groups.ungrouped[1]}}"
192.168.10.2 | SUCCESS => {
"msg": "192.168.10.2"
}
但是问题是,我们通常不能确定返回信息有几条,我们可能需要循环的处理返回信息中的每一条信息,那么怎么才能循环处理返回信息中的每一条信息呢?示例playbook如下:
---
- hosts: 192.168.10.2
remote_user: root
gather_facts: no
tasks:
- debug:
msg: "{{item}}"
with_items: "{{groups.ungrouped}}"
上例中,我们通过“{{groups.ungrouped}}”获取到了未分组的返回信息,并使用关键字with_items接收了返回信息,然后使用debug模块输出了名为item变量的变量值,聪明如你一定已经明白了, with_items 关键字会把返回的列表信息自动处理,将每一条信息单独放在一个名为 item 的变量中,我们只要获取到名为 item 变量的变量值,即可循环的获取到列表中的每一条信息,所以,上例中返回信息中的每一条信息都会循环的被debug模块处理,执行上述playbook后结果如下 :

从执行playbook的结果可以看出,debug模块对每条信息都单独输出了一次,而不是三条信息同时一次输出,由于对应play是针对192.168.10.2主机操作的,所以上例中debug模块的三次操作都是在该主机上进行的,只不过debug模块只是输出信息,并不会对该主机做出什么实际的改动而已,通过上述方法,就能够符合我们循环操作的要求了。
上例中,我们使用的是返回值中的信息,那么我们能不能自定义一个列表,然后循环使用列表中的值呢?必须能的,示例如下:
---
- hosts: 192.168.10.2
remote_user: root
gather_facts: no
tasks:
- debug:
msg: "{{item}}"
with_items:
- 1
- 2
- 3
如上例所示,我们自定义了3个值,分别是1、2、3,debug模块会循环的输出这三个值。
换一种写法,和上面的效果等效:
---
- hosts: 192.168.10.2
remote_user: root
gather_facts: no
tasks:
- debug:
msg: "{{item}}"
with_items: [1,2,3]
定义一些稍微复杂的列表:
---
- hosts: 192.168.10.2
remote_user: root
gather_facts: no
tasks:
- debug:
msg: "{{item.test1}}"
with_items:
- { test1: a, test2: b }
- { test1: c, test2: d }
上例中自定义列表中的每一个条目都是一个对象,我们可以通过对象的属性对应的 键 ,获取到对应的 值 ,如上例所示,第一个条目的test1键对应的值是a,第二个条目的test1键对应的值是c,所以执行上例playbook以后, a 和 c 会被输出。

工作生产中使用循环的实际案例:
如果想要在同一主机中创建四个文件,那么你可能会编写如下playbook:
---
- hosts: 192.168.10.2
remote_user: root
gather_facts: no
vars:
dirs:
- "/test/a"
- "/test/b"
- "/test/c"
- "/test/d"
tasks:
- file:
path: "{{item}}"
state: touch
with_items: "{{dirs}}"
ansible笔记(14):循环(一)的更多相关文章
- 并发编程学习笔记(14)----ThreadPoolExecutor(线程池)的使用及原理
1. 概述 1.1 什么是线程池 与jdbc连接池类似,在创建线程池或销毁线程时,会消耗大量的系统资源,因此在java中提出了线程池的概念,预先创建好固定数量的线程,当有任务需要线程去执行时,不用再去 ...
- Ext.Net学习笔记14:Ext.Net GridPanel Grouping用法
Ext.Net学习笔记14:Ext.Net GridPanel Grouping用法 Ext.Net GridPanel可以进行Group操作,例如: 如何启用Grouping功能呢?只需要在Grid ...
- SQL反模式学习笔记14 关于Null值的使用
目标:辨别并使用Null值 反模式:将Null值作为普通的值,反之亦然 1.在表达式中使用Null: Null值与空字符串是不一样的,Null值参与任何的加.减.乘.除等其他运算,结果都是Null: ...
- ansible笔记(12):handlers的用法
ansible笔记():handlers的用法 这篇文章会介绍playbook中handlers的用法. 在开始介绍之前,我们先来描述一个工作场景: 当我们修改了某些程序的配置文件以后,有可能需要重启 ...
- ansible笔记(11):初识ansible playbook(二)
ansible笔记():初识ansible playbook(二) 有前文作为基础,如下示例是非常容易理解的: --- - hosts: test211 remote_user: root tasks ...
- ansible笔记(10):初识ansible playbook
ansible笔记():初识ansible playbook 假设,我们想要在test70主机上安装nginx并启动,我们可以在ansible主机中执行如下3条命令 ansible test70 -m ...
- ansible笔记(7):常用模块之系统类模块
ansible笔记():常用模块之系统类模块 cron模块 cron模块可以帮助我们管理远程主机中的计划任务,功能相当于crontab命令. 在了解cron模块的参数之前,先写出一些计划任务的示例,示 ...
- ansible笔记(8):常用模块之系统类模块(二)
ansible笔记():常用模块之系统类模块(二) user模块 user模块可以帮助我们管理远程主机上的用户,比如创建用户.修改用户.删除用户.为用户创建密钥对等操作. 此处我们介绍一些user模块 ...
- ansible笔记(9):常用模块之包管理模块
ansible笔记():常用模块之包管理模块 yum_repository模块 yum_repository模块可以帮助我们管理远程主机上的yum仓库. 此处我们介绍一些yum_repository模 ...
- ansible笔记(6):常用模块之命令类模块
ansible笔记():常用模块之命令类模块 command模块 command模块可以帮助我们在远程主机上执行命令 注意:使用command模块在远程主机中执行命令时,不会经过远程主机的shell处 ...
随机推荐
- PostgreSQL将日期转为当前年、月、日的函数date_trunc
PostgreSQL将日期转为年.月.日的函数date_trunc: 当前年: select date_trunc('year',now()) 当前月: select date_trunc('mo ...
- asp.net abp模块化开发之通用树2:设计思路及源码解析
一.前言 上一篇大概说了下abp通用树形模块如何使用,本篇主要分析下设计思路. 日常开发中会用到很多树状结构的数据,比如:产品的多级分类.省市区县,大多数系统也会用到类似“通用字典/数据字典”的功能, ...
- Bellman-ford算法 无向图
// 单源最短路问题 // Bellman-Ford算法 // 复杂度O(V*E) //! 可以判断负圈 #include <cstdio> #include <iostream&g ...
- Hibernate(六)--缓存策略
缓存: 缓存就是数据库数据在内存中的临时容器,包括数据库数据在内存中的临时拷贝,它位于数据库与数据库访问中间层,ORM在查询数据时,首先会根据自身的缓存管理策略,在缓存中查找相关数据,如果发现所需的数 ...
- Github上优秀的.NET Core项目
Github上优秀的.NET Core开源项目的集合.内容包括:库.工具.框架.模板引擎.身份认证.数据库.ORM框架.图片处理.文本处理.机器学习.日志.代码分析.教程等. Github地址:htt ...
- C#_Excel数据读取与写入_自定义解析封装类_支持设置标题行位置&使用excel表达式收集数据&单元格映射&标题映射&模板文件的参数数据替换
本篇博客园是被任务所逼,而已有的使用nopi技术的文档技术经验又不支持我需要的应对各种复杂需求的苛刻要求,只能自己造轮子封装了,由于需要应对很多总类型的数据采集需求,因此有了本篇博客的代码封装,下面一 ...
- 基于S2SH开发学生考勤管理系统 附源码
开发环境: Windows操作系统开发工具:Eclipse+Jdk+Tomcat+mysql数据库 运行效果图 源码及原文链接:http://javadao.xyz/forum.php?mod=vie ...
- Android中获取目标布局文件中的组件
方法如下: LayoutInflater flater= LayoutInflater.from(getContext()); //R.layout.title处填写目标布局 final View v ...
- window10家庭版解决IIS中万维网服务的安全性中无Windows身份验证
首先在左下角输入cmd搜索->命令提示符->以管理员身份运行->然后复制下面一段命令: dism /online /norestart /add-package:%SystemRoo ...
- MySQL 8 升级数据库
开始升级前 因为从MySQL 8.0 到MySQL 5.7,或者从MySQL 8.0 到之前的 MySQL 8.0版本都是不支持的.所有在在升级前要做好数据库备份,包括mysql 系统schema(数 ...