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

Ansible拆分分隔字符串为n个变量 动态配置server.xml ACL规则

Ansible 动态配置Tomcat ACL规则方案

拆分|分隔的IP字符串

不需要手动拆成ip1、ip2这类独立零散变量,直接用Ansible内置的split过滤器就能把分隔字符串转成IP列表,后续调用灵活度更高。
假设你存储原始|分隔IP串的变量名为cluster_ip_raw(示例值:10.0.0.1|10.0.0.2|10.0.0.3),拆分逻辑如下:

- name: 拆分集群IP为列表
  ansible.builtin.set_fact:
    # 如果原始IP串可能带多余空格,可追加trim处理避免规则失效
    cluster_ip_list: "{{ cluster_ip_raw.split('|') | map('trim') | list }}"

拆分完成后,cluster_ip_list是按顺序存储所有集群IP的列表,需要调用单个IP时直接通过下标取值即可,比如第一个IP为{{ cluster_ip_list[0] }},无需单独定义固定命名的单IP变量。

适配任意数量IP的ACL配置逻辑

原有配置中allow属性本身就是|拼接的IP格式,直接用join过滤器把拆分好的IP列表重新按|拼接即可,自动适配2台及以上任意数量的服务器场景,不需要根据节点数调整代码。
修改后的完整任务代码:

- name: 拆分集群IP为列表
  ansible.builtin.set_fact:
    cluster_ip_list: "{{ cluster_ip_raw.split('|') | map('trim') | list }}"

- name: 写入RemoteAddrValve ACL配置
  ansible.builtin.lineinfile:
    path: /server.xml
    insertafter: '<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b"/>\n'
    # 若存在旧配置可增加regexp参数实现替换而非重复插入:regexp: '.*RemoteAddrValve.*'
    line: '<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="{{ cluster_ip_list | join('|') }}" />'

内容的提问来源于stack exchange,提问作者János

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 02:03:49