Ansible:将事实变量与字典变量一起使用

Ansible:将事实变量与字典变量一起使用,ansible,ansible-facts,Ansible,Ansible Facts,我想在几个linux服务器上安装Apache。Apache包在RedHat或Debian操作系统(apache2 vs httpd)上没有相同的名称:这是使用ansible事实变量(“ansible_os_族”)作为字典变量键的一种方式吗 类似的(但这不起作用): 在另一个Jinja分隔符中嵌套Jinja分隔符是一个好主意 另一条规则是“胡子不叠”。我们经常看到: {{somevar{{other{u var}}} 如果出现以下情况,则上述情况不会如您预期的那样起作用: 您需要使用动态变量,并

我想在几个linux服务器上安装Apache。Apache包在RedHat或Debian操作系统(apache2 vs httpd)上没有相同的名称:这是使用ansible事实变量(“ansible_os_族”)作为字典变量键的一种方式吗

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


在另一个Jinja分隔符中嵌套Jinja分隔符是一个好主意

另一条规则是“胡子不叠”。我们经常看到:

{{somevar{{other{u var}}}
如果出现以下情况,则上述情况不会如您预期的那样起作用: 您需要使用动态变量,并根据需要使用以下内容:

{{hostvars[inventory\u hostname]['somevar\uu'+other\u var]}
对于“非主机变量”,您可以使用以下插件:

{{lookup('vars','somevar{other}}
资料来源:

如果不使用引号括住某个对象,则会假定它是一个变量,因此在本例中,这非常简单:

name:“{{apache_软件包[ansible_os_family]}”

试试这个:您将包定义为一个目录列表(基于os系列)


我会做一些像下面这样的事情来减少线

- hosts: localhost
  become: yes 
  tasks:
  - package:
      name: "{{ 'apache2' if ansible_os_family == 'Debian' else ('httpd' if ansible_os_family == 'RedHat') }}"
      state: present
- name: playbook1
  hosts: localhost
  become: yes
  vars:
    packages:
      debian:
        - apache2
      redhat:
        - httpd
  tasks:
    - name: Install Apache server
      package:
        name:  "{{ item }}"
        state: present
      loop: "{{ packages.get(ansible_os_family|lower) }}"
- hosts: localhost
  become: yes 
  tasks:
  - package:
      name: "{{ 'apache2' if ansible_os_family == 'Debian' else ('httpd' if ansible_os_family == 'RedHat') }}"
      state: present