无法从所有主机的依赖角色执行处理程序

时间:2019-04-11 11:55:42

标签: ansible dependencies ansible-2.x ansible-role ansible-handlers

设置

我有多个角色,它们声明了角色依赖关系,有时还使用它们所依赖角色的处理程序。我的安装程序的简化版本如下所示(这是head inventory **/*.yml的输出,它显示了所有路径名和文件的全部内容):

==> inventory <==
[app]
server1 ansible_host=192.168.2.113
[db]
server2 ansible_host=192.168.2.153

==> playbook.yml <==
- hosts: all
  roles:
    - { role: app, when: "inventory_hostname in groups['app']" }
    - { role: db,  when: "inventory_hostname in groups['db']"  }

==> roles/app/handlers/main.yml <==
- name: app handler
  command: echo app handler

==> roles/app/meta/main.yml <==
dependencies: [base]

==> roles/app/tasks/main.yml <==
- command: /bin/true
  notify: [app handler, base handler]

==> roles/base/handlers/main.yml <==
- name: base handler
  command: echo base handler

==> roles/base/tasks/main.yml <==
- command: /bin/true

==> roles/db/handlers/main.yml <==
- name: db handler
  command: echo db handler

==> roles/db/meta/main.yml <==
dependencies: [base]

==> roles/db/tasks/main.yml <==
- command: /bin/true
  notify: [db handler, base handler]

现在我运行ansible-playbook -i inventory playbook.yml,结果是

PLAY [all] **********************************************************************

TASK [Gathering Facts] **********************************************************
ok: [server1]
ok: [server2]

TASK [base : command] ***********************************************************
skipping: [server2]
changed: [server1]

TASK [app : command] ************************************************************
skipping: [server2]
changed: [server1]

TASK [base : command] ***********************************************************
changed: [server2]

TASK [db : command] *************************************************************
skipping: [server1]
changed: [server2]

RUNNING HANDLER [base : base handler] *******************************************
skipping: [server2]
changed: [server1]

RUNNING HANDLER [app : app handler] *********************************************
changed: [server1]

RUNNING HANDLER [db : db handler] ***********************************************
changed: [server2]

PLAY RECAP **********************************************************************
server1                    : ok=5    changed=4    unreachable=0    failed=0   
server2                    : ok=4    changed=3    unreachable=0    failed=0   

问题

我的问题是我希望两个服务器都执行基本处理程序。但显然,它在server2上被跳过了。如果将-v添加到a​​nsible命令中,则会得到skipping: [server2] => {"changed": false, "skip_reason": "Conditional result was False"}的无用注释。

让我感到困惑的是,基本角色似乎被两次包含,而每个服务器分别跳过了一个或另一个角色。

问题

  • 有什么办法可以确保正确触发处理程序?

编辑

  • 未触发处理程序还是该行为记录在某个地方的错误?

/ EDIT

次要问题

  • 有没有办法以某种方式声明依赖关系,而不会产生很多只由一台服务器拾取但所有其他服务器都忽略的包含,尽管其他服务器在其他时候会通过自己的依赖关系包含相同的角色?当我拥有更多服务器和角色时,这将导致很多跳过的任务。 (在我读过the docs on role inclusion后,我怀疑不是)
  • 还有其他方法来处理角色依赖性和处理程序吗?在阅读https://medium.com/@ibrahimgunduz34/parallel-playbook-execution-in-ansible-30799ccda4e0
  • 之后,我想到了此设置

侧注

我想避免使用the docs中描述的group_by技术,或者更一般地说,仅对服务器的正确子集执行其自己的剧本中的每个角色,因为我有很多服务器,并且我想通过使用strategy: free来加快剧本的运行速度。

0 个答案:

没有答案