如何通过Ansible为各节点Tomcat的jvmroute设置递增编号node0x?
问题描述
我尝试为Tomcat的server.xml中的jvmroute定义为node0x格式的名称,编写了一个试图实现编号递增的Playbook,但无法达成server1对应node01、server2对应node02的按节点递增效果。原代码如下:
原任务文件(nommage_nodes.yml)
- name: set number node become: yes become_method: sudo become_user: "{{env}}adm" set_fact: node_number: 1 - name: Nommage des nodes become: yes become_method: sudo become_user: "{{env}}adm" community.general.xml: path: /data/{{env}}/web/tomcat/conf/server.xml xpath: /Server/Service/Engine attribute: jvmroute value: "node0{{node_number}}" backup: true when: load_balancing == "yes" - name: increment number node become: yes become_method: sudo become_user: "{{env}}adm" set_fact: node_number={{ node_number | int + 1 }}
原调用代码
- name: set count set_fact: node_number: 1 - name: Nommages des nodes tomcat include_tasks: nommage_nodes.yml with_items: "{{hostlb}}" when: not resultchrono.stat.exists
调整方案
原写法的核心问题是:每次循环调用任务时,都会重新初始化node_number为1,导致所有节点都被设置为node01。正确做法是利用循环索引生成编号,无需手动维护计数器。
步骤1:修改调用任务的循环逻辑
替换原调用代码,使用Ansible推荐的loop语法,并通过loop_control获取循环索引:
- name: Nommages des nodes tomcat include_tasks: nommage_nodes.yml loop: "{{ hostlb }}" loop_control: index_var: node_index when: not resultchrono.stat.exists
步骤2:简化任务文件(nommage_nodes.yml)
删除手动维护node_number的步骤,直接利用索引生成格式化编号:
- name: 设置Tomcat节点的jvmroute become: yes become_method: sudo become_user: "{{ env }}adm" community.general.xml: path: /data/{{ env }}/web/tomcat/conf/server.xml xpath: /Server/Service/Engine attribute: jvmroute value: "node{{ '%02d' | format(node_index | int + 1) }}" backup: true when: load_balancing == "yes"
关键说明
loop_control: index_var: node_index:获取循环的索引值(从0开始),加1后得到从1起始的节点编号。'%02d' | format(...):将数字格式化为两位数,自动补零,比如1转为01、2转为02,完美匹配node0x的格式要求。- 确保
hostlb列表中主机顺序与server1、server2的顺序一致,即可实现主机与编号的一一对应。
内容的提问来源于stack exchange,提问作者Kain Taozia
相关产品推荐
相关产品推荐

