如何使用ansible将变量从一个角色下游传递到其他依赖角色?

时间:2016-03-04 14:25:47

标签: ansible ansible-playbook

我有一个通用的webserver角色正在使用另一个nginx角色来生成新的vserver。

webserver/meta/main.yml看起来像:

allow_duplicates: yes
dependencies:
  - role: nginx
    name: api vserver
    frontend_port: "{{ frontend_port }}"
    domain: "{{ api_domain }}"
    backend_host: 127.0.0.1
  - role: nginx
    name: portal vserver
    domain: "{{ portal_domain }}"
    backend_host: 127.0.0.1

问题是这些变量应该在webserver-role/vars/(test|staging).yml

中定义

似乎Ansible将在加载变量之前尝试加载依赖项。

我该如何解决这个问题?我不想将任何配置细节放​​在低级角色中。

另外,我不想将配置放在剧本本身,因为这些配置是在多个剧本之间共享的。

2 个答案:

答案 0 :(得分:7)

此方案适用于Ansible 2.2 依赖角色的变量在主角色的变量文件中指定:

./角色/基于role1 /任务/ main.yml:

- debug: msg="{{ role_param }}"

./角色/基于role2 /间/ main.yml:

allow_duplicates: yes
dependencies:
  - role: role1
    role_param: "{{ param1 }}"
  - role: role1
    role_param: "{{ param2 }}"

./角色/基于role2 /任务/ main.yml:

- debug: msg=role2

./角色/基于role2 /瓦尔/ main.yml:

param1: hello1
param2: hello2

结果:

PLAY [localhost] ***************************************************************

TASK [role1 : debug] ***********************************************************
ok: [localhost] => {
    "msg": "hello1"
}

TASK [role1 : debug] ***********************************************************
ok: [localhost] => {
    "msg": "hello2"
}

TASK [role2 : debug] ***********************************************************
ok: [localhost] => {
    "msg": "role2"
}

答案 1 :(得分:0)

可以提供“变量”:

    # roles/myapp/meta/main.yml
---
dependencies:
  - role: common
    vars:
      some_parameter: 3
  - role: apache
    vars:
      apache_port: 80
  - role: postgres
    vars:
      dbname: blarg
      other_parameter: 12

请参考Using role dependencies, here