Ansible 如何获取依赖角色中的角色名称

问题描述 投票:0回答:2

我有一个角色爱丽丝,它取决于角色鲍勃:

文件:roles/alice/meta/main.yml

dependencies:
- role: bob

在角色 bob 中,我需要 alice 的角色名称,但是当我在下面使用 {{ role_name }} 时,var_rolename 的值为“bob”而不是“alice”。如何在我的用例中检索值“alice”?

dependencies:
- role: role_b
  vars: 
      var_rolename: "{{ role_name }}"
ansible
2个回答
0
投票

给出用于测试的树

shell> tree .
.
├── ansible.cfg
├── hosts
├── pb.yml
└── roles
    ├── alice
    │   ├── meta
    │   │   └── main.yml
    │   └── tasks
    │       └── main.yml
    ├── bob
    │   └── tasks
    │       └── main.yml
    └── cloe
        ├── meta
        │   └── main.yml
        └── tasks
            └── main.yml

9 directories, 8 files

两个角色alicecloe取决于角色bob

shell> cat roles/alice/meta/main.yml 
dependencies:
  - role: bob
shell> cat roles/cloe/meta/main.yml 
dependencies:
  - role: bob

为所有角色创建相同的任务并显示特殊变量:

  • ansible_role_name:完全限定的集合角色名称
  • ansible_play_role_names:当前导入到当前戏剧中的角色名称。此列表不包含通过依赖项隐式包含的角色名称。
  • ansible_role_names:当前导入到当前戏剧中的角色的名称,或作为导入到当前戏剧中的角色的依赖项引用的角色。
  • ansible_parent_role_paths:当通过 include_role 或 import_role 操作执行当前角色时
shell> cat roles/*/tasks/main.yml 
- debug:
    msg: |
      ansible_role_name: {{ ansible_role_name }}
      ansible_play_role_names: {{ ansible_play_role_names }}
      ansible_role_names: {{ ansible_role_names }}
      ansible_parent_role_names: {{ ansible_parent_role_names|d([]) }}

创建具有单一角色的剧本 alice

shell> cat pb.yml
- hosts: all
  roles:
    - alice

给出(删节)

TASK [bob : debug] ****************************************************************************
ok: [localhost] => 
  msg: |-
    ansible_role_name: bob
    ansible_play_role_names: ['alice']
    ansible_role_names: ['bob', 'alice']
    ansible_parent_role_names: []

TASK [alice : debug] **************************************************************************
ok: [localhost] => 
  msg: |-
    ansible_role_name: alice
    ansible_play_role_names: ['alice']
    ansible_role_names: ['bob', 'alice']
    ansible_parent_role_names: []

列表中只有一个角色 ansible_play_role_names 可以依赖于角色 bob

使用 alicecloe

创建剧本
shell> cat pb.yml
- hosts: all
  roles:
    - alice
    - cloe

给出(删节)

TASK [bob : debug] ****************************************************************************
ok: [localhost] => 
  msg: |-
    ansible_role_name: bob
    ansible_play_role_names: ['alice', 'cloe']
    ansible_role_names: ['cloe', 'alice', 'bob']
    ansible_parent_role_names: []

TASK [alice : debug] **************************************************************************
ok: [localhost] => 
  msg: |-
    ansible_role_name: alice
    ansible_play_role_names: ['alice', 'cloe']
    ansible_role_names: ['cloe', 'alice', 'bob']
    ansible_parent_role_names: []

TASK [cloe : debug] ***************************************************************************
ok: [localhost] => 
  msg: |-
    ansible_role_name: cloe
    ansible_play_role_names: ['alice', 'cloe']
    ansible_role_names: ['cloe', 'alice', 'bob']
    ansible_parent_role_names: []

列表中有两个角色ansible_play_role_names可以依赖于角色bob。如果不阅读元文件,您将无法分辨它是哪一个。如果两个角色都依赖于角色 bob,那么这个问题就没有意义,因为角色 bob 只会运行一次。


0
投票

你不能,这不是 Ansible 的工作原理。让我们想象一下

alice
adam
角色都依赖于角色
bob
。然后
bob
将首先运行,但仅运行一次,它不会同时运行
alice
adam
。您可以在这里阅读更多相关信息https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_reuse_roles.html#using-role-dependency

角色依赖是先决条件,而不是真正的依赖。这些角色没有父/子关系。 Ansible 加载所有列出的角色,首先运行依赖项下列出的角色,然后运行列出它们的角色。播放对象是所有角色的父级,包括由依赖项列表调用的角色。

Ansible 将重复的角色依赖关系视为角色下列出的重复角色::Ansible 只执行一次角色依赖关系,即使定义了多次,除非角色上定义的参数、标签或 when 子句对于每个定义都不同。如果剧中的两个角色都将第三个角色列为依赖项,则 Ansible 仅运行该角色依赖项一次,除非您传递不同的参数、标签、when 子句,或在要多次运行的角色中使用allow_duplicates: true。

© www.soinside.com 2019 - 2024. All rights reserved.