我有一个角色爱丽丝,它取决于角色鲍勃:
文件: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 }}"
给出用于测试的树
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
两个角色alice和cloe取决于角色bob
shell> cat roles/alice/meta/main.yml
dependencies:
- role: bob
shell> cat roles/cloe/meta/main.yml
dependencies:
- role: bob
为所有角色创建相同的任务并显示特殊变量:
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。
使用 alice 和 cloe
创建剧本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 只会运行一次。
你不能,这不是 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。