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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 23:40:34