使用Ansible部署K8s集群MetalLB时,如何动态修改Manifest文件?
用Ansible通过Manifest部署带自定义容忍度的MetalLB Speaker
你可以通过Ansible的k8s模块结合动态YAML解析修改的方式,实现类似Helm --values的自定义配置效果,无需在节点安装Helm或手动编辑YAML文件。具体实现步骤如下:
1. 定义核心变量
在Playbook或Inventory中定义MetalLB版本和需要给Speaker添加的容忍度规则:
# 变量示例 metalLB_version: "v0.13.12" speaker_tolerations: - key: "node-role.kubernetes.io/control-plane" operator: "Exists" effect: "NoSchedule" - key: "node-role.kubernetes.io/master" operator: "Exists" effect: "NoSchedule"
2. 编写Ansible任务
通过以下任务链完成Manifest拉取、修改和部署:
- name: 拉取MetalLB官方Native模式Manifest uri: url: "https://raw.githubusercontent.com/metallb/metallb/{{ metalLB_version }}/config/manifests/metallb-native.yaml" return_content: yes register: metallb_raw_manifest - name: 将Manifest内容解析为YAML对象列表 set_fact: metallb_manifest_list: "{{ metallb_raw_manifest.content | from_yaml_all | list }}" - name: 为Speaker Deployment添加自定义容忍度 set_fact: metallb_manifest_list: > {{ metallb_manifest_list | map('combine', {'spec': {'template': {'spec': {'tolerations': speaker_tolerations}}}} if item.kind == 'Deployment' and item.metadata.name == 'speaker' else item) | list }} - name: 应用修改后的MetalLB配置到集群 k8s: state: present definition: "{{ item }}" loop: "{{ metallb_manifest_list }}"
关键逻辑说明
- 用
uri模块直接拉取对应版本的官方Manifest,避免本地维护文件 - 通过
from_yaml_all将多文档YAML解析为对象列表,方便逐个修改资源 - 用
map和combine过滤出Speaker的Deployment资源,动态注入容忍度配置 - 最后用
k8s模块批量应用所有修改后的资源
前置依赖
确保控制节点已安装Kubernetes Ansible集合:
ansible-galaxy collection install kubernetes.core
内容的提问来源于stack exchange,提问作者Ricardo
相关产品推荐
相关产品推荐

