编写demo_tags.yml文件
[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列表
[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标签执行
[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标签的任务也执行了
always是Ansible有一个特殊tag
,该标记的任务总是会执行,除非使用--skip-tags明确指定跳过always标签,才不会执行。
下面来看一个安装redis的例子
[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路过标签的执行
[student@workstation ansible]$ ansible-playbook --skip-tags=setconfig start_redis.yaml
下一次可以从指定的标签处开始执行,也就是它只会执行任务6连带的任务,其它的不会去执行
[student@workstation ansible]$ ansible-playbook --tags setconfig start_redis.yaml
编辑httpd剧本文件
[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处理剧本文件
[student@workstation ansible]$ cat handler.yml
- name: restart httpd
service:
name: httpd
state: restarted
执行config_http剧本
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会立即处理。
[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
执行查看结果
[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
使用listen关键字为每个handler进行分组
[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
执行剧本
[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 删除。