一、Ansible 详细拆解

1️⃣ 控制节点 & 被管理节点

角色

要求

控制节点

Python ≥ 3.8,安装 ansible

被管理节点

开启 SSH,Python ≥ 2.6 / 3.5

安装:


bash

bash

pip install ansible
ansible --version

2️⃣ Inventory 主机清单(超详细)

✅ 基础 INI 结构

ini

ini

[webservers]
192.168.80.11 ansible_user=root
192.168.80.12

[dbservers]
192.168.80.21
192.168.80.22

[all:vars]
ansible_port=22
ansible_ssh_private_key_file=/root/.ssh/id_rsa
✅ YAML 写法(推荐)

yaml

yaml

all:
  children:
    webservers:
      hosts:
        192.168.80.11:
          ansible_user: root
    dbservers:
      hosts:
        192.168.80.21:
✅ 常用内置变量

变量

作用

ansible_host

真实IP

ansible_port

SSH端口

ansible_user

登录用户

ansible_password

密码

ansible_become

是否提权

ansible_become_user

提权用户


3️⃣ Ad-Hoc 命令(速查表)


bash

bash

# 测试连通性
ansible all -m ping

# 执行命令
ansible webservers -m command -a "uptime"
ansible webservers -m shell -a "ps -ef | grep nginx"

# 文件复制
ansible webservers -m copy -a "src=nginx.conf dest=/etc/nginx/nginx.conf"

# 安装软件
ansible webservers -m yum -a "name=nginx state=present"

# 启停服务
ansible webservers -m service -a "name=nginx state=started enabled=yes"

# 创建用户
ansible all -m user -a "name=deploy uid=1001 state=present"

4️⃣ Playbook 结构与字段详解

✅ 最小可用 Playbook

yaml

yaml

- name: 安装 Nginx
  hosts: webservers
  become: yes
  tasks:
    - name: Install nginx
      yum:
        name: nginx
        state: present
✅ 核心字段说明

字段

作用

name

任务描述

hosts

目标主机

become

是否提权

vars

定义变量

tasks

任务列表

handlers

触发任务

notify

触发 handler


5️⃣ 变量(定义 + 引用)

✅ 定义方式

yaml

yaml

vars:
  pkg_name: nginx
  port: 80
✅ 引用方式

yaml

yaml

{{ pkg_name }}
{{ port }}
✅ 条件判断

yaml

yaml

when: ansible_distribution == "CentOS"
✅ 循环

yaml

yaml

loop:
  - nginx
  - mysql

6️⃣ Handlers 机制


yaml

yaml

tasks:
  - name: Copy config
    copy:
      src: nginx.conf
      dest: /etc/nginx/nginx.conf
    notify: Restart nginx

handlers:
  - name: Restart nginx
    service:
      name: nginx
      state: restarted

7️⃣ Template(Jinja2)

✅ 模板文件 nginx.conf.j2

jinja2

jinja2

server {
    listen {{ port }};
    server_name {{ ansible_hostname }};
}
✅ Playbook 中使用

yaml

yaml

- template:
    src: nginx.conf.j2
    dest: /etc/nginx/nginx.conf

8️⃣ Role 标准目录结构


纯文本

纯文本

roles/
└── nginx/
    ├── tasks/
    │   └── main.yml
    ├── handlers/
    │   └── main.yml
    ├── templates/
    ├── files/
    ├── vars/
    │   └── main.yml
    └── defaults/

调用:


yaml

yaml

- hosts: webservers
  roles:
    - nginx

二、Kubernetes 详细拆解

1️⃣ Master 组件(必背)

组件

作用

API Server

所有请求入口

Scheduler

Pod 调度

Controller Manager

维持期望状态

etcd

分布式存储


2️⃣ Node 组件

组件

作用

kubelet

管理 Pod

kube-proxy

网络转发

容器运行时

containerd / docker


3️⃣ 核心资源对象(最常用)

✅ Pod 最小示例

yaml

yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
    - name: nginx
      image: nginx:1.25
      ports:
        - containerPort: 80
✅ Deployment(生产必用)

yaml

yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.25
✅ Service(稳定访问)

yaml

yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  selector:
    app: nginx
  ports:
    - port: 80
      targetPort: 80

4️⃣ Pod 创建全流程(面试高频)


纯文本

纯文本

用户 kubectl apply
↓
API Server
↓
etcd 存储
↓
Controller 检测变化
↓
Scheduler 调度节点
↓
kubelet 拉镜像
↓
容器运行时启动容器

三、Ansible + Kubernetes 联动细节

1️⃣ Kubespray(生产级 K8s 部署)

  • 用 Ansible 部署 K8s

  • 支持 HA、多版本、多发行版

  • 路径:


纯文本

纯文本

inventory/mycluster/
roles/kubespray-*

2️⃣ Ansible 调用 K8s 模块


yaml

yaml

- name: Create deployment
  kubernetes.core.k8s:
    state: present
    definition:
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: nginx

3️⃣ 典型组合模式

场景

工具

OS 初始化

Ansible

K8s 集群部署

Ansible (Kubespray)

应用发布

Helm + K8s

配置注入

ConfigMap + Ansible

节点维护

Ansible

/root/ansible-docker
├── inventory.ini
├── install_docker_201018.yml

四、环境搭建操作步骤完整梳理

✅ 第一步:准备 SSH 免密(最基础)

1️⃣ 生成密钥

bash

bash

ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
2️⃣ 批量分发公钥

bash

bash

yum install -y sshpass

sshpass -p '123456' ssh-copy-id -o StrictHostKeyChecking=no root@192.168.222.141
sshpass -p '123456' ssh-copy-id -o StrictHostKeyChecking=no root@192.168.222.142
sshpass -p '123456' ssh-copy-id -o StrictHostKeyChecking=no root@192.168.222.143

验证


bash

bash

ansible -i inventory.ini docker_nodes -m ping

📌 出现 SUCCESS => pong才算合格


✅ 第二步:Inventory 主机清单


ini

ini

[webservers]
192.168.222.141

[dbservers]
192.168.222.142
192.168.222.143

📌 Playbook 里的 hosts:必须匹配这里


✅ 第三步:Docker 安装 Playbook(重点)

install_docker_201018.yml


yaml

yaml

- name: Install Docker CE 20.10.18 on Rocky
  hosts: webservers:dbservers
  become: yes

  vars:
    docker_ver: "20.10.18"

  tasks:
    - name: Remove old docker packages
      yum:
        name:
          - docker
          - docker-client
          - docker-engine
        state: absent

    - name: Install yum utils
      yum:
        name:
          - yum-utils
          - device-mapper-persistent-data
          - lvm2
        state: present

    - name: Add Docker CE repo
      get_url:
        url: https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
        dest: /etc/yum.repos.d/docker-ce.repo

    - name: Install Docker CE 20.10.18
      yum:
        name:
          - "docker-ce-{{ docker_ver }}"
          - "docker-ce-cli-{{ docker_ver }}"
          - containerd.io
        state: present
        allow_downgrade: yes

    - name: Enable and start docker
      systemd:
        name: docker
        enabled: yes
        state: started

    - name: Show Docker version
      command: docker --version
      register: dv
      changed_when: false

    - debug:
        msg: "{{ inventory_hostname }} => {{ dv.stdout }}"

五、真实踩坑总结(非常关键)

现象

原因

解决方案

官方 Docker 源慢 / 失败

境外源被限速

✅ 替换为 阿里云镜像

Playbook 执行失败

repo 未生效

明确指定 docker-ce.repo

版本不对

未锁定版本

使用 docker_ver变量

SSH 不通

没做免密

ssh-copy-id

ping 不通

Inventory 写错

检查 IP 和组名


六、执行流程(标准姿势)


bash

bash

# 1️⃣ 语法检查
ansible-playbook -i inventory.ini install_docker_201018.yml --syntax-check

# 2️⃣ 干跑(不真装)
ansible-playbook -i inventory.ini install_docker_201018.yml --check

# 3️⃣ 正式执行
ansible-playbook -i inventory.ini install_docker_201018.yml
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐