访问变量中的变量

access a variable in a variable

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

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

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

- 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'