python - 如何将大量变量包含到 Ansible 角色中

标签 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'}]}

这个设置很好,一切都按预期工作(虽然我真的不喜欢数据结构)。问题是 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 中定义的字典中获取所有变量,并且角色中的每个任务都使用 with_items: myDict ,这使得子列表(除其他外)有点像噩梦,例如:
with_subelements:
  - myDict
  - subList

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

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

最佳答案

我想出了一个解决方案,它不一定是“Ansible”方式,但直到 包括 指令允许用于角色(就像用于任务一样),这似乎是最干净的方式。

剧本.yml

- name: My Play
  hosts: my-host
  roles:
    - {"role": My.role, "vars_file": "../../vars/projectA.yml"}
    - {"role": My.role, "vars_file": "../../vars/projectB.yml"}

我的角色/任务/main.yml
- name: Load in project specific vars
  include_vars: "{{ vars_file }}"
  ...

Include vars on ansible

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

关于python - 如何将大量变量包含到 Ansible 角色中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26734719/

相关文章:

git - Azure DevOps - 条件/表达式允许我跳过阶段内的任务

python - SSLError ("bad handshake: Error([(' SSL routines', 'tls_process_ske_dhe' , Python 中的 'dh key too small'

python - 使用阈值在层次聚类中自动化聚类

mysql - 使用变量名称创建数据库表

variables - 如何通过连接两个字符串来创建动态变量名

ruby - 为什么我得到 '` parse' : (<unknown>): mapping values are not allowed in this context' in YAML file in Ruby

Java YAML 配置到自定义 HashMap

python - 使用 python 的加密模块反序列化公钥

python - 如何将 Google Chrome 扩展与 Selenium 结合使用?

c - 返回main函数时double变为0