如何在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
相关产品推荐
相关产品推荐

