前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >08-tags与handler

08-tags与handler

原创
作者头像
小朋友呢
修改2020-01-14 17:50:58
5660
修改2020-01-14 17:50:58
举报

标签

例1

编写demo_tags.yml文件

代码语言:txt
复制
[student@workstation ansible]$ cat demo_tags.yml 
- hosts: servera
  tasks:
  - debug:
     msg: "tag1 "
    tags: one

  - debug:
     msg: "tag2"
    tags: two

  - debug:
     msg: "always tags"
    tags: always

  - debug:
     msg: "multi tags"
    tags:
    - n1
    - n2
    - n3

查看tags列表

代码语言:txt
复制
[student@workstation ansible]$ ansible-playbook --list-tags demo_tags.yml
playbook: demo_tags.yml
  play #1 (servera): servera	TAGS: []
      TASK TAGS: [always, n1, n2, n3, one, two]

指定n1,one标签执行

代码语言:txt
复制
[student@workstation ansible]$ ansible-playbook -t n1,one demo_tags.yml 
PLAY [servera] **************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************
ok: [servera]

TASK [debug] **************************************************************************************************
ok: [servera] => {
    "msg": "tag1 "
}

TASK [debug] **************************************************************************************************
ok: [servera] => {
    "msg": "always tags"
}

TASK [debug] **************************************************************************************************
ok: [servera] => {
    "msg": "multi tags"
}

PLAY RECAP **************************************************************************************************
servera                    : ok=4    changed=0    unreachable=0    failed=0  

发现带有always标签的任务也执行了

alwaysAnsible有一个特殊tag该标记的任务总是会执行,除非使用--skip-tags明确指定跳过always标签,才不会执行。

例2

下面来看一个安装redis的例子

代码语言:txt
复制
[student@workstation ansible]$ cat start_redis.yaml
- hosts: servera
  tasks:
  - name: 1.remove old yum
    shell: rm -rf /etc/yum.repos.d/*

  - name: 2.copy new yum config to host
    copy: src=/etc/yum.repos.d/ dest=/etc/yum.repos.d/

  - name: 3.clean yum cache
    shell: yum clean all

  - name: 4.install redis server
    yum: name=redis state=latest

  - name: 5.change bind address
    shell: sed -ri 's/(bind )(.*)/\10.0.0.0/' /etc/redis.conf

  - name: 6.set access password
	shell: sed -i '/^# require/arequirepass shenqierbufan' /etc/redis.conf

	#任务标签,可以从指定标签处开始执行,也就是第6个任务,只执行当前标签任务
	tags: setconfig

	#handlers里的任务只有遇到了notify才执行,调用方式指定handlers的名称
    notify: restart redis

  - name: 7.start redis server
    service: name=redis state=started

  handlers:
  - name: restart redis
    service: name=redis state=restarted

当直接执行的时候会依次全部执行完tasks里的任务,可以使用–skip-tags路过标签的执行

代码语言:txt
复制
[student@workstation ansible]$ ansible-playbook --skip-tags=setconfig start_redis.yaml

下一次可以从指定的标签处开始执行,也就是它只会执行任务6连带的任务,其它的不会去执行

代码语言:txt
复制
[student@workstation ansible]$ ansible-playbook --tags setconfig start_redis.yaml

Handlers

注意的事项

  1. Handlers中任务处理顺序是按照handlers中任务顺序处理,与notify调用的顺序无关。
  2. 如果tasks中某个任务调用handler,直到tasks中所有任务执行完成后才会通知指定handler。
  3. 如果task中notify没有执行,handler不会受到通知。
  4. 任务的状态为changed才会通知handler,任务状态为ok或者failed不会通知handler。
  5. 即使有多个任务通知handler,handler也只会执行一次。
  6. handler的名字是全局生效的,如果有两个handler使用了相同名称,只有一个生效。
  7. 定义在include中的handler是无法被通知的。

示例

编辑httpd剧本文件

代码语言:txt
复制
[student@workstation ansible]$ cat config_http.yml
- hosts: serverc
  tasks:
  - yum:
     name: httpd
     state: latest

  - firewalld:
     service: http
     permanent: yes
     immediate: yes
     state: enabled

  - copy:
     content: "{{ content }}"
     dest: /var/www/html/index.html
    tags: config_http

    notify: restart httpd

  - debug:
     msg: "over"
  handlers:
  - include: handler.yml

handler处理剧本文件

代码语言:txt
复制
[student@workstation ansible]$ cat handler.yml 
- name: restart httpd
  service:
   name: httpd
   state: restarted

执行config_http剧本

代码语言:txt
复制
ansible-playbook config_httpd.yml  -e "content=Foo"

PLAY [serverc] 

TASK [Gathering Facts] 
ok: [serverc]

TASK [yum] 
ok: [serverc]
	
TASK [firewalld] 
ok: [serverc]

TASK [copy] 
changed: [serverc]

TASK [debug] 
ok: [serverc] => {
    "msg": "over"
}

RUNNING HANDLER [restart httpd] 
changed: [serverc]

PLAY RECAP 
serverc                    : ok=6    changed=2    unreachable=0    failed=0

发现定义在include中的handler的内容是可以被执行的。

如果定义handler直接写在include的剧本中是无法被通知的。

一个是handler本身一个是handler里的内容,这两个要区分开来。

立即执行

上面的注意事项说了,handlers只有被通知后等所有的任务执行完,才能执行,那如何在被通知的时候就执行呢?

在多个任务中间加入- meta: flush_handlers任务,那么在此之前需要调用的handler会立即处理。

代码语言:txt
复制
[student@workstation ansible]$ cat config_http.yml
- hosts: serverc
  tasks:
  - yum:
     name: httpd
     state: latest

  - firewalld:
     service: http
     permanent: yes
     immediate: yes
     state: enabled

  - copy:
     content: "{{ content }}"
     dest: /var/www/html/index.html
    tags: config_http
    notify: restart httpd
  
  #立即执行前面通知的任务
  - meta: flush_handlers

  - debug:
     msg: "over"
  handlers:
  - include: handler.yml

执行查看结果

代码语言:txt
复制
[ansible@workstation playbooks]$ ansible-playbook config_httpd.yml -e 'content="Quik Start App!"'
PLAY [serverc] 
TASK [Gathering Facts] 

ok: [serverc]
TASK [yum] 

ok: [serverc]
TASK [firewalld] 

ok: [serverc]
TASK [copy] 
changed: [serverc]

#在debug任务之前就执行了
RUNNING HANDLER [restart httpd] 
changed: [serverc]

TASK [debug] 
ok: [serverc] => {
    "msg": "over"
}
PLAY RECAP 
serverc                    : ok=6    changed=2    unreachable=0    failed=0   

调用多个handler

使用listen关键字为每个handler进行分组

代码语言:txt
复制
[ansible@workstation playbooks]$ cat multi.yml
- hosts: serverd
  tasks:
  - file:
     path: /tmp/haha
     state: touch
    notify: my_groups

  handlers:
  - name: h1
    listen: my_groups
    file: path=/tmp/lala state=touch

  - name: h2
    listen: my_groups
    file: path=/tmp/xixi state=touch

执行剧本

代码语言:txt
复制
[ansible@workstation playbooks]$ ansible-playbook multi.yml 
PLAY [serverd] 

TASK [Gathering Facts] 
ok: [serverd]

TASK [file] 
changed: [serverd]

RUNNING HANDLER [h1] 
changed: [serverd]

RUNNING HANDLER [h2] 
changed: [serverd]

PLAY RECAP 
serverd                    : ok=4    changed=3    unreachable=0    failed=0   

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 标签
    • 例1
      • 例2
      • Handlers
        • 注意的事项
          • 示例
            • 立即执行
              • 调用多个handler
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档