Ansible中的任务执行控制

一、循环

playbook中的循环一般使用loop赋值列表搭配item变量进行迭代来实现,可以设置简单的单变量与多变量字典列表循环。loop写在play片段中与name同级。

loop:              ##单变量
  - westos1
  - westos2
  - ...

{{item}}  ##引用


loop:              ##多变量 字典列表
  - name: westos1
    age: 18
  - name: westos2
    age: 20
  - ...

{{item['name']}}  ##引用
{{item['age']}}

实例:

建立用户westos1-3,密码分别为123、456、789

---
- name:
  hosts: all
  tasks:
    - name: user
      user: 
        name: "{{item['NAME']}}"
        state: present
        password: "{{item['PASSWD']}}"
      loop:
        - NAME: westos1
          PASSWD: $6$KrDUPp7kcHC6z8vb$TZpXIp0bDwHlltHWP.Jt3Y9/fSY4t1ZorNNWB08jOZtPN4daLS1vaLiS1Ju9kpZNNM6awrIkffBNwt99TDina1   ##openssl passwd -6  生成
        - NAME: westos2
          PASSWD: $6$IPSOjPujSt1c3.GI$kCYoxalePiJexVqVgl3QJV2BHZfQ/8H7a9tbhVtPVSTpfzAJ76UkrDWgYYE1HI9aF6dGly2OIrnJTduwUvAvN/
        - NAME: westos3
          PASSWD: $6$YqBHyeJFulqsZtHy$XFegXoT3NufZXwj8pGrIhBgsgQlfAnFdQH1HuxbnZnJyZwbPNZsu5xyVMZFP4zwE045XGZtk5osUmmjOsZOjw1

 

二、条件

when 控制所在的play片段的执行,满足成立则执行,不满足条件则不执行。when也是在play片段内书写,与name同级。

when:           ##一个条件        
  - 条件1

when:           ##两个条件同时满足才执行  and
  - 条件1
  - 条件2 

when: >         ##两个条件满足其中一个则执行  or
  条件1
  or
  条件2
条件判断(value意为变量)描述
value == "字符串",value == 数字变量等于
value <  数字变量小于
value >  数字变量大于
value <= 数字变量小于等于
value >= 数字变量大于等于
value != 数字变量不等于
value is defined变量存在
value is not defined变量不存在
value is in value变量为
value is not in value变量不为
value变量的bool值为true
not value变量的bool值为false
value in value2value的值在value2列表中

测试:

建立playbook  ~/ansibles/lvm.yml要求如下:
*建立大小为1500M名为exam_lvm的lvm 在westos组中
*如果westos不存在请输出:
 vg westos  is not exist
*如果westos大小不足1500M请输出:
 vg westos is less then 1500M
 并建立800M大小的lvm

---
- name: create exam_lv
  hosts: all
  tasks:

    - name: show massage
      debug:
        msg: westos is not exist
      when: ansible_facts['lvm']['vgs']['westos'] is not defined

    - name: create_1500Mlvm
      lvol:
        lv: exam_lvm
        vg: westos
        size: 1500M
      when: ansible_facts['lvm']['vgs']['westos'] is defined
      ignore_errors: yes
      register: OUTPUT

    - name: check massage
      debug:
        msg: westos is less then 1500M
      when: 
        - ansible_facts['lvm']['vgs']['westos'] is defined
        - OUTPUT.rc is defined

    - name: create_800Mlvm
      lvol:
        lv: exam_lvm
        vg: westos
        size: 800M
      when: 
        - ansible_facts['lvm']['vgs']['westos'] is defined
        - OUTPUT.rc is defined

效果:

受控主机有三台,50中westos组足够1500M、100中westos组不足1500M、150中没有wstos组

playbook符合要求

三、触发器

notify:                    ##当前play片段执行后,受控主机有更改(显示黄色),则触发指定的handlers中的动作,与所在play片段的那么同级。

handlers:              ##触发器触发后执行的动作,与当前playbook的tasks、hosts等同级。

四、处理失败任务

1. ignore_errors

当play遇到任务失败不会终止playbook

ignore_errors: yes     ##将会忽略当前任务失败继续运行下面的任务,默认为no,与play片段中的name同级

2.  force_handlers

 当任务失败后play被终止也会调用触发器进程

 force_handlers: yes    ##与playbook中的hosts、tasks同级

3. changed_when

强制控制所在play片段是否报告changed

changed_when: true | false           

演示:

当前执行test.yml,报告为ok

加上changed_when: true后执行,报告为changed

 4. failed_when

当符合条件时强制任务失败

failed_when: true         ##强制play任务失败

failed_when: false         ##强制play任务成功

failed_when: 条件         ##满足条件时,强制play任务失败

5. block、rescue、always 关键字

关键字描述
block定义首要要运行的任务,与rescue成对出现
rescue定义当block中出现失败任务后运行的任务,与block成对出现
always定义最终独立运行的任务

测试:

建立playbook  ~/westos.yml要求为:建立大小为1500M名为/dev/vdb1的设备;如果/dev/vdb不存在输出/dev/vdb  is not exist;如果/dev/vdb大小不足2G请输出/dev/vdb is less then 2G,并建立800M大小的/dev/vdb1;将vdb1挂载到/westos上。

思路分析:

建立/westos

检测/dev/vdb是否存在

            1. 不存在则输出/dev/vdb  is not exist

            2. 存在则 block-建立2G的vdb1

                    1)执行成功说明vdb足够2G,触发:删除2G的vdb1、建立                                                                 1500M的vdb1、 格式化、建立挂载点、永久挂载

                    2)执行失败说明vdb不足2G,rescue-建立800M的vdb1,触发格式化、建                                      立挂载点、永久挂载

---
- name: create_vdb1
  hosts: all
  tasks:
    - name: check /dev/vdb
      debug:
        msg: /dev/vdb is not exist
      when: ansible_facts['devices']['vdb'] is not defined

    - name: create_vdb1
      block:
        - name: check_2G 
          parted:
            device: /dev/vdb
            number: 1
            state: present
            part_end: 2GiB
          when: ansible_facts['devices']['vdb'] is defined
          notify:
            - remove_2G
            - create_1500M
            - create_filesystem
            - touch_westos
            - mount_vdb1

      rescue:
        - name: create_800M
          parted:
            device: /dev/vdb
            number: 1
            state: present
            part_end: 800MiB
          when:
            - ansible_facts['devices']['vdb'] is defined
          notify:
            - show_message
            - create_filesystem
            - touch_westos
            - mount_vdb1


  handlers:
    - name: show_message
      debug:
        msg: /dev/vdb is less then 2G

    - name: remove_2G
      parted:
        device: /dev/vdb
        number: 1
        state: absent
    
    - name: create_1500M
      parted:
        device: /dev/vdb
        number: 1
        state: present
        part_end: 1500MiB

    - name: create_filesystem
      filesystem:
        fstype: xfs
        dev: /dev/vdb1
        force: yes
    
    - name: touch_westos
      file:
        path: /westos
        state: directory


    - name: mount_vdb1
      mount:
        path: /westos
        src: /dev/vdb1
        fstype: xfs
        state: mounted

  效果:

当前受控主机有三台,50中/dev/vdb足够2G、100中/dev/vdb不足2G、150中没有/dev/vdb

此playbook符合要求

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值