使用 jinja 执行 Ansible 变量(获取第二个接口的第一个 IP)

使用 jinja 执行 Ansible 变量(获取第二个接口的第一个 IP)

我需要获取我的服务器上第二个接口的第一个 IP(在 jinja 变量内)。

---
- name: Playbook testing
  hosts: all
  become: true
  
  tasks:
  - name: Debug
    debug:
      msg:
      - "{{ hostvars[groups['masters'][0]]['ansible_host'] }}"
      - "{{ ansible_interfaces | difference(['lo',ansible_default_ipv4.alias]) | first }}"
      - "{% set sync_iface = ansible_interfaces | difference(['lo',ansible_default_ipv4.alias]) | first %}"

为了获取第二个接口,我使用了第二行调试代码。第三行是将此接口设置为变量,因为我在某处读到我可以使用以下命令获取 ip。但这不起作用。

      - vars['ansible_'~sync_iface].ipv4.address

也许只是我的语法错误,但我无法修复它。

答案1

假设上述示例表达式给出了预期的结果,这里是一个最小的剧本,具有正确的语法来声明可重用的变量。

---
- hosts: all
  
  vars:
    second_interface: "{{ ansible_interfaces | difference(['lo',ansible_default_ipv4.alias]) | first }}"

  tasks:
    - name: Display second interface details for server
      debug:
        msg: "{{ second_interface_ip }}"

还有其他选项可以声明变量。请参阅在哪里设置变量了解更多信息。

msg在任务中使用了 jinja2 表达式,debug因为你在问题中提到了它。同时,你可以将该任务替换为

    - name: Display second interface details for server
      debug:
        var: second_interface_ip

它给出的结果大致相同,并且在无法解析变量内容的情况下不会以错误结束(例如未定义的字典键、空结果difference...)

一旦定义了变量,你就可以在任何其他任务中使用它,包括在你将使用以下命令渲染的完整 jinja2 模板中template模块

相关内容