ansible- handlers用法

  • 清单配置:

    cat /etc/ansible/hosts 
    [test]
    18.18.23.102 ansible_become_pass='123.cn'
  • 配置文件配置:

    cat /etc/ansible/ansible.cfg 
    [defaults]
    inventory = /etc/ansible/hosts
  • handlers介绍和用法

    handlers是另一种'任务列表',handlers中的任务会被tasks中的任务进行调用。当tasks中的任务真正执行后,handlers中被调用的任务才会执行。如果tasks中的任务并没有做出真正的操作,handlers中的任务即使被调用,也并不会被执行。handlers可以有多个任务,并被tasks中不同的任务notify.

    handlers和tasks是对齐的。通过notify关键字通知handlers中的任务。

    所有task执行完毕后,才会执行各个handler.

    如果在执行完某些task以后立即执行对应的handler,需要使用meta模块。

    meta任务是一种特殊任务,meta任务可影响ansible的内部运行方式。meta:flush_handlers表示立即执行之前的task所对应handler.

  例如: cat meta.yaml 
  ---
  - hosts: test
    remote_user: yuan
    tasks:
    - name: task1
      file: 
        path: /php7/osspull
        state: touch
      notify: handler1
    - name: task2
      file: 
        path: /php7/ossupload
        state: touch
      notify: handler2

    - meta: flush_handlers

    - name: task3
      file: 
        path: /python/smtposs
        state: touch
      notify: handler3

    handlers:
    - name: handler1
      file: 
        path: /php7/video.txt
        state: touch
    - name: handler2
      file: 
        path: /php7/video2.txt
        state: touch
    - name: handler3
      file: 
        path: /python/smtpemail.txt
        state: touch

在每个task执行后立马执行对应handlers,可以在每个任务后都添加一个meta任务,并将其值设置为flush_handlers.

如果一次notify多个handler,需要借助关键字: listen.

可将listen理解为组名。 一次notify多个handler时,把多个handler分为"一组",使用相同组名即可。

  例如: cat listen.yaml 
  ---
  - hosts: test
    remote_user: yuan
    tasks:
    - name: taskone
      file:
        path: /php7/wordpress.txt
        state: touch
      notify: handler group 1

    handlers:
    - name: handler1
      listen: handler group 1
      file:
        path: /php7/wp1
        state: touch
    - name: handler2
      listen: handler group 1
      file:
        path: /php7/wp2
        state: touch

tags的用法

当你想要执行一个playbook脚本其中的一部分任务时,该怎么办呢?
这个时候tags就派上用场了。

tags可以对任务进行"打标签", 根据标签,我们可以指定哪些任务可以执行,哪些任务不执行。

例如:

  cat tags.yaml 
  ---
  - hosts: test
    remote_user: yuan
    tasks:
    - name: one
      file:
        path: /dockerfile/alpine-nginx
        state: directory
      tags: a1
    - name: two
      file: 
        path: /dockerfile/alpine-mysql
        state: directory
      tags: a2
    - name: three
      file:
        path: /dockerfile/alpine-python
        state: directory
      tags: a3

只执行a2的任务:
ansible-playbook -S -R root --tags=a2 tags.yaml

ansible第四篇(经典用法)

使用--tags选项指定某个标签,当指定标签后,标签对应的任务就会被执行,其他任务则不会被执行。

也可以使用--skip-tags选项指定"不执行的任务".

可以为每个任务添加多个标签。如果不同的多个任务之间有关联性,也可以使用相同的标签。

语法示例:

  语法1:
  tags:
    - n1
    - nginx
  语法2:
  tags: n1,nginx

调用标签时,可一次性指定多个标签,调用多个标签用逗号隔开。

查看tags.yaml中有哪些标签,执行:
ansible-playbook -S -R root --list-tags tags.yaml
ansible第四篇(经典用法)

  • ansible预置的5个特殊tag

    • always : 这个任务总是会被执行。
    • never : 这个任务从不执行。
    • tagged: 表示只执行有标签的任务。
    • untagged : 表示只执行没有标签的任务。
    • all : 表示所有任务会被执行,默认标签.不用指定。

    如果多个任务的tags标签的值中,存在always关键字,会执行所有有always关键字对应的任务。

    不执行标签中包含always的任务,可以使用--skip-tags选项跳过。
    例如:

    该命令跳过所有包含always关键字的任务:
    ansible-playbook -S -R root --skip-tags always tags.yaml
    
    只执行有标签的任务:
    ansible-playbook -S -R root --tags tagged tags.yaml
    
    跳过包含标签和always关键字的任务:
    ansible-playbook -S -R root --skip-tags tagged tags.yaml
    
    只执行没有标签的任务,若包含always关键字,任务也会执行:
    ansible-playbook -S -R root --tags untagged tags.yaml