Ansible:如何针对不同环境控制Master节点的raspberrypi角色执行
问题描述
我有测试和生产两套Ansible主机清单,以及对应的K3s部署Playbook,需求是仅在生产环境的Master节点上执行raspberrypi角色,测试环境的Master节点跳过该角色。
测试环境主机清单
# Contains the host mappings [master] local-machine ansible_host=192.168.0.201 host_alias=local-machine [node] n1.com ansible_host=192.168.0.202 host_alias=n1 n2.com ansible_host=192.168.0.203 host_alias=n2 #n3.com ansible_host=192.168.0.204 host_alias=n3 [k3s_cluster:children] master node [all:vars] ansible_python_interpreter=/usr/bin/python3
生产环境主机清单
# Contains the host mappings [master] m1.com ansible_host=192.168.0.201 host_alias=m1 [node] n1.com ansible_host=192.168.0.202 host_alias=n1 n2.com ansible_host=192.168.0.203 host_alias=n2 #n3.com ansible_host=192.168.0.104 host_alias=n3 [k3s_cluster:children] master node [all:vars] ansible_python_interpreter=/usr/bin/python3
现有Playbook
--- # K3s installation and set up - name: "K3S SETUP: K3s download, install and setup" hosts: k3s_cluster gather_facts: yes become: yes roles: - {role: prereq, tags: ['host', 'k3s']} - {role: download, tags: ['host', 'k3s']} - {role: raspberrypi, tags: ['host', 'k3s']} - hosts: master become: yes roles: - {role: k3s/master, tags: ['k3s', 'master']} - hosts: node become: yes roles: - {role: k3s/node, tags: ['k3s', 'node']}
实现方案
核心思路是通过环境变量标记主机所属环境,再给raspberrypi角色添加执行条件,以下是两种可行方式:
方式一:修改主机清单添加环境标识
1. 更新主机清单
分别在测试、生产清单的[all:vars]段添加环境标记变量:
- 测试环境清单新增:
env=test - 生产环境清单新增:
env=prod
修改后的测试环境清单示例:
[all:vars] ansible_python_interpreter=/usr/bin/python3 env=test
修改后的生产环境清单示例:
[all:vars] ansible_python_interpreter=/usr/bin/python3 env=prod
2. 调整Playbook的角色执行条件
在raspberrypi角色定义中添加when条件,限制仅Master节点且环境为生产时执行:
--- # K3s installation and set up - name: "K3S SETUP: K3s download, install and setup" hosts: k3s_cluster gather_facts: yes become: yes roles: - {role: prereq, tags: ['host', 'k3s']} - {role: download, tags: ['host', 'k3s']} - {role: raspberrypi, tags: ['host', 'k3s'], when: "inventory_hostname in groups['master'] and env == 'prod'"} - hosts: master become: yes roles: - {role: k3s/master, tags: ['k3s', 'master']} - hosts: node become: yes roles: - {role: k3s/node, tags: ['k3s', 'node']}
方式二:执行Playbook时传递环境变量(无需修改清单)
如果不想修改主机清单,可以在执行Playbook时通过-e参数临时传递环境变量:
- 测试环境执行命令:
ansible-playbook -i test_inventory.yml your_playbook.yml -e "env=test"
- 生产环境执行命令:
ansible-playbook -i prod_inventory.yml your_playbook.yml -e "env=prod"
Playbook的角色条件和方式一完全一致,无需额外调整。
内容的提问来源于stack exchange,提问作者joesan
相关产品推荐
相关产品推荐

