在 include_role 中检测到更改时通知处理程序或注册 ansible 变量?

Van*_*las 7 variables roles include ansible

经过大量搜索,我得出的结论是 ansible(我使用最新的稳定版 v2.5.3)很可能不支持从include_roleandimport_role语句注册变量或通知。

还有一个类似的问题在这里,并在其中一个答案的建议是:Each individual task within your include file can register variables, and you can reference those variables elsewhere

但是,如果我遵循这个建议,那么我需要在我包含的所有角色中添加额外的不必要的代码,只是因为我可能需要在特殊服务器中的解决方法。事情很快就会失控并变得混乱,尤其是在嵌套角色包含的情况下(即当包含的角色包含更多包含的角色时)。此外,如果我使用 ansible-galaxy 的角色,我会想坚持上游版本(将角色视为外部库),这意味着理想情况下我不想更改角色的代码,因为它听起来不太直观必须维护必须使用的所有角色的分支(否则外部角色/库几乎失去意义)。

那么,当一个人想要重用来自外部角色的代码时,针对此类问题的建议解决方案是什么,并根据被调用角色是否发生任何更改来做某事?就我如何实现 ansible playbook 逻辑而言,我在这里认为完全错误吗?

一下我正在尝试做的以下具体示例

我有想要在较小角色中重用的拆分任务。在我的common角色中,我有一add-file.yml组如下所示的任务 ( roles/common/tasks/add-file.yml):

- name: Copying file "{{ file.src }}" to "{{ file.dest }}"
  copy:
    src: "{{ file.src }}"
    dest: "{{ file.dest }}"
    owner: "{{ file.owner | default(ansible_user_id) }}"
    group: "{{ file.group | default(ansible_user_id) }}"
    mode: "{{ file.mode | default('preserve') }}"
  when:
    file.state is not defined or file.state != 'absent'

- name : Ensuring file "{{ file.dest }}" is absent
  file:
    path: "{{ file.dest }}"
    state: "{{ file.state }}"
  when:
    - file.state is defined
    - file.state == 'absent'
Run Code Online (Sandbox Code Playgroud)

这基本上是支持state: absent文件复制的通用自定义任务,直到此错误得到修复。

然后在另一个角色(我们称之为setup-XY)中,我在文件中执行此操作roles/setup-XY/tasks/main.yml

- name: Copying X-file
  import_role:
    name: common
    tasks_from: add-file.yml
  vars:
    file:
      state: present
      src: X-file
      dest: /home/user/X-file
      mode: '0640'

- name: Ensuring Yline in Z-file
  lineinfile:
    dest: /etc/default/Z-file
    regexp: '^Yline'
    line: 'Yline=123'
Run Code Online (Sandbox Code Playgroud)

然后在第三个角色(让我们称之为z-script)我想要在文件中这样的东西roles/z-script/tasks/main.yml

- name: Setup-XY
  include_role:
    name: setup-XY
  register: setupxy

- name: Run Z script if setupXY changed
  shell: /bin/z-script
  when: setupxy.changed
Run Code Online (Sandbox Code Playgroud)

不幸的是,上述内容不起作用,因为该register: setupxy行注册了一个setupxy始终返回的变量"changed": false。如果我使用import_role而不是include_role,则该变量根本没有注册(保持未定义)。

请注意,在z-script角色中,我想/bin/z-script在角色中检测到任何更改时运行shell 命令setup-XY,即如果X-fileZ-file已更改,实际上我可能在setup-XY角色中执行更多任务。

此外,请注意,z-scriptsetup-XY角色无关(例如,z-script唯一需要在特定有问题的服务器中运行),因此z-script理想情况下执行的代码不应与setup-XY角色一起交付(并污染)。setup-XY在这种情况下,将视为外部/上游角色。

sor*_*rin 0

你不可以做这个。您应该了解角色就像其他语言中的函数。你不能依赖内部发生的事情。

这就是为什么处理程序只能在当前上下文、角色或剧本中使用,并且不能交叉调用它们。