Ansible自动化运维:快速入门,从 “批量化执行” 开始

作为运维人,你是否还在重复 SSH 登录多台服务器、手动敲命令执行部署?其实不用这么麻烦 ------Ansible 能帮你把零散操作变成自动化流程,无需复杂配置,靠 SSH 就能批量管控所有节点。这篇实操文从核心概念到真实案例,带你快速上手这个 "运维效率神器",零基础也能轻松写出可复用的自动化脚本~

控制节点192.168.163.80

被控节点192.168.163.81,82

一、Ansible简述

不要把 Ansible 想复杂

Ansible = 用一台机器(80),通过 SSH,去远程执行命令(81、82)

它本质做的事情只有三步:

  1. 控制节点(80)
  2. 通过 SSH 连到被控节点(81 / 82)
  3. 在对方机器上执行命令

Ansible 不是魔法 ,只是把平时敲的 Linux 命令批量化、自动化了。


二、必须先懂的 4 个核心概念


1、 Inventory(主机清单)

它是干嘛的?

告诉 Ansible:"我到底要管哪几台机器?"

最简单的 inventory

复制代码
# hosts
[web]
192.168.163.81
192.168.163.82

意思是:

我定义了一个组,叫 web

里面有两台机器:81 和 82


测试它有没有生效

复制代码
ansible web -m ping

你要理解的是:

  • web:主机组
  • -m ping:不是网络 ping,是 Ansible 自己的连通测试
  • 成功说明:SSH 通;inventory 没问题

2、 Ad-hoc 命令(临时命令)

这是最重要的入门点

可以把它理解为:"我懒得写脚本,就想远程敲一条命令"

示例 1:远程执行命令

复制代码
ansible web -m shell -a "hostname"

拆开理解:

  • ansible web:对 web 组操作(81、82)
  • -m shell:用 shell 模块(= 远程执行命令)
  • -a:参数
  • "hostname":真正执行的 Linux 命令

等价于你手动做:

复制代码
ssh 81 hostname
ssh 82 hostname

示例 2:安装软件

复制代码
ansible web -m apt -a "name=nginx state=present"

只要理解一句话:"在 81 和 82 上,确保 nginx 已安装"


3、 Playbook(自动化脚本)

当你发现:

  • 命令越来越多
  • 顺序很重要

你就需要 Playbook

Playbook 是什么?

用 YAML 写的"自动执行步骤说明书"


你现在只看这个最简单的 playbook

复制代码
- hosts: web
  tasks:
    - name: show hostname
      shell: hostname

我们一行一行拆:


第 1 行

复制代码
- hosts: web

意思是:

这个任务,在哪些机器上执行?

web 组(81、82)


第 2 行

复制代码
tasks:

意思是:接下来我要开始写 具体干什么


第 3 行

复制代码
- name: show hostname
  • name:给人看的说明
  • 不影响执行

第 4 行

复制代码
shell: hostname

意思是:在远程机器上执行:hostname


执行它

复制代码
ansible-playbook test.yml

你现在要记住一句话:playbook = 把 ad-hoc 命令写成文件


4、 Module模块

模块 = Ansible 帮你封装好的"功能"

|---------|--------|
| 模块 | 你可以理解为 |
| shell | 执行命令 |
| apt | 安装软件 |
| copy | 拷贝文件 |
| service | 管理服务 |


举个简单的例子

复制代码
- hosts: web
  become: yes  
  # become: yes  作用是在被控节点上切换到特权用户(通常是 root)执行任务,
  #相当于我们平时在命令行里用 sudo 或 su 提升权限
  tasks:
    - name: install nginx
      apt:
        name: nginx
        state: present

直接翻译成人话:在 web 组的机器上;用 root 权限;确保 nginx 已安装

简单的练习案例

1、查看被控节点系统信息

复制代码
- hosts: web
  tasks:
    - name: show hostname
      shell: hostname

    - name: show ip address
      shell: ip a | grep inet

执行ansible-playbook sysinfo.yml

相当于手动执行:

复制代码
ssh 192.168.163.81 "ip a | grep inet"
ssh 192.168.163.82 "ip a | grep inet"

2、创建目录,写入文件

目标:在被控节点上创建 目录 /opt/ansible_test,在里面写入文件 info.txt

复制代码
- hosts: web
  tasks:
    - name: create test directory
      shell: mkdir -p /opt/ansible_test

    - name: write info file
      shell: echo "Hello from Ansible" > /opt/ansible_test/info.txt

    - name: show file content
      shell: cat /opt/ansible_test/info.txt

运行成功

3、典型案例:安装 nginx

用 shell 模块
复制代码
- hosts: web
  tasks:
    - name: install nginx by shell
      shell: apt install -y nginx

表面看起来: 能跑; 能装

但问题是:

  • 不知道装没装过
  • 每次都会执行
  • 出错不好看懂

用 apt 模块
复制代码
- hosts: web
  become: yes
  tasks:
    - name: install nginx by apt
      apt:
        name: nginx
        state: present
        update_cache: yes

update_cache: yes 这个参数的作用是,在执行 apt 安装操作前,先更新被控节点上的 apt 软件包缓存 ,也就是我们平时手动执行的 apt update 命令 。

  • 先在被控节点上运行 apt update 刷新缓存。
  • 再运行 apt install nginx 安装软件。

解释区别

shell 版本在说什么?

"不管现在什么状态给我直接执行:apt install -y nginx"


apt 版本在说什么?

"我不管你现在怎么样;我只关心最终结果 :nginx 必须存在"

这就是 幂等性 (面试高频词)!是指一个操作 无论执行多少次,最终结果都是一致的,不会造成重复的副作用。

4、典型案例:拷贝文件

用 shell 模块
复制代码
- hosts: web
  tasks:
    - name: copy file by shell
      shell: cp /tmp/test.txt /opt/test.txt

容易出现问题:

  • 源文件不存在就炸
  • 不知道文件有没有变化
  • 不知道是否需要重新执行
用 copy 模块-推荐
复制代码
- hosts: web
  tasks:
    - name: copy file by copy module
      copy:
        src: test.txt
        dest: /opt/test.txt
        mode: 0644
解释 shell 和 copy 差别

shell:"执行 cp 命令,成功算你运气好"

copy:

如果目标文件不存在 → 创建

如果内容不同 → 覆盖

如果一样 → 什么都不做

5、体现自动化运维的案例

观察这个 yaml 文件

复制代码
- hosts: web
  become: yes
  tasks:
    - name: ensure nginx installed
      apt:
        name: nginx
        state: present

    - name: deploy index.html
      copy:
        content: "Hello from {{ inventory_hostname }}"
        dest: /var/www/html/index.html

这个 Playbook 做了两件事:

  1. web 主机组的节点上,确保 nginx 已经安装。
  2. 生成一个包含当前节点主机名的 index.html 文件,并部署到 Nginx 的默认网页目录 /var/www/html/

deploy index.html

  • 使用 copy 模块,将 content 中的内容写入目标文件 /var/www/html/index.html
  • 变量替换{``{ inventory_hostname }} 是 Ansible 的内置变量,会自动替换为当前节点的主机名(如 192.168.163.81)。
  • 幂等性体现 :如果文件内容没有变化,这个任务不会重复写入;只有当内容不同时,才会更新文件,状态显示为 changed
为什么说这是自动化运维的核心?
  • 幂等性:重跑 10 次,结果都一样。它只会在 "需要改变" 时才执行操作,不会做无意义的重复工作,这是自动化运维的关键。
  • 一致性 :无论执行多少次,最终所有节点上的 Nginx 状态和 index.html 内容都是一致的,确保了集群的统一。
  • 可维护性 :用 Ansible 原生模块(aptcopy)替代了 shell 命令,逻辑更清晰,也更稳定

进阶理解 Ansible

Ansible = 声明式配置管理 + 批量远程执行 + 幂等保证

它和 shell 脚本的根本区别只有一句话:

你描述"最终状态",Ansible 负责"怎么达到"

1、 幂等性(Idempotent)------Ansible 的灵魂

什么叫幂等?同一个 playbook,跑 1 次和跑 100 次,结果一样

复制代码
apt:
  name: nginx
  state: present

含义不是"安装 nginx",而是:确保 nginx 存在

  • 已存在 → 什么都不做
  • 不存在 → 安装

面试标准说法:"Ansible 通过模块内置的状态判断机制,实现任务的幂等执行。"


2、 become:权限控制

为什么一定要有?你做的事:

  • 安装软件
  • /etc
  • 管理服务

👉普通用户没权限


become: yes 是什么?

复制代码
- hosts: web
  become: yes

等价于你手动:

复制代码
sudo apt install nginx

进阶一点的说法

  • Ansible 默认使用 SSH 用户
  • become****用于权限提升
  • 默认方式是 sudo

3、 handlers:智能"只在需要时"执行

这是 Ansible 非常工程化的设计。


复制代码
- hosts: web
  become: yes
  tasks:
    - name: copy nginx config
      copy:
        src: nginx.conf
        dest: /etc/nginx/nginx.conf
      notify: restart nginx

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

handlers 的人话解释:只有配置文件发生变化,才重启 nginx

服务会在 当前 Playbook 里所有 tasks****执行完毕后 ,统一触发并执行 restart nginxhandler

  • 文件没变 → 不重启
  • 文件变了 → playbook 结束后统一重启

面试官为什么爱问这个?因为这代表你理解:

  • 服务稳定性
  • 自动化的"最小影响原则"

4、 Variables(变量):让 playbook 能复用

为什么不能写死?

  • 不同环境
  • 不同端口
  • 不同路径

最简单变量示例

复制代码
- hosts: web
  vars:
    app_port: 8080
  tasks:
    - name: show port
      shell: echo {{ app_port }}

变量常见来源
  • playbook 内
  • inventory
  • vars_files
  • extra-vars(命令行)

5、 facts:Ansible 自动收集的系统信息


示例
复制代码
when: ansible_distribution == "Ubuntu"

Ansible 在执行前会自动:

  • 获取系统版本
  • CPU / 内存
  • 网卡信息

面试说法

"Ansible 通过 facts 机制自动采集主机信息,用于条件判断和动态配置。"


Ansible 执行流程(非常重要)

在脑子里形成这个顺序:

  1. 读取 inventory
  2. SSH 连接主机
  3. 收集 facts
  4. 按顺序执行 tasks
  5. 最后执行 handlers

完整示例

复制代码
- hosts: web
  become: yes
  vars:
    web_root: /var/www/html
  tasks:
    - name: install nginx
      apt:
        name: nginx
        state: present

    - name: deploy index.html
      copy:
        content: "Hello from {{ inventory_hostname }}"
        dest: "{{ web_root }}/index.html"
      notify: restart nginx

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

确保 nginx 存在;部署页面;只在页面变化时重启服务

相关推荐
小码吃趴菜1 小时前
守护进程及其编程流程
linux·运维·服务器
式5162 小时前
RAG检索增强生成基础(二)RAG项目实战之Milvus Docker环境配置
运维·docker·容器
Yeats_Liao2 小时前
容器化部署:基于Docker的推理环境隔离与迁移
运维·docker·容器
开开心心就好2 小时前
内存清理工具点击清理,自动间隔自启
linux·运维·服务器·安全·硬件架构·材料工程·1024程序员节
CTO Plus技术服务中2 小时前
大厂面试笔记和参考答案!浏览器自动化、自动化测试、自动化运维与开发、办公自动化
运维·笔记·面试
winfredzhang2 小时前
自动化视频制作:深入解析 FFmpeg 图片转视频脚本
ffmpeg·自动化·音视频·命令行·bat·图片2视频
浅安的邂逅2 小时前
ubuntu 18.04及以上版本 ping命令报错:Name or service not known解决方法
linux·运维·ubuntu·ip设置
重生之绝世牛码2 小时前
Linux软件安装 —— JDK安装
java·大数据·linux·运维·jdk
晚风吹长发2 小时前
初步理解Linux中的进程间通信以及管道通信
linux·运维·服务器·c++·进程·通信