Ansible:了解 Playbook、Role、Inventory 等概念

发布于:2025-05-01 ⋅ 阅读:(20) ⋅ 点赞:(0)

Ansible 是一个自动化运维工具,用简单的 YAML 文件(Playbook)来描述任务。以下是 Kubespray 中涉及的 Ansible 核心概念详解:


1. Inventory(清单)

作用:定义你要管理的机器(节点)和分组。
Kubespray 中的例子
文件路径:inventory/sample/inventory.ini

[all]
node1 ansible_host=192.168.1.1 ip=192.168.1.1
node2 ansible_host=192.168.1.2 ip=192.168.1.2

[kube_control_plane]
node1

[kube_node]
node1
node2

[etcd]
node1

[calico_rr]

[k8s_cluster:children]
kube_control_plane
kube_node
  • [all]:所有节点列表,包含 IP 和主机名。

  • [kube_control_plane]:Kubernetes Master 节点组。

  • 分组嵌套[k8s_cluster:children] 表示合并其他组的节点。


2. Playbook(剧本)

作用:定义在哪些节点上执行哪些任务(Tasks)。
Kubespray 主 Playbookcluster.yml

- hosts: kube_node  # 目标节点组(来自 Inventory)
  roles:
    - { role: container-engine, tags: container-engine }  # 调用 Role
    - { role: kubernetes/node, tags: node }

- hosts: kube_control_plane
  roles:
    - { role: kubernetes/control-plane, tags: master }
  • hosts:指定对哪些节点组生效(如 kube_node)。

  • roles:调用具体功能模块(Role)。

  • tags:允许运行时选择性执行(如 --tags=node 只部署 Node)。


3. Role(角色)

作用:将功能模块化(例如安装 Docker、部署 etcd)。
Kubespray 的 Role 结构(以 roles/etcd 为例):

roles/etcd/
├── tasks/       # 任务定义
│   └── main.yml  # 主任务文件
├── defaults/    # 默认变量
│   └── main.yml  # 如 `etcd_version`
├── templates/   # 配置文件模板
│   └── etcd.conf.j2  # Jinja2 模板
└── handlers/    # 触发动作(如重启服务)
    └── main.yml
示例任务文件roles/etcd/tasks/main.yml
- name: Install etcd package
  apt: 
    name: etcd
    version: "{{ etcd_version }}"
  when: ansible_os_family == "Debian"

- name: Configure etcd
  template:
    src: etcd.conf.j2
    dest: /etc/etcd/etcd.conf
  notify: restart etcd  # 触发 handlers
  • apt 模块:安装指定版本的 etcd。

  • template 模块:用 Jinja2 模板生成配置文件。

  • notify:任务完成后触发 handler(如重启服务)。


4. 变量(Variables)

作用:动态配置参数,优先级从低到高:

  1. Role 默认值roles/xxx/defaults/main.yml

    # roles/etcd/defaults/main.yml
    etcd_version: "3.5.0"
  2. Inventory 变量inventory/mycluster/group_vars/all.yml

    # 覆盖默认值
    etcd_version: "3.5.4"
  3. 命令行覆盖

    ansible-playbook -i inventory.ini cluster.yml -e "etcd_version=3.5.6"

5. 关键概念对比

概念 作用 Kubespray 示例
Inventory 定义节点和分组 inventory.ini 中的 [kube_node]
Playbook 编排任务流程 cluster.yml 调用多个 Role
Role 模块化功能(如安装 Docker) roles/container-engine/
Task 具体操作(如执行命令) apt 安装软件包
Handler 由 Task 触发的后续动作(如重启) handlers/main.yml 重启服务

6. 快速实践建议

  1. 手动执行一个 Task

    ansible -i inventory.ini kube_node -m apt -a "name=docker-ce state=present"
    • -m:指定模块(apt)。

    • -a:模块参数(安装 Docker)。

  2. 调试 Playbook

    # 只运行 "container-engine" 相关的任务
    ansible-playbook -i inventory.ini cluster.yml --tags=container-engine -vvv
    • -vvv:输出详细日志。


常见问题

Q:Role 和 Playbook 的区别?
  • Playbook 是“总剧本”,定义从哪个节点开始执行哪些 Role。

  • Role 是“功能模块”,封装具体的安装/配置逻辑。

Q:如何自定义 Kubespray 的配置?
  1. 复制默认 Inventory:

    cp -r inventory/sample inventory/mycluster
  2. 修改 inventory/mycluster/group_vars/k8s-cluster.yml

    kube_version: v1.28.0
    docker_version: 20.10.0

掌握这些概念后,再读 Kubespray 代码会更清晰。


网站公告

今日签到

点亮在社区的每一天
去签到