如何在Ansible Playbook中排除BDD节点,重置APP节点编号起始值
解决Ansible Playbook排除BDD节点并重新编号APP节点的问题
直接调整Playbook的变量定义和执行条件就能实现需求,以下是修改后的完整代码:
vars: # 过滤出所有非BDD的节点,生成APP专属节点列表 - app_nodes: "{{ ansible_play_hosts_all | reject('equalto', 'BDD') | list }}" # 基于APP节点列表计算当前节点的编号 - node_number: "{{ app_nodes.index(inventory_hostname) + 1 }}" - name: 设置Python解释器 block: - name: 指定Python3解释器 set_fact: ansible_python_interpreter: "/usr/bin/python3" - name: 配置Tomcat节点编号 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: - ansible_facts['distribution'] == 'Rocky' # 仅在非BDD节点执行该配置任务 - inventory_hostname != 'BDD'
关键修改说明:
app_nodes变量:通过reject('equalto', 'BDD')从当前Play执行的全量主机列表(ansible_play_hosts_all)中剔除BDD节点,得到仅包含APP1、APP2、APP3的列表。node_number变量:基于过滤后的APP节点列表计算当前主机的索引值再加1,这样APP1会排在列表首位,编号为1(对应node01),APP2、APP3依次递推。- 任务执行条件:新增
inventory_hostname != 'BDD',避免Tomcat配置任务在BDD节点上无效执行。
如果你的Inventory中APP节点已归属特定组(比如app_servers),也可以直接用组列表替代过滤逻辑,更简洁:
vars: - node_number: "{{ groups['app_servers'].index(inventory_hostname) + 1 }}"
这种情况下,只需确保Play的hosts字段指定为app_servers,即可省略when中的节点判断条件。
内容的提问来源于stack exchange,提问作者Kain Taozia
相关产品推荐
相关产品推荐

