文章目录
- [1218 Ansible 核心知识点总结](#1218 Ansible 核心知识点总结)
-
- [一、Ansible 基础命令及模块操作](#一、Ansible 基础命令及模块操作)
- [二、Ansible-Playbook 剧本编写](#二、Ansible-Playbook 剧本编写)
-
- [1. Playbook 核心结构详解](#1. Playbook 核心结构详解)
- [2. Playbook 编写范式与示例](#2. Playbook 编写范式与示例)
- [3. 变量的定义与引用方式](#3. 变量的定义与引用方式)
- [4. 条件判断 `when` 的使用](#4. 条件判断
when的使用)
1218 Ansible 核心知识点总结
Ansible 作为一款无代理式的自动化运维工具,其核心能力体现在基础模块命令 和Playbook 剧本编排两部分。掌握这两大板块,可高效实现批量主机配置管理、服务部署、任务执行等自动化运维场景。
一、Ansible 基础命令及模块操作
Ansible 模块是实现单步运维操作的最小执行单元,通过 ansible <主机组> -m <模块名> -a <模块参数> 格式调用。以下是 13 个高频核心模块的详细说明,包含功能、核心参数、操作示例:
| 模块名称 | 核心功能 | 常用参数 | 典型操作示例 |
|---|---|---|---|
| command | 远程执行基础命令,不支持管道、重定向等 Shell 特性 | chdir(执行命令前切换目录)、creates(文件存在则跳过) |
ansible web -m command -a "chdir=/tmp ls -l" 解释:在 web 组主机的 /tmp 目录下执行 ls -l |
| shell | 远程执行命令,支持 Shell 特性(管道、变量、重定向) | chdir、creates、executable(指定 Shell 解释器) |
ansible db -m shell -a "echo 'test' > /tmp/test.txt" 解释:在 db 组主机写入内容到 /tmp/test.txt |
| cron | 管理远程主机的 crontab 计划任务 |
name(任务名称,必填)、minute/hour/day/month/weekday(时间规则)、job(执行的任务)、state(present/absent,创建/删除) |
ansible all -m cron -a "name='backup' hour=2 job='/root/backup.sh' state=present" 解释:所有主机添加每日 2 点执行备份脚本的定时任务 |
| user | 系统用户管理(创建、删除、修改属性) | name(用户名,必填)、uid(用户 ID)、group(主组)、shell(登录 Shell)、state(present/absent) |
ansible all -m user -a "name=testuser uid=10086 shell=/bin/bash state=present" 解释:创建用户 testuser,UID 为 10086 |
| group | 系统用户组管理 | name(组名,必填)、gid(组 ID)、state(present/absent) |
ansible all -m group -a "name=testgroup gid=10086 state=present" 解释:创建用户组 testgroup,GID 为 10086 |
| copy | 本地文件复制到远程主机,或直接生成文件内容 | src(本地源文件路径)、dest(远程目标路径,必填)、content(直接写入的文本内容)、mode(文件权限) |
ansible web -m copy -a "src=/root/nginx.conf dest=/etc/nginx/ mode=0644" 解释:将本地 nginx.conf 复制到远程 /etc/nginx/,权限 644 |
| file | 远程主机文件/目录管理(创建、删除、权限修改) | path(目标路径,必填)、state(file/directory/link/absent)、mode(权限)、owner/group(属主/属组) |
ansible all -m file -a "path=/tmp/testdir state=directory mode=0755" 解释:在所有主机创建 /tmp/testdir 目录,权限 755 |
| hostname | 修改远程主机的主机名 | name(新主机名,必填) |
ansible node1 -m hostname -a "name=web-node-01" 解释:将 node1 主机名改为 web-node-01 |
| ping | 检测控制端与远程主机的连通性(Ansible 心跳检测) | 无核心参数 | ansible all -m ping 解释:检测所有主机是否在线 |
| yum | RPM 系统软件包管理(安装、卸载、更新) | name(软件包名,必填)、state(present/latest/absent,安装/最新/卸载) |
ansible db -m yum -a "name=mariadb-server state=present" 解释:在 db 组主机安装 mariadb-server |
| service/systemd | 管理系统服务(启动、停止、重启、开机自启) | name(服务名,必填)、state(started/stopped/restarted/reloaded)、enabled(yes/no,是否开机自启) |
ansible web -m service -a "name=nginx state=started enabled=yes" 解释:启动 nginx 服务并设置开机自启 |
| script | 本地脚本传输到远程主机并执行(无需手动拷贝) | free_form(本地脚本路径,必填) |
ansible all -m script -a "/root/init.sh" 解释:在所有主机执行本地的 init.sh 脚本 |
| setup | 收集远程主机的系统信息(facts 变量),如 CPU、内存、系统版本 | filter(过滤需要的信息,支持通配符) |
ansible all -m setup -a "filter=ansible_*_mb" 解释:收集所有主机的内存相关 facts 信息 |
二、Ansible-Playbook 剧本编写
Playbook 是 Ansible 的编排核心,采用 YAML 格式,可定义多组任务、变量、条件判断等,实现复杂的自动化运维流程。
1. Playbook 核心结构详解
Playbook 由一个或多个 Play 组成,每个 Play 对应一组目标主机和任务。完整结构包含 5 个核心组件,具体说明如下表:
| 组件名称 | 核心作用 | 关键特性 | 应用场景 |
|---|---|---|---|
| Tasks | 任务列表,按从上到下顺序执行,每个任务对应一个模块调用 | 单个任务是原子操作,执行失败会终止整个 Play | 基础运维操作串联,如"安装软件→复制配置→启动服务" |
| Variables | 变量存储机制,将硬编码值抽离为动态占位符 | 变量可通过多种方式定义,优先级:命令行 > Playbook 内 > Facts | 不同环境(开发/测试/生产)的配置差异化,如端口、路径 |
| Templates | 基于 Jinja2 引擎的动态配置文件生成 | 支持变量、循环、条件判断等语法,后缀通常为 .j2 |
Nginx、MySQL 等服务的配置文件批量生成 |
| Handlers | 特殊任务集合,仅被 notify 触发执行 |
触发后会在当前 Play 的所有普通任务执行完毕后运行 | 配置文件修改后,重启/重载服务(避免重复操作) |
| Roles | Playbook 模块化组织方式,将相关资源打包为独立角色 | 自动加载 tasks/vars/templates/handlers 等目录下的文件 |
复杂场景复用,如 Nginx 角色、MySQL 角色,可跨 Playbook 调用 |
2. Playbook 编写范式与示例
一个标准的 Playbook 包含 Play 名称、目标主机、执行用户、任务列表 四个基础要素,以下是完整示例:
yaml
# 示例:安装并启动 Nginx
- name: Install and start Nginx # Play 名称,描述作用
hosts: web_server # 目标主机组,对应 inventory 中的分组
remote_user: root # 远程执行任务的用户
vars: # Playbook 内定义变量
nginx_port: 8080
tasks:
- name: Install Nginx package # 任务1:安装 Nginx
yum:
name: nginx
state: present
- name: Copy Nginx config template # 任务2:复制 Jinja2 模板
template:
src: ./nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: Restart Nginx # 触发 Handlers 中的 Restart Nginx 任务
- name: Start Nginx service # 任务3:启动 Nginx
service:
name: nginx
state: started
enabled: yes
handlers: # 定义 Handlers 任务
- name: Restart Nginx
service:
name: nginx
state: restarted
3. 变量的定义与引用方式
变量是 Playbook 动态化的核心,支持 4 种常见定义方式,优先级从高到低排序:
| 定义方式 | 语法格式 | 示例 |
|---|---|---|
| 命令行传递 | ansible-playbook -e "变量名=值" |
ansible-playbook nginx.yml -e "nginx_port=8081" |
| Playbook 内定义 | vars: 关键字下声明 |
vars: <br> nginx_port: 8080 |
| 主机变量/组变量 | 在 inventory 文件中定义,或 host_vars/group_vars 目录下 |
inventory 文件中:[web_server] <br> node1 nginx_port=8080 |
| Facts 变量(系统信息) | 由 setup 模块自动收集,直接引用 | {``{ ansible_facts['distribution'] }} # 获取系统发行版 |
变量引用规则 :在 Playbook 中用双大括号 {``{ 变量名 }} 引用,如 listen_port: {``{ nginx_port }}。
4. 条件判断 when 的使用
when 是 Playbook 的条件执行关键字,只有当条件表达式为真时,才执行当前任务,支持变量、Facts 信息、逻辑运算符。
| 条件类型 | 语法示例 | 应用场景 |
|---|---|---|
| 单条件判断 | when: ansible_facts['distribution'] == "CentOS" |
仅在 CentOS 系统执行任务 |
| 多条件逻辑运算 | when: ansible_facts['memtotal_mb'] > 2048 and nginx_port == 8080 |
内存大于 2G 且端口为 8080 时执行 |
| 变量存在判断 | when: nginx_port is defined |
变量 nginx_port 已定义时执行 |
示例:仅在 CentOS 主机安装 Nginx
yaml
- name: Install Nginx on CentOS
yum:
name: nginx
state: present
when: ansible_facts['distribution'] == "CentOS"