首页 > 解决方案 > 访问变量中的变量

问题描述

我 90% 确定这不起作用,因为我做错了,但我不知道什么是“正确的方法”,我希望你能明白我的意思:我正在尝试访问 ipv4某个接口,我在我的主机文件中interface_lan = enp4s0,因为我需要它的角色,所以我想我可能只是用它来获得该接口的IP地址:

"{{hostvars[inventory_hostname]['ansible_{{interface_lan}']['ipv4.address']}}" 使用该命令,他正在寻找,"ansible_{{interface_lan}}"但我希望他寻找 "ansible_"{{interface_lan}}""并将其视为"{{interface_lan}}"变量,而不是字符串。我尽力解释,对不起,如果你不明白,你可以在不帮助我的情况下自由地享受你剩下的一天,我已经忽略这条线几天了。谢谢你 !

标签: ansibleansible-facts

解决方案


连接属性的名称并在索引中使用它。例如

- hosts: localhost
  gather_facts: false
  vars:
    interface_lan: enp4s0
    ansible_enp4s0:
      ipv4:
        address: 10.1.0.10
  tasks:
    - set_fact:
        ansible_enp4s0: "{{ ansible_enp4s0 }}"
    - debug:
        msg: "{{ hostvars[inventory_hostname][my_ifc]['ipv4']['address'] }}"
      vars:
        my_ifc: "{{ 'ansible_' ~ interface_lan }}"

给出(删节)

  msg: 10.1.0.10

注意:set_fact示例中需要将字典ansible_enp4s0放入hostvars.


hostvars使用查找插件vars可以实现变量的间接寻址。例如

- hosts: localhost
  vars:
    test_eth0: 10.1.0.10
    test_eth1: 10.1.0.11
  tasks:
    - debug:
        msg: "{{ item }}: {{ lookup('vars', 'test_' ~ item ) }}"
      loop:
        - eth0
        - eth1

给出(删节)

  msg: 'eth0: 10.1.0.10'
  msg: 'eth1: 10.1.0.11'

推荐阅读