Ansible如何在不同角色中多次使用任务?

Ansible how to use tasks multiple times in different roles?

我有 3 个任务将从数据库中获取 版本 ,我在这些角色中有 3 个角色,很少有任务依赖于 版本 .

我不能在这里使用变量,因为值是动态的,我不能设置事实,因为我应该能够 运行 单独的角色,并且每个角色只能执行一些带有标签的任务。

下面是我的例子。

角色 1:-

我需要运行多次的任务(示例):-

- name: get version
  block:
    - command: "mongo get_version.js" 
      register: op
    - name: filter version number from output 
      shell: "echo {{ present_version.stdout }}| grep 'version'"
      register: present_version
  tags: role1_db_tag

- name: do something

- name: do something when a version is something
  when: present_version == "something"
  tags: role1_db_tag

角色 2:

- name: get version
  block:
    - command: "mongo get_version.js" 
      register: op
    - name: filter version number from output 
      shell: "echo {{ present_version.stdout }}| grep 'version'"
      register: present_version
  tags: role2_db_tag

- name: do some other things

- name: do something else when a version is something
  when: present_version == "something"
  tags: role2_db_tag

现在我在每个角色中 运行 执行 3 次获取版本任务。 有没有什么方法可以像 handlers 一样为这些重复性任务命名并在需要时调用?

期待:-

角色 2:

- name: fetch version
  function: get_version 
  register: present_version 
  tags: role1_db_tag

- name: do something else when a version is something
  when: present_version == "something"
  tags: role2_db_tag

PS:有没有比include_*或import_*更好的方法。

正如您已经推测的那样,通常处理此问题的方法是将 get version 任务移至单独的角色,然后使用例如将其包含在依赖角色中import_role:

- import_role:
    name: get_version

如果你有一些小的共享任务,你可以创建一个有多个任务文件的“图书馆”角色:

- import_role:
    name: library
    tasks_from: get_version

有关 include_roleimport_role 的讨论,请参阅“Using Roles”。


您可以通过向您的角色添加依赖项来获得类似的行为 反而。例如,在 Role1 中,创建一个文件 meta/main.yml 以下内容:

dependencies:
  - get_version

这将自动 运行 get_version 角色之前 role1 任何 你 运行 role1.

有关详细信息,请参阅“Using Role Dependencies”。