# Topic: Ansible playbook中的循环
# State:
# 1. 通过使用循环可以让重复的工作自动来完成
# 2. Ansible playbook 支持超过20中循环
# Testing environment:
# OS: RHEL6.6
# Python: python2.7.5
# Ansible: ansible 2.3.1.0
# Nodes: 3
#
- 标准循环:
1.1 介绍:
Standard loop 是使用最多的循环方式,可以直接减少编写task的数据,使得重复的task使用一个task即可完成
例如要安装10个软件,如果不使用循环,就需要编写10个task, 如果使用循环编写一个就够了。
1.2 用法:- 关键字: with_items
- 说明:
with_items 数据结构对应的是python或是yaml中的列表,每个列表项也可以是字典,每次循环到的当前列表项
使用item来引用.
1.3 示例1:
- 标准循环:
# standard loop
-
name: stanard loop
remote_user: root
hosts: tomcat
tasks:- name: loop list
debug: msg={{ item }}
with_items:- I
- am
- Michael
- Lin
- name: loop list of python' dic
debug: msg="{{ item.key }} is {{ item.value }}"
with_items:- { key: 'name', value: 'Michael' }
- { key: 'gender', value: 'male' }
- { key: 'age', value: '30' }
- name: loop list of YAML's map
debug: msg="{{ item['key'] }} is {{ item['value'] }}"
with_items:- key: name
value: Michael - key: gender
value: female - key: age
value: 30
...
- key: name
- name: loop list
- 嵌套循环:
2.1 介绍:
嵌套循环可以将多个列表或是字典项进行排序组合后形成多个列表,每一个列表都是一个item, 该item可以是对当前组合的引用
嵌套循环可以将多个集合进行合并.
2.2 用法:- 关键字:
with_nested - 说明:
with_nested的数据结构是一个python或是YAML列表,这些列表可以经过排序组合后形成多个列表,每个循环到的列表都被
引用.
2.3 示例1:
- 关键字:
- 嵌套循环:
# nested loop
- name: nested loop
hosts: tomcat
remote_user: root
gather_facts: false
tasks:- name: "nest loop three list"
debug: msg="{{ item[0] }}''{{ item[1] }}'' {{ item[2]}}"
with_nested:- ['A', 'B', 'C']
- ['1', '2', '3']
- ['*', '$', '@']
- name: " nest loop tow map"
debug: msg="{{ item[0] }}{{item[1]}}{{item[2]}}"
with_nested:- {'a', 'b', 'c'}
- {'1', '2', '3'}
- {'#', '%', '!'}
...
- name: "nest loop three list"
- 散列循环:
3.1 介绍:
散列循环示相对于标准循环只能使用列表而言的,也就是说删了循环完成支持哈希散列。
3.2 用法:- 关键字:
with_dict - 说明:
with_dict引用的数据结构是一个散列,而不是序列。
3.3 示例:
- 关键字:
- 散列循环:
# dict loop example
- name: loop dict
hosts: tomcat
gather_facts: no
vars:
user:
michael:
age: 30
sex: male
tom:
age: 32
sex: female
task:- name: dict loop
debug: msg="{{ item.key }} ' ' {{ item.value.age }} ' ' {{item.value.sex}}"
with_dict: user
- name: dict loop
- 文件匹配循环:
4.1 介绍:
文件循环用于对匹配的文件进行循环操作。
4.2 用法:- 关键字:
with_fileglob - 说明:
with_fileglob 引用的数据结构可以是列表(列表为测试), item指向当前匹配到的文件
4.3 示例:
- 关键字:
- 文件匹配循环:
# file loop example
-
name: loop file
hosts: tomcat
remote_user: root
gather_facts: no
tasks:- name: loop files of the current path
debug: msg={{ item }}
with_fileglob:- ./*.yaml
- ./*.yml
- name: loop files of the current path
- 随机循环:
5.1 介绍:
随机循环就是从一个集合中随机选择一个项来执行操作,记住是选择一个!
5.2 用法:- 关键字:
with_random_choice - 说明:
item引用的数据结构可以是一个列表(哈希散列没有测试)
5.3 示例:
- 关键字:
- 随机循环:
# random loop example
-
name: random loop the list
hosts: ansible1
remote_user: root
gather_facts: no
tasks:- name: random loop
debug: msg={{ item }}
with_random_choice:
['A', 'B', 'C' ]
- name: random loop
- 条件判断循环:
6.1 介绍:
条件判断用来检测task的执行结果是否符合条件,如果符合就不再执行,否则继续执行
6.2 用法:- 关键字:
until - 说明:
until关键字后面跟的是循环停止的条件
6.3 示例:
- 关键字:
- 条件判断循环:
# loop until example
-
name: loop until
hosts: tomcat
remote_user: root
gather_facts: no
tasks:- name: loop the file state
shell: cat /etc/ansible/hosts
register: info
until: info.stdout.startswith('ansi')
retries: 5
delay: 5
- name: loop the file state
- 文件优先循环:
7.1 介绍:
将第一匹配的文件传入item
7.2 用法:- 关键字:
with_first_found - 说明:
7.3 示例:
- 关键字:
- 文件优先循环:
-
hosts: tomcat
remote_user: root
tasks:- name: INTERFACES | Create Ansible header for /etc/network/interfaces
template:
src: "{{ item }}"
dest: "/etc/foo.conf"
with_first_found:- "{{ ansible_virtualization_type }}_foo.conf"
- "default_foo.conf"
- name: INTERFACES | Create Ansible header for /etc/network/interfaces
- register循环:
8.1 介绍:
该循循环是在register中存储多个task执行结果,然后遍历register中的值
8.2 用法:- 关键字:
- 说明:
当循环完成后使用register来存储结果, 然后使用jinja2的语法来遍历结果
8.3 示例:
- register循环:
# register loop example
- name: register loop
hosts: tomcat
remote_user: root
tasks:- name: print all the register
shell: "{{ item }}"
with_items:- uname
- whoami
register: its
- name: print its
debug: msg="{% for i in its.results %} {{ i.stdout }} {% endfor %}"
- name: print all the register
...
网友评论