如何将保险库(保险柜变量)传递给角色本身具有多个相关角色的多个角色?

时间:2019-07-03 08:31:47

标签: ansible ansible-role ansible-vault

我正在运行ansible 2.7.10,并有一本剧本,其中我在不同剧本中“包含”不同的角色。 我所说的所有角色都有共同的从属角色。

我现在正处于一个阶段,我希望该剧本中的所有角色都可以读取Vault。

如果我将文件作为附加变量(-e @)传递,则此方法有效

- name: main playbook - play 1
  hosts: hosts1
  vars_files:
  - "<path_to_universal_vault>"
  tasks:
  - include_role:
      name: role1

- name: main playbook - play 2
  hosts: hosts2
  vars_files:
  - "<path_to_universal_vault>"
  tasks:
  - include_role:
      name: role2

role1和role2都有从属角色:

- role: role_a
- role: role_b
- role: role_c

我读过here,可以将保管库包含在“ vars”中作为主要角色。 有没有一种方法可以使从属角色从主要角色继承变量(在这种情况下为Vault)?

1 个答案:

答案 0 :(得分:0)

首先,我们应该从您的项目根目录创建一个./vault/main.yml,然后在其中添加秘密:

my_vault_secret: "It works!"

然后,选项A ,以包含主要角色的Vault变量,该变量将在Playbook运行时分配,创建./roles/role1/default/main.yml并添加引用秘密的变量:

my_vault_var: "{{ my_vault_secret }}"

然后在my_vault_varrole_arole_b中使用role_c

或者,选项B ,将./vault/main.yml保留为所有机密,包括role_arole_brole_c,但不要使用default / main.yml,而是将文件库文件直接包含在您用来执行role1role2中的任务的剧本中:

- hosts: localhost
  connection: local

  vars_files:
    - "vault/main.yml"

  roles:
    - role1
    - role2
PLAY [localhost] *******************************************************************************************************************************************************************************************

TASK [role_a : debug] ****************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "It works!"
}

项目结构如下所示,defaults仅对于选项A是必需的:

my_ansible_repo
|-- group_vars
    |-- main.yml
|-- vault
    |-- main.yml
|-- roles
    |-- role1
        |-- defaults
            |-- main.yml
        |-- tasks
            |-- main.yml
        |-- meta  
            |-- main.yml
    |-- role_a
        |-- tasks
            |-- main.yml
|-- my_playbook.yml

有关官方文档here中的Ansible默认变量,以及有关将变量文件与剧本一起使用的here的更多信息。