在一个task中循环某个操作

1、标准循环

  1. - name: add several users
  2. user:
  3. name: "{{ item }}"
  4. state: present
  5. groups: "wheel"
  6. loop:
  7. - testuser1
  8. - testuser2
  9. #如果已经在变量文件中,定义了yaml列表,可以这么写
  10. loop: "{{ somelist }}"
note:在2.5 Ansible之前主要使用with_ <lookup>关键字来创建循环,循环关键字基本上类似于with_list,with_items。
我现在也在用,啊哈!
一些ansible插件,类似yum和apt模块可以直接列出引用的选项,比使用loop更好,如下:
  1. - name: optimal yum
  2. yum:
  3. name: "{{list_of_packages}}"
  4. state: present
  5. - name: non optimal yum, not only slower but might cause issues with interdependencies
  6. yum:
  7. name: "{{item}}"
  8. state: present
  9. loop: "{{list_of_packages}}"
迭代的items类型也可以是hash列表,例如:
  1. - name: add several users
  2. user:
  3. name: "{{ item.name }}"
  4. state: present
  5. groups: "{{ item.groups }}"
  6. loop:
  7. - { name: 'testuser1', groups: 'wheel' }
  8. - { name: 'testuser2', groups: 'root' }

2、复杂的循环

有时候你不只是需要一个简单列表,你可以用jinja2表达式创建复杂的列表,例如使用 “netsed" lookup
  1. - name: give users access to multiple databases
  2. mysql_user:
  3. name: "{{ item[0] }}"
  4. priv: "{{ item[1] }}.*:ALL"
  5. append_privs: yes
  6. password: "foo"
  7. loop: "{{ query('nested', [ 'alice', 'bob' ], [ 'clientdb', 'employeedb', 'providerdb' ]) }}"
note: with_ 循环实际上是组合了 with_ + lookup(),甚至是with_items。 loop也可以这么搞,类似上边例子。

3、使用lookup 与 用loop查询

ansible2.5加入了新的函数 query,为lookup插件增加一些益处,当使用新的关键字loop时候。query提供一个更简单的借口和可预测性更好的输出,确保兼容loop。
一些情况中,lookup函数不会返回 loop需要的list,下列的调用是相等的:
  1. loop: "{{ query('nested', ['alice', 'bob'], ['clientdb', 'employeedb', 'providerdb']) }}"
  2. loop: "{{ lookup('nested', ['alice', 'bob'], ['clientdb', 'employeedb', 'providerdb'], wantlist=True) }}"

4、Do-Until循环

  1. - shell: /usr/bin/foo
  2. register: result
  3. until: result.stdout.find("all systems go") != -1
  4. retries: 5
  5. delay: 10
上例 递归执行shell模块,直到“all systems go”在标准输出出现,或者每个10s执行1次,执行5次之后无结果。 retries默认值是3,delay默认值是5。
note:如果until参数没有定义, retries值被强制设置为1。

5、使用loop中的register

  1. - shell: "echo {{ item }}"
  2. loop:
  3. - "one"
  4. - "two"
  5. register: echo
与使用loop和register不同的例子
  1. {
  2. "changed": true,
  3. "msg": "All items completed",
  4. "results": [
  5. {
  6. "changed": true,
  7. "cmd": "echo \"one\" ",
  8. "delta": "0:00:00.003110",
  9. "end": "2013-12-19 12:00:05.187153",
  10. "invocation": {
  11. "module_args": "echo \"one\"",
  12. "module_name": "shell"
  13. },
  14. "item": "one",
  15. "rc": 0,
  16. "start": "2013-12-19 12:00:05.184043",
  17. "stderr": "",
  18. "stdout": "one"
  19. },
  20. {
  21. "changed": true,
  22. "cmd": "echo \"two\" ",
  23. "delta": "0:00:00.002920",
  24. "end": "2013-12-19 12:00:05.245502",
  25. "invocation": {
  26. "module_args": "echo \"two\"",
  27. "module_name": "shell"
  28. },
  29. "item": "two",
  30. "rc": 0,
  31. "start": "2013-12-19 12:00:05.242582",
  32. "stderr": "",
  33. "stdout": "two"
  34. }
  35. ]
  36. }
循环遍历注册的变量来检查结果:
  1. - name: Fail if return code is not 0
  2. fail:
  3. msg: "The command ({{ item.cmd }}) did not have a 0 return code"
  4. when: item.rc != 0
  5. loop: "{{ echo.results }}"
在迭代期间,当前item的结果将被放置在变量中
  1. - shell: echo "{{ item }}"
  2. loop:
  3. - one
  4. - two
  5. register: echo
  6. changed_when: echo.stdout != "one"

6、循环inventory

如果想循环inventory中的hosts或者部分hosts,你可以用loop的ansible_play_batch或者groups变量:
  1. # show all the hosts in the inventory
  2. - debug:
  3. msg: "{{ item }}"
  4. loop: "{{ groups['all'] }}"
  5. #show all the hosts in the current play
  6. - debug:
  7. msg: "{{ item }}"
  8. loop: "{{ ansible_play_batch }}"
使用lookup 插件 inventory_hostname 实现:
  1. # show all the hosts in the inventory
  2. - debug:
  3. msg: "{{ item }}"
  4. loop: "{{ query('inventory_hostnames', 'all') }}"
  5. # show all the hosts matching the pattern, ie all but the group www
  6. - debug:
  7. msg: "{{ item }}"
  8. loop: "{{ query('inventory_hostnames', 'all!www') }}"
 

7、循环控制

2.0版本你可以使用loops和task includes(不能用playbook includes)。这增加了一次循环一组任务的能力。每次循环,Ansible默认设置循环变量item,这会导致这些嵌套loop覆盖来自“外部”循环的项目的值。从Ansible 2.1开始,loop_control选项可用于指定要用于循环的变量名。
  1. # main.yml
  2. - include: inner.yml
  3. - include_tasks: inner.yml
  4. loop:
  5. - 1
  6. - 2
  7. - 3
  8. loop_control:
  9. loop_var: outer_item
  10. # inner.yml
  11. - debug:
  12. msg: "outer item={{ outer_item }} inner item={{ item }}"
  13. loop:
  14. - a
  15. - b
  16. - c
note:如果Ansible检测到当前循环正在使用已定义的变量,则会引发错误以使任务失败。
当使用复杂的数据结构来循环显示时,可能会出现busy情况,这就是label指令提供帮助的地方
  1. - name: create servers
  2. digital_ocean:
  3. name: "{{ item.name }}"
  4. state: present
  5. loop:
  6. - name: server1
  7. disks: 3gb
  8. ram: 15Gb
  9. network:
  10. nic01: 100Gb
  11. nic02: 10Gb
  12. ...
  13. loop_control:
  14. label: "{{ item.name }}"
现在,它将只显示标签字段,而不是每个项目的整个结构,它默认为{{item}}来照常显示内容。
 
循环控制的另一个选项是暂停,它允许您控制执行任务循环中的项目之间的时间(以秒为单位)。
  1. # main.yml
  2. - name: create servers, pause 3s before creating next
  3. digital_ocean:
  4. name: "{{ item }}"
  5. state: present
  6. loop:
  7. - server1
  8. - server2
  9. loop_control:
  10. pause: 3
如果您需要跟踪您在循环中的位置,可以使用index_var选项来循环控制以指定变量名称以包含当前循环索引。
  1. - name: count our fruit
  2. debug:
  3. msg: "{{ item }} with index {{ my_idx }}"
  4. loop:
  5. - apple
  6. - banana
  7. - pear
  8. loop_control:
  9. index_var: my_idx

8、loops和 includes (2.0版本)

由于loop_control在Ansible 2.0中不可用,因此当使用带有循环的include时,应该使用set_fact保存item的“outer”循环值:
  1. # main.yml
  2. - include_tasks: inner.yml
  3. loop:
  4. - 1
  5. - 2
  6. - 3
  7. # inner.yml
  8. - set_fact:
  9. outer_item: "{{ item }}"
  10. - debug:
  11. msg: "outer item={{ outer_item }} inner item={{ item }}"
  12. loop:
  13. - a
  14. - b
  15. - c
  16. Note

ansible playbooks loop循环的更多相关文章

  1. 3、Ansible playbooks(Hosts、Users、tasks、handlers、变量、条件测试(when、迭代)、templates)

    Ansible playbooks playbook是由一个或多个“play”组成的列表.play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色.从根本上来讲 ...

  2. ansible playbook loop 翻译

    ansible源文档地址 有时候你想多次重复一个任务. 在计算机编程中,这叫做循环. 常见的 Ansible 循环包括使用文件模块更改几个文件和 / 或目录的所有权,使用用户模块创建多个用户,并重复一 ...

  3. MySQL中的while、repeat、loop循环

    循环一般在存储过程和存储函数中使用频繁,这里只给出最简单的示例 while delimiter $$ create procedure test_while() begin declare sum i ...

  4. oracle for loop循环以及游标循环

    1. for in loop形式 DECLARE    CURSOR c_sal IS SELECT employee_id, first_name || last_name ename, salar ...

  5. Oracle PL/SQL之LOOP循环控制语句

    在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列.常用的LOOP循环语句包含3种形式:基本的LOOP.WHILE...LOOP和FOR...LOOP. LO ...

  6. PL/SQL中LOOP循环控制语句

    在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列.常用的LOOP循环语句包含3种形式:基本的LOOP.WHILE...LOOP和FOR...LOOP. LO ...

  7. Oracle loop循环无法插入数据

    以下的测试基于scott用户下的emp表 首先用while循环进行测试,向emp表插入999条数据 declare i emp.empno; begin loop insert into emp(em ...

  8. [转载]Oracle PL/SQL之LOOP循环控制语句

    在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列.常用的LOOP循环语句包含3种形式:基本的LOOP.WHILE...LOOP和FOR...LOOP. LO ...

  9. Oracle LOOP循环控制语句

    在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列.常用的LOOP循环语句包含3种形式:基本的LOOP.WHILE...LOOP和FOR...LOOP. LO ...

随机推荐

  1. Hibernate的表之间的关系

    表:A.B 一对多关系:A中的一个字段的记录(主键)引用B中的多个记录(外键) 多对一关系:A中的一个字段的记录(外键)引用B中的一个记录(主键) 一对一关系:A.B两个表的关联字段都是主键 多对多关 ...

  2. bzoj 1654: [Usaco2006 Jan]The Cow Prom 奶牛舞会【tarjan】

    几乎是板子,求有几个size>1的scc 直接tarjan即可 #include<iostream> #include<cstdio> #include<cstri ...

  3. codevs1297 硬币(背包dp,方案数)

    1297 硬币  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold   题目描述 Description 我们知道即使是同一种面值的硬币,它们的重量也有可能不一样, ...

  4. 51nod1265判断四点共面

    1265 四点共面 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出三维空间上的四个点(点与点的位置均不相同),判断这4个点是否在同一个平面内(4点共 ...

  5. Android 性能优化(11)网络优化( 7)Optimizing for Doze and App Standby

    Optimizing for Doze and App Standby In this document Understanding Doze Doze restrictions Adapting y ...

  6. mysql-installer-web-community-5.7.18.1.msi的安装(图文详解)

    不多说,直接上干货! 说在前面的话 我为什么已经尝试和使用过同类型产品的很多MySQL版本,还要书写这篇博客呢?基于mysql-installer-web-community-5.7.18.1.msi ...

  7. json常识

    转载网址:http://developer.51cto.com/art/201704/536386.htm   我们先来看一个JS中常见的JS对象序列化成JSON字符串的问题. 请问:以下JS对象通过 ...

  8. Listview多种布局的使用

    ListView中有两个可以用来让ListView可以在视图中显示多种布局的方法,分别是getItemType和getViewTypeCount 其中 getItemViewType返回的是有参数po ...

  9. poj1240 Pre-Post-erous!

    思路: 根据前序序列和后序序列递归构造m叉树,确定每个节点的子节点数量.再用组合数公式累乘. 实现: #include <iostream> using namespace std; ][ ...

  10. Linux学习日记之Deepin下查看crontab运行日志

    Deepin使用 journalctl 替代了 syslog 来处理系统日志 故查看crontab运行日志应使用 journalctl -f /usr/sbin/cron