写点什么

Ansible Playbook - 03

用户头像
耳东
关注
发布于: 3 小时前

Handlers

正如我们所提到的,模块应该是幂等的,并且可以在它们对远程系统进行更改时进行中继。Playbook 认识到这一点,并有一个基本的事件系统,可以用来响应变化。


这些 notify 动作在一个 playbook 中每个任务块的末尾触发,即使由多个不同的任务通知,也只会触发一次。


例如,多个资源可能表明 apache 需要重新启动,因为它们更改了配置文件,但是 apache 只会被触发一次,以避免不必要的重新启动


这里有例子


- name: template configuration file  template:    src: template.j2    dest: /etc/foo.conf  notify:     - restart memcached     - restart apache
复制代码


上边例子里 notify 列出的任务被称为 handlers


Handlers 其实是一个任务列表,实际上与常规任务没有什么不同,它们由全局惟一名称引用,并由 notify 程序通知。如果没有通知处理程序,它将不会运行。不管有多少任务通知一个处理程序,它都只运行一次,即在一个特定的 play 中完成所有任务之后


这里有一个 handlers 的示例


handlers:    - name: restart memcached      service:        name: memcached        state: restarted    - name: restart apache      service:        name: apache        state: restarted
复制代码


在 Ansible 2.2 之后,handlers 可以使用 listen 参数被监听,


handlers:    - name: restart memcached      service:        name: memcached        state: restarted      listen: "restart web services"    - name: restart apache      service:        name: apache        state:restarted      listen: "restart web services"
tasks: - name: restart everything command: echo "this task will restart the web services" notify: "restart web services"
复制代码


这种用法使触发多个处理程序变得容易得多。它还将处理程序与其名称解耦,使处理程序更容易在 Playbook 和 Role 之间共享 (特别是在使用来自共享源(如 Galaxy)的第三方角色时)。


在下一节的时候会介绍 Role ,现在有如下内容需要注意:


  • 在 pre_tasks、tasks 和 post_tasks 部分中通知的处理程序将在通知它们的部分的末尾自动刷新;

  • 角色部分中通知的处理程序将在任务部分的末尾自动刷新,但在任何任务处理程序之前。

执行一个 Playbook

现在已经学会了 Playbook 的语法,那么如何执行一个 Playbook,非常简单,使用下列命令就可以并行的执行。


$ ansible-playbook playbook.yml -f 10
复制代码


发布于: 3 小时前阅读数: 4
用户头像

耳东

关注

还未添加个人签名 2020.05.24 加入

主要研究分享运维技术,专注于监控、CICD、操作系统、云原生领域,公众号【耳东学堂】,知识星球同名,坚持原创,希望能和大家在运维路上结伴而行 邮箱:erdong@mail.erdong.site

评论

发布
暂无评论
Ansible Playbook - 03