You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ansible中使用firewalld模块设置默认服务端口/协议?

解决Ansible firewalld模块默认端口/协议设置问题

问题场景

你在Ansible任务中尝试给firewalld模块设置默认端口和协议,原任务代码如下:

# Add port in firewalld
- name: Open port in firewalld
  firewalld:
    port: "{{ foo_setted_port_var | default (8080/tcp) }}"
    state: enabled
    permanent: yes
    immediate: yes
    zone: "{{ setted_firewalldzone_var | default (public) }}"

遇到两种错误:

  • 使用port: "{{ foo_setted_port_var | default (8080/tcp) }}"时,报错:The error was: 'tcp' is undefined
  • 使用port: "{{ foo_setted_port_var | default (8080) }}"时,报错:improper port format (missing protocol?)

手动在foo_setted_port_var中指定8080/tcp可正常运行,但希望直接在任务代码中设置默认值。

解决方案

问题核心是Jinja2模板的解析逻辑:

  • 不加引号的8080/tcp会被Jinja2识别为除法运算,试图查找名为tcp的变量,因此报错tcp未定义;
  • 仅指定8080不符合firewalld模块的端口格式要求,必须包含协议(tcp/udp)。

只需给默认值加上单引号或双引号,将其标记为字符串即可:

修正后的任务代码

# Add port in firewalld
- name: Open port in firewalld
  firewalld:
    port: "{{ foo_setted_port_var | default('8080/tcp') }}"
    state: enabled
    permanent: yes
    immediate: yes
    zone: "{{ setted_firewalldzone_var | default('public') }}"

这样Jinja2会把'8080/tcp'当作完整的字符串传递给firewalld模块,既避免了变量解析错误,又满足了端口格式要求。

内容的提问来源于stack exchange,提问作者Alexandre

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 14:57:27