首页 > 解决方案 > 在 Ansible 中动态扩展字典变量

问题描述

我正在尝试统一我安装软件包的方式,我有以下

vars/main.yml:
---
packages:
  system:
    common:
      - crudini
      - dump
      - duplicity
      - git
      - mdadm
      - irssi
      - lynx
      - postfix
      - powerline
      - rsync
      - tmux
      - vim
    Debian:
      - ntp
    Fedora:
      - langpacks-en
      - langpacks-nl
      - livecd-tools
      - rktime
      - tmux-powerline
      - tuned
      - vim-powerline

以及以下任务:

- name: install ansible dependencies
  package: name={{ item }} state=present
  with_flattened:
    - "{{ packages.system.common }}"
    - "{{ packages.system.Fedora }}"
    - "{{ vars['packages.system.' + ansible_distribution] }}"
  when: ansible_distribution == "Fedora"
  tags:
    install_custom2

这会导致以下错误:

TASK [common : install ansible dependencies] *******************************************************************************************
fatal: [host]: FAILED! => {"msg": "'dict object' has no attribute u'packages.system.Fedora'"}

请注意,"{{ packages.system.Fedora }}" 工作正常但"{{ vars['packages.system.' + ansible_distribution] }}"失败(也扩展packages.system.Fedora为)。它看起来像一个类型错误。当我将 vars/main.yml 中的包名称组织为单独的列表时,它确实有效。但我想创建这个字典结构,因为它很好地组织了变量。有没有办法像列表变量一样动态扩展字典变量?

标签: dictionaryansibleexpand

解决方案


明白了,它适用于:"{{ packages.system[ansible_distribution] }}"


推荐阅读