playbook中的模块(handler模块&meta模块和应用tag标签)

1、handler模块

  • 首先我们配置一下实验环境,首先在server4上安装好httpd,然后写一个yaml文件(其作用是启动修改远程主机的httpd主配置文件,然后再重新启动httpd服务)。
  • ansible playbook 重启服务 ansible 重启机器_重启


  • ansible playbook 重启服务 ansible 重启机器_执行顺序_02


  • ansible playbook 重启服务 ansible 重启机器_重启_03

  • 在ansible管理主机上,编辑yaml文件,修改远程主机server4上的httpd的服务端口,然后重新启动httpd服务。
  • ansible playbook 重启服务 ansible 重启机器_执行顺序_04


  • ansible playbook 重启服务 ansible 重启机器_执行顺序_05


  • ansible playbook 重启服务 ansible 重启机器_重启_06


  • ansible playbook 重启服务 ansible 重启机器_不执行_07

  • 那么如果我们再次在远程主机上执行这个yaml文件呢?会出现什么的结果?
  • ansible playbook 重启服务 ansible 重启机器_不执行_08

  • 再次执行上一个脚本时,我们会发现它虽然没有改变端口(上一步改过了,根据幂等性不会改变),但服务被重启了,这显然是不符合常理的。如何写一个playbook使它在做改变端口这一动作后才重启,若没改变则不重启?这时候就需要handler模块
  • 在yaml文件中添加handler模块,然后执行查看执行结果
  • ansible playbook 重启服务 ansible 重启机器_执行顺序_09


  • ansible playbook 重启服务 ansible 重启机器_重启_10

  • 在这里解释一下,handler的作用,我们在上面的httpd.yaml文件中添加了notify,还添加了handler,在上面这个yaml文件中,只有当task任务执行了之后,才可以执行notify定义的一个或者多个handlers,但是在上面的httpd.yaml文件中,我们没有修改task中的内容,所以task只是命令执行成功了,而并没有change,所以notify定义的restart httpd就不会执行
  • 再写一个handler的示例:
  • ansible playbook 重启服务 ansible 重启机器_执行顺序_11


  • ansible playbook 重启服务 ansible 重启机器_执行顺序_12


  • ansible playbook 重启服务 ansible 重启机器_重启_13

  • notify用来调用handlers中的任务,表示如果执行tasks中的动作才会执行调用的handlers动作
  • ansible playbook 重启服务 ansible 重启机器_执行顺序_14


  • ansible playbook 重启服务 ansible 重启机器_不执行_15


  • ansible playbook 重启服务 ansible 重启机器_不执行_16

  • 修改mkdir.yaml文件中notify任务的顺序
  • ansible playbook 重启服务 ansible 重启机器_不执行_17


  • ansible playbook 重启服务 ansible 重启机器_不执行_18


  • ansible playbook 重启服务 ansible 重启机器_执行顺序_19

  • handler任务的执行顺序与调用顺序无关,而与handlers:下写的顺序有关

2、meta模块

  • 我们会发现上一个脚本是将所有task任务执行完,才去执行handler中的任务。那么如果想在执行完一个task就立即执行它调用的handler,然后再去执行task中的其他任务,就需要使用meta模块。
  • 示例一:
  • 首先删除远程主机server4中/testdir目录下已经存在的文件和目录

ansible playbook 重启服务 ansible 重启机器_不执行_20

vim meta.yaml

---
- hosts: testB
  remote_user: root
  tasks:
  - name: task1
    file:
      path=/testdir/file1
      state=directory
    notify: handler1
  - meta: flush_handlers
  - name: task2
    file:
      path=/testdir/file2
      state=directory
    notify: handler2
  - meta: flush_handlers
  - name: task3
    file:
      path=/testdir/file3
      state=directory
    notify: handler3

  handlers:
  - name: handler1
    file:
      path=/testdir/h1
      state=touch
  - name: handler2
    file:
      path=/testdir/h2
      state=touch
  - name: handler3
    file:
      path=/testdir/h3
      state=touch

ansible playbook 重启服务 ansible 重启机器_不执行_21

可以看到执行顺序为task1—handler1—task2—handler2—task3—handler3

ansible playbook 重启服务 ansible 重启机器_执行顺序_22

  • 如果想执行一个task任务而调用多个handler,就需要给他们起一个共同的名字来调用



    可以看到task1执行完后分别执行了h1和h2
  • 示例二:


3、tag标签

  • 当一个剧本中含有多个task任务时,如果我们不想全部执行而是想执行执行某些任务,就需要给每个任务添加标签。
  • 示例一:

  • 当存在多个task时,我们还可以跳过某些task不执行,而执行其他的task

  • 添加标签的3种语法:
语法1:
tags:
  - t1
  - t2
语法2:
tags: ['t1','t2']
语法3:
tags: t1,t2

ansible playbook 重启服务 ansible 重启机器_重启_23


ansible playbook 重启服务 ansible 重启机器_重启_24


ansible playbook 重启服务 ansible 重启机器_执行顺序_25

  • 共同标签
  • ansible playbook 重启服务 ansible 重启机器_重启_26


  • ansible playbook 重启服务 ansible 重启机器_执行顺序_27


  • ansible playbook 重启服务 ansible 重启机器_执行顺序_28


  • ansible playbook 重启服务 ansible 重启机器_重启_29

  • 特殊标签:
  • always:不管是否指定都会被执行,一直执行;
  • never:一直不执行,除非指定执行标签为never的任务。

(1)、always示例

ansible playbook 重启服务 ansible 重启机器_不执行_30


ansible playbook 重启服务 ansible 重启机器_重启_31


ansible playbook 重启服务 ansible 重启机器_不执行_32


与前面所讲的指定标签执行的方法一样,我们同样可以指定always不运行(如果有多个always,都会跳过)

ansible playbook 重启服务 ansible 重启机器_执行顺序_33


(2)、never示例

ansible playbook 重启服务 ansible 重启机器_执行顺序_34


ansible playbook 重启服务 ansible 重启机器_重启_35


ansible playbook 重启服务 ansible 重启机器_重启_36


(3)、剩余的三个特殊标签分别为tagged、untagged、 all这三个特殊标签并非像always一样,always作为标签值存在,而这三个特殊标签则是在调用标签时使用

  • tagged:上述命令表示只执行有标签的任务,没有任何标签的任务不会被执行;
  • untagged:上述命令表示只执行没有标签的任务,但是如果某些任务包含always标签,那么这些任务也会被执行;
  • all:特殊标签alI表示所有任务会被执行,不用指定。
  • tagged示例:
  • ansible playbook 重启服务 ansible 重启机器_重启_37


  • ansible playbook 重启服务 ansible 重启机器_执行顺序_38


  • ansible playbook 重启服务 ansible 重启机器_重启_39


  • ansible playbook 重启服务 ansible 重启机器_重启_40


  • ansible playbook 重启服务 ansible 重启机器_不执行_41

  • untagged示例
  • ansible playbook 重启服务 ansible 重启机器_重启_42

  • 上述命令表示只执行没有标签的任务,但是如果某些任务包含always标签,那么这些任务也会被执行
  • ansible playbook 重启服务 ansible 重启机器_重启_43


  • ansible playbook 重启服务 ansible 重启机器_不执行_44

  • 上述命令表示跳过没有标签的任务,只执行有标签的任务
  • all示例
  • ansible playbook 重启服务 ansible 重启机器_不执行_45


  • ansible playbook 重启服务 ansible 重启机器_重启_46