有没有办法阻止处理程序运行?我试图添加标签并使用"--skip-tags"但它不起作用.
我可以添加下一个角色变量reload_service: true并使用它但我已经开始使用标签,它们非常适合重新运行部分角色.
处理程序通常用于重新启动服务,我希望在不更改角色变量的情况下运行此角色而不启动服务只是为了涵盖下一个案例.
我正在使用 ansible 2.1.2.0
测试用例:
mkdir -p test/role/handlers test/role/tasks
cd test
echo -ne '---\n  - command: "echo Test"\n    notify: restart\n' > role/tasks/main.yml
echo -ne '---\n- name: restart\n  command: "echo Handler"\n  tags: [handlers]\n' > role/handlers/main.yml
echo -ne '---\n- hosts: localhost\n  gather_facts: false\n  roles:\n    - role\n' > play.yml
ansible-playbook play.yml --skip-tags handlers
Ansible中目前没有变量可以让你测试在运行时指定了哪些标签.
正如您所发现的,处理程序无论分配的标记如何都会运行.文档没有说明这是一个错误还是预期的行为.
一些选项是:
向该任务添加另一个变量并使用它,因为处理程序仍然可以以'where:'子句为条件.
让处理程序包含另一个带有操作和标记的文件.该文件将始终包含在内,但标记会使操作成为条件.
在任务中有一个标记的操作,然后为处理程序设置一个局部变量.任务中的转换将允许标记仍在运行时使用.
以下是如何使用变量跳过处理程序的示例:
$ cat test.yaml
---
- hosts: localhost
  tasks:
  - copy:
      content: "{{ ansible_date_time.epoch }}" # This will always trigger the handler.
      dest: /tmp/debug
    notify:
      - debug
  handlers:
  - name: debug
    debug:
      msg: Hello from the debug handler!
    when:
    - skip_handlers | default("false") == "false"
正常使用会是这样的:
$ ansible-playbook test.yaml
并跳过处理程序:
$ ansible-playbook test.yaml -e skip_handlers=true