如何在Ansible角色中包含大量变量

far*_*dav 5 python variables yaml roles ansible

考虑像这样的游戏设置:

- name: Provision the stage platform
  hosts: my-stage-host
  vars_files:
    - ../../env_vars/base.yml
    - ../../env_vars/stage.yml
  roles:
    - {role: 'some.ThirdpartyRole'}
    - {role: 'My.Role', name: 'app1', somevar: 'var2', dict: {'var1': 'var2'}, list: [{'var1': 'var2'}]}
    - {role: 'My.Role', name: 'app2', somevar: 'var2', dict: {'var1': 'var2'}, list: [{'var1': 'var2'}]}
Run Code Online (Sandbox Code Playgroud)

这个设置很好,一切都按预期工作(虽然我真的不喜欢数据结构)..问题是My.Role有很多角色实例特定的变量,列表和dicts等,遗憾的是无法设置defaults/main.yml(因为它们特定于当前角色实例),并且因为我希望能够在一台服务器上多次使用此角色,所以我需要隔离变量.

在一个完美的世界里,我将能够......

  roles:
    - My.Role
      include: ../../varsA.yml
Run Code Online (Sandbox Code Playgroud)

就像任务一样...但是从我到目前为止在文档和论坛中读到的内容来看,这是不可能的......

目前,我确实让我的角色使用以下不理想的设置:

文件:group_vars/my-host.yml

apps:
  name: 'something'
  someList:
    - item
    ...
  someDict:
    item: item
    itemsList: 
      - item
      ...
  name: 'somethingElse'
  someList:
    - item
    ...
  someDict:
    item: item
    itemsList: 
      - item
      ...
Run Code Online (Sandbox Code Playgroud)

文件:playbooks/my-play.yml

  ...
  roles:
    - some.ThirdpartyRole
    - My.Role
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它从我的group_vars中定义的dict中获取所有变量,并且角色中的每个任务都使用with_items: myDict,这使得子列表(以及其他内容)有点像噩梦,例如:

with_subelements:
  - myDict
  - subList
Run Code Online (Sandbox Code Playgroud)

我无法检查是否存在mydict.subList,我需要在任何地方定义空的变量.

我希望我已经正确地解释了自己,我想知道是否有人有任何经验,他们需要在一个角色中使用很多变量,他们需要在游戏中多次使用,或者在角色/ var布局上使用任何其他指针.

far*_*dav 6

我提出了一个解决方案,它不一定是"Ansible"方式,但是直到允许角色的include指令(就像任务一样),这似乎是最干净的方式.

Playbook.yml

- name: My Play
  hosts: my-host
  roles:
    - {"role": My.role, "vars_file": "../../vars/projectA.yml"}
    - {"role": My.role, "vars_file": "../../vars/projectB.yml"}
Run Code Online (Sandbox Code Playgroud)

My.role /任务/ main.yml

- name: Load in project specific vars
  include_vars: "{{ vars_file }}"
  ...
Run Code Online (Sandbox Code Playgroud)

包括对ansible的变量

我在Ansibles Github上看到了一个可能会影响这个解决方案的最新问题,我将会看看是否仍然如此,我试试并尝试添加我的答案.