ansible——playbook循环

1.标准loop

通过with_items参数实现,item会去with_items这个数组中轮询取值。
定义normal_loos.yaml:

---
- hosts: all
  gather_facts: False
  tasks:
    - name: debug loops
      debug: msg="name ------> {{ item }}"
      with_items:
        - one
        - two

执行结果:

当然可以支持键值对的方式:
定义normal2_loops.yaml:

---
- hosts: all
  gather_facts: False
  tasks:
    - name: debug loops
      debug: msg="name ------> {{ item.key }} value ------> {{ item.value }}"
      with_items:
        - {key: "one", value: "VALUE1"}
        - {key: "two", value: "VALUE2"}

执行结果:

 

2.嵌套Loops

主要实现多个循环体的合并。
定义nest_loop.yaml:

---
- hosts: all
  gather_facts: False
  tasks:
    - name: debug loops
      debug: msg="name->{{ item[0] }} value->{{ item[1] }}"
      with_nested:
         - ['A']
         - ['a','b','b']

执行结果:

解释说明:
  with_nested是一个数组.
  item[0]表示这个数组的第一个元素,也就是['A']
  item[1]表示这个数组的第二个元素,也就是['a','b','b']
  然后分别循环这两个元素。

 

3.散列loops

标准loop支持的是数组,类似于python中的列表。
嵌套loop其实使用是[{},{}]这种列表套字典的形式,
而散列loop可以直接支持字典形式,只是变相要遵循yaml格式。

定义:  hash_loop.yaml

---
- hosts: all
  gather_facts: Fasle
  vars:
    user:
      kebi:
        name: zhangrongkai
        addr: luotian
      maoxian: 
        name: songlixing
        addr: xiaochang

  tasks:
    - name: debug loops
      debug: msg="name--->{{ item.key }} value--->{{ item.value.name }} addr---{{ item.value.addr }}"
      with_dict: "{{ user }}"

将其转化为python中的字典格式:

user = {
    "kebi": {
        "name": "zhangrongkai",
        "addr": "luotian"
    },
    "maoxian": {
        "name": "songlixing",
        "addr": "xiaochang"
    }
}

item=user,key=[kebi,maoxian],然后取其属性值。

注意这里:with_dict: "{{ user }}"
在2.0之前,采用的是这种格式:with_dict: user
否则就会报错:

 

4.文件配置loops

在某些时候,我们需要针对某一类型的文件进行一些操作,这个时候就可以使用fileglob这个参数。
通过这个fileglob就能匹配到相应的文件,然后就可以进行相应的操作。
定义:file_loop.yaml

---
- hosts: all
  tasks:
    - name: debug loops
      debug: msg="filename--->{{ item }}"
      with_fileglob:
        - /tmp/*.py

执行结果:

在ansible内部其实是调用python模块glob,然后进行如下操作:
  glob.glob("/tmp/*.py")

 

5.随机选择loops

随机选择item数组中的一个值。
定义:random_loop.yaml

---
- hosts: all
  tasks:
     - name: debug loops
       debug: msg="name--->{{ item }}"
       with_random_choice:
         - "test1"
         - "test2"
         - "test3"

执行结果:

内部其实就是使用python的random模块来实现。

 

6.条件判断

有时候,我们需要执行一个操作,这个操作可能失败,我们希望5秒之后再去尝试执行,
这样的操作重复5次,如果还不行就退出。
定义:case_loop.yaml

---
- hosts: all
  tasks:
    - name: debug loops
      shell: cat /etc/hostname
      register: host
      until: host.stdout.startswith("centos")
      retries: 5
      delay: 5

执行结果:

解释说明:
  name: debug loops #任务名称,非必需
  shell: cat /etc/hostname #操作
  register: host #操作的结果赋值给host
  until: host.stdout.startswith("centos") #直到...成立
  retries: 5 #重复5次
  delay: 5 #每个5秒重复一次

如果操作失败,是下面结果:

 

7.文件优先匹配Loops

文件优先匹配会根据你传入的变量或者文件进行从上往下匹配,如果匹配到某个文件,它会用这个文件当作{{item}}的值。

---
- hosts: all
  tasks:
    - name: debug loops
      debug: msg="file--->{{ item }}"
      with_first_found:
        - "{{ ansible_distribution }}.yaml"
        - "default.yaml

 

8.register Loops

之前通过register定义ret来接收shell操作的结果。
当时之前接收的是一个数据,但是现在确实接收多个。

定义:  register_loop.yaml

---
- hosts: all
  tasks: 
    - name: debug loops
      shell: "{{ item }}"
      with_items:
        - hostname
        - uname
      register: ret
    - name: display loops
      debug: msg="{% for i in ret.results %} {{ i.stdout }} {% endfor %}"

执行结果:

posted @ 2020-04-07 23:39  明王不动心  阅读(1373)  评论(0编辑  收藏  举报