角色中定义的 Ansible 处理程序是否在整个剧本或角色之后运行?

Pet*_*ner 15 ansible

我正在运行 Ansible 2.0,我可以运行它,但我也可能被欺骗相信我的经验测试不正确的东西,而且我找不到任何文档来告诉我何时应该运行处理程序。

如果处理程序在任务结束时没有运行,这就是我的难题。我有一个包含 5 个角色的剧本,我想在最后添加一个 6 个角色,需要在它开始之前完成第 4 个角色的处理程序。

在做其他事情之前,有没有办法运行 Ansible 来依赖处理程序的完成(即角色完全完成),或者我使用的处理程序是否错误?

tec*_*raf 19

处理程序被执行:

  • 在戏剧结束时(不是剧本)
  • 在执行meta: flush_handlers任务时

因此,“要在需要具有第 4 个角色的处理程序的末尾添加 6 个角色”,您需要:

对于您的用例,我建议使用第一种方法,因为该include_role模块仍然非常新鲜,并且在使用时有一些怪癖(请参阅SO 上的这个问题)。


此外,请注意处理程序的名称和侦听调用是全局的,因此如果两个不同角色的处理程序具有相同的名称并且在单个播放中分配两个角色,则会发生冲突。(ref. Handlers: Running Operations On Change )

处理程序 [ ] 由全局唯一名称引用,并由通知程序通知。[ ] 一个处理程序,它只会运行一次,在特定游戏中的所有任务完成后。

处理程序名称和侦听主题位于全局命名空间中。


  • 经验证明(运行此 shell 脚本以确认在播放结束时执行了处理程序 - 这里有相互矛盾的评论和答案):

    #!/bin/bash
    
    mkdir -p ./sf831880/roles/role1
    mkdir -p ./sf831880/roles/role1/handlers
    mkdir -p ./sf831880/roles/role1/tasks
    mkdir -p ./sf831880/roles/role2
    mkdir -p ./sf831880/roles/role2/handlers
    mkdir -p ./sf831880/roles/role2/tasks
    
    cat >./sf831880/roles/role1/tasks/main.yml <<TASKS1_END
    ---
    - name: Always true in role1
      command: echo role1
      notify: handler1
    TASKS1_END
    
    cat >./sf831880/roles/role2/tasks/main.yml <<TASKS2_END
    ---
    - name: Always true in role2
      command: echo role2
      notify: handler2
    TASKS2_END
    
    cat >./sf831880/roles/role1/handlers/main.yml <<HANDLERS1_END
    ---
    - name: handler1
      debug:
        msg: "This is a handler in role1"
    HANDLERS1_END
    
    cat >./sf831880/roles/role2/handlers/main.yml <<HANDLERS2_END
    ---
    - name: handler2
      debug:
        msg: "This is a handler in role2"
    HANDLERS2_END
    
    cat >./sf831880/playbook.yml <<PLAYBOOK_END
    ---
    - hosts: localhost
      gather_facts: no
      connection: local
      roles:
        - role1
        - role2
      tasks:
        - debug:
            msg: "This is a task in a play"
    PLAYBOOK_END
    
    ansible-playbook ./sf831880/playbook.yml
    
    Run Code Online (Sandbox Code Playgroud)

    结果:

    PLAY [localhost] ***************************************************************
    
    TASK [role1 : Always true in role1] ********************************************
    changed: [localhost]
    
    TASK [role2 : Always true in role2] ********************************************
    changed: [localhost]
    
    TASK [debug] *******************************************************************
    ok: [localhost] => {
        "msg": "This is a task in a play"
    }
    
    RUNNING HANDLER [role1 : handler1] *********************************************
    ok: [localhost] => {
        "msg": "This is a handler in role1"
    }
    
    RUNNING HANDLER [role2 : handler2] *********************************************
    ok: [localhost] => {
        "msg": "This is a handler in role2"
    
    Run Code Online (Sandbox Code Playgroud)
  • 播放修改为包含meta: flush_handlers

    ---
    - hosts: localhost
      gather_facts: no
      connection: local
      roles:
        - role1
        - role2
      tasks:
        - meta: flush_handlers
        - debug:
            msg: "This is a task in a play"
    
    Run Code Online (Sandbox Code Playgroud)

    结果:

    PLAY [localhost] ***************************************************************
    
    TASK [role1 : Always true in role1] ********************************************
    changed: [localhost]
    
    TASK [role2 : Always true in role2] ********************************************
    changed: [localhost]
    
    RUNNING HANDLER [role1 : handler1] *********************************************
    ok: [localhost] => {
        "msg": "This is a handler in role1"
    }
    
    RUNNING HANDLER [role2 : handler2] *********************************************
    ok: [localhost] => {
        "msg": "This is a handler in role2"
    }
    
    TASK [debug] *******************************************************************
    ok: [localhost] => {
        "msg": "This is a task in a play"
    
    Run Code Online (Sandbox Code Playgroud)