ansible的block特性踩坑记


声明:本文转载自https://my.oschina.net/u/1783725/blog/1602406,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

      介绍:block是ansible在2.0版本引入的一个特性,块功能可以将任务进行逻辑分组,并且可以在块级别上应用任务变量。同时也可以使用类似于其他编程语言处理异常那样的方法,来处理块内部的任务异常。

     原理:block中的组任务,都会继承block的属相(支持when,不支持with_items),部署时会分别执行组中的任务,并且都会继承block的属相(在任务后添加block的when条件)

1、常规使用

--- - hosts: localhost   tasks:        - block:         - yum: name={{ item }} state=installed           with_items:              - httpd              - memcached         - template: src=templates/src.j2 dest=/etc/foo.conf         - name: start service           service: name=bar state=started enabled=True       when: ansible_distribution == 'CentOS'       become: true       become_user: root

2、异常处理

rescue:只有脚本报错时才执行

always:无论结果如何都执行

--- - hosts: localhost    tasks:    - block:        - debug: msg='I execute normally'        - command: /bin/false        - debug: msg='I never execute, due to the above task failing'      rescue:        - debug: msg='I caught an error'        - command: /bin/false        - debug: msg='I also never execute :-('      always:        - debug: msg="this always executes"

      The tasks in the block would execute normally, if there is any error the rescue section would get executed with whatever you need to do to recover from the previous error. The always section runs no matter what previous error did or did not occur in the block and rescue sections.

3、常见陷阱

(1)在2.0中添加了块特性,在2.3中添加了块的name特性

错误反例(2.3以下不支持。2.3及以上就支持了)

--- - hosts: localhost   tasks:     - name: bbbb          #2.3以下的正确姿势应该去掉block的name       block:           - name: bbbb           shell: echo bbbb       when: false      - name: cccc       shell: echo cccc  #-----报错  - name: bbbb       ^ here

(2)block中不能添加注册的变量

原因:如果block的when结果是false,就不会执行任务获得注册变量的值,但是组中有些任务调用此注册变量,就会任务失败。

--- - hosts: localhost   tasks:     - block:         - name: aaaa           shell: echo aaaa         - name: bbbb           shell: echo bbbb           register: results               #-------后面调用会导致失败         - name: echo {{results.stdout}}   #-------调用了,此任务会失败           shell: echo cccc       when: false      - name: dddd       shell: echo dddd

 解决办法:可以给block的vars属相添加变量,在block的组任务中进行调用

--- - hosts: localhost   tasks:     - name: bbbb       shell: echo bbb       register: result                    #-------注册result变量     - block:         - name: aaaa           shell: echo aaaa         - name: echo {{results}}          #-------调用了           shell: echo cccc       when: false       vars:         results: "{{result.stdout}}"      #-------使用vars,将注册的result放入block中results变量中      - name: dddd       shell: echo dddd 

(3)block没有with_items属相

--- - hosts: localhost   tasks:     - block:         - name: aaaa           shell: echo aaaa       with_items:                #-----会报错,block不支持此属相         - myname: dxx                 when: false      - name: dddd       shell: echo dddd

 

本文发表于2018年01月04日 20:32
(c)注:本文转载自https://my.oschina.net/u/1783725/blog/1602406,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 2730 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1