Ansible学习总结:从基础命令到Playbook实战

文章目录

  • [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 特性(管道、变量、重定向) chdircreatesexecutable(指定 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"
相关推荐
电子小白1233 小时前
第13期PCB layout工程师初级培训-1-EDA软件的通用设置
笔记·嵌入式硬件·学习·pcb·layout
sunfove3 小时前
光网络的立交桥:光开关 (Optical Switch) 原理与主流技术解析
网络
唯情于酒3 小时前
Docker学习
学习·docker·容器
charlie1145141914 小时前
嵌入式现代C++教程: 构造函数优化:初始化列表 vs 成员赋值
开发语言·c++·笔记·学习·嵌入式·现代c++
IT=>小脑虎5 小时前
C++零基础衔接进阶知识点【详解版】
开发语言·c++·学习
#眼镜&5 小时前
嵌入式学习之路2
学习
码农小韩5 小时前
基于Linux的C++学习——指针
linux·开发语言·c++·学习·算法
Kevin Wang7275 小时前
欧拉系统服务部署注意事项
网络·windows
min1811234565 小时前
深度伪造内容的检测与溯源技术
大数据·网络·人工智能
微露清风5 小时前
系统性学习C++-第十九讲-unordered_map 和 unordered_set 的使用
开发语言·c++·学习