美文网首页Ansible-Developer
Ansible_playbook_使用循环

Ansible_playbook_使用循环

作者: Michael_林 | 来源:发表于2017-10-22 14:11 被阅读2次

# 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.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
        ...
    1. 嵌套循环:
      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'}
      • {'#', '%', '!'}
        ...
    1. 散列循环:
      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
    1. 文件匹配循环:
      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
    1. 随机循环:
      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' ]
    1. 条件判断循环:
      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
    1. 文件优先循环:
      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"
    1. register循环:
      8.1 介绍:
      该循循环是在register中存储多个task执行结果,然后遍历register中的值
      8.2 用法:
      • 关键字:
      • 说明:
        当循环完成后使用register来存储结果, 然后使用jinja2的语法来遍历结果
        8.3 示例:

# 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 %}"

...

相关文章

网友评论

    本文标题:Ansible_playbook_使用循环

    本文链接:https://www.haomeiwen.com/subject/fuiguxtx.html