一、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