首页 > 解决方案 > Ansible:将事实变量与字典变量一起使用

问题描述

我想在几个 linux 服务器上安装 Apache。Apache 软件包在 RedHat 或 Debian 操作系统(apache2 与 httpd)上的名称不同:这是一种使用 ansible 事实变量(“ansible_os_family”)作为字典变量键的方法吗?

类似的东西(但这不起作用):

---
- name: playbook1
  hosts: all
  become: yes
  vars:
    apache_packages: {
      "RedHat": "httpd",
      "Debian": "apache2"
      }
  tasks:
    - name: Install Apache server
      package:
        name:  "{{ apache_packages['{{ ansible_os_family }}']  }}"
        state: present
...

标签: ansibleansible-facts

解决方案


将Jinja 分隔符嵌套在另一个 Jinja 分隔符中绝不是一个好主意。

另一个规则是“胡须不堆叠”。我们经常看到这样的:

{{ somevar_{{other_var}} }}

如果您需要使用动态变量,请根据需要使用以下内容:

{{ hostvars[inventory_hostname]['somevar_' + other_var] }}

对于“非主机变量”,您可以使用vars 查找插件:

{{ lookup('vars', 'somevar_' + other_var) }}

来源:https ://docs.ansible.com/ansible/latest/reference_appendices/faq.html#when-should-i-use-also-how-to-interpolate-variables-or-dynamic-variable-names

如果你没有用引号括起来,它将被假定为一个变量,所以在这种情况下,这很简单:

name:  "{{ apache_packages[ansible_os_family] }}"

推荐阅读