如何在 Ansible 角色中包含很多 var

Posted

技术标签:

【中文标题】如何在 Ansible 角色中包含很多 var【英文标题】:How do I include a lot of vars into Ansible roles 【发布时间】:2014-12-31 07:37:55 【问题描述】:

考虑这样的播放设置:

- 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']

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

在一个完美的世界里,我可以......

  roles:
    - My.Role
      include: ../../varsA.yml

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

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

文件:group_vars/my-host.yml

apps:
  name: 'something'
  someList:
    - item
    ...
  someDict:
    item: item
    itemsList: 
      - item
      ...
  name: 'somethingElse'
  someList:
    - item
    ...
  someDict:
    item: item
    itemsList: 
      - item
      ...

文件:playbooks/my-play.yml

  ...
  roles:
    - some.ThirdpartyRole
    - My.Role

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

with_subelements:
  - myDict
  - subList

我无法检查mydict.subList 是否存在,而是需要在各处定义空变量。

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

【问题讨论】:

【参考方案1】:

我想出了一个解决方案,它不一定是“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"

My.role/tasks/main.yml

- name: Load in project specific vars
  include_vars: " vars_file "
  ...

Include vars on ansible

我在 Ansibles Github 上看到最近的 issue 可能会影响此解决方案,我将看看是否仍然如此,一旦我尝试过,我会尝试添加到我的答案中。

【讨论】:

以上是关于如何在 Ansible 角色中包含很多 var的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ansible uri 模块的 json 字符串中使用变量?

Ansible 2.8 角色 - 使用 vars/main 目录

在ansible中如何从另一个变量初始化变量?

如何在AMP分析中包含自定义变量?

如何在 Mac OS 的发布版本中包含 Qt 库?

如何在android studio项目中包含共享库?