Ansible 作为当前主流的配置管理工具,无代理、幂等性强、易上手,用它来管理几十上百台服务器真的能省下大量重复工作。

这篇博客把课程前两章的核心知识点系统整理了一下,。后面章节会继续分享变量、角色、故障排除等内容,感兴趣的可以关注后续更新。


目录

  1. Ansible 简介与发展背景

  2. Ansible 架构与核心优势

  3. Ansible Inventory 管理(静态与动态)

  4. Ansible 配置文件详解

  5. 编写与执行 Playbook 基础

  6. 多 Play 实施与特权提升

  7. 模块选择与文档查看技巧

  8. 核心知识点汇总与易错点分析

  9. 总结与实践建议


1. Ansible 简介与发展背景

Ansible 是由 Michael DeHaan 在 2012 年创建的开源自动化工具,后来被 Red Hat 收购并发展成企业级产品(Red Hat Ansible Automation Platform)。它最初的目标就是简化 IT 自动化,让运维人员用简单的 YAML 文件描述基础设施状态,而不是写复杂的脚本。

相比 Puppet、Chef 等传统配置管理工具,Ansible 的最大特点是无代理架构:只需要在控制节点安装 Ansible,受控节点只需开通 SSH(或 WinRM for Windows)即可,不需要在每台服务器上装 agent。这大大降低了部署复杂度,尤其适合异构环境。

现在 Ansible 已经广泛用于:

  • Linux/Windows 服务器配置管理

  • 网络设备自动化(Cisco、Juniper 等)

  • 云资源编排(AWS、OpenStack)

  • 容器与 Kubernetes 部署

Red Hat 将 Ansible 包装成 Ansible Automation Platform(AAP),增加了执行环境、内容集合、分析报告等企业特性,但核心 ansible-core 仍是开源免费的。

个人体会:在生产环境里,Ansible 最吸引我的就是“声明式”编程——你描述“最终状态应该是什么样”,Ansible 自动帮你收敛到这个状态,多次运行也不会产生副作用(幂等性)。


2. Ansible 架构与核心优势

Ansible 的架构非常简洁:

  • 控制节点(Control Node):安装 ansible-navigator 或 ansible-core,运行 Playbook 的地方。

  • 受控节点(Managed Nodes):被管理的服务器,只需 SSH 可达 + Python(大部分模块需要)。

  • Inventory:定义管理哪些主机及其分组。

  • Playbook:YAML 格式的自动化脚本,描述任务序列。

  • 模块(Modules):Ansible 实际执行单元,打包在内容集合(Collections)中。

  • 执行环境(Execution Environment):容器化运行环境(推荐使用),隔离依赖。

核心优势:

  • 无代理:部署快,资源占用低

  • 幂等性:安全多次执行

  • YAML 语法:人类可读,便于版本控制

  • Push 模式:控制节点主动推送任务,实时性强

  • 支持 Windows、网络设备、云平台


3. Ansible Inventory 管理(静态与动态)

Inventory 是 Ansible 知道“管哪些机器”的清单文件。

3.1 静态 Inventory(INI/YAML 格式)

推荐放在项目目录下的 inventory.ini

[webservers]
web1.example.com
web2.example.com ansible_host=192.168.1.10

[dbservers]
db1.example.com

[servers:children]          # 组的组
webservers
dbservers

[all:vars]                  # 全局变量
ansible_user=admin
ansible_ssh_private_key_file=~/.ssh/id_rsa

范围简化写法(非常实用):

web[01:10].example.com     # web01 到 web10
192.168.1.[1:100]          # 192.168.1.1 到 192.168.1.100

验证 Inventory:

ansible-navigator inventory -i inventory.ini --graph   # 查看组结构
ansible-navigator inventory -i inventory.ini --list    # 列出所有主机

3.2 动态 Inventory

适合云环境(AWS、OpenStack),Ansible 自带动态脚本,或用社区插件。课程中提到但不深入,实际生产常用 amazon.aws 集合。

实战建议:小规模先用静态 Inventory,机器上百后考虑动态或 CMDB 集成。


4. Ansible 配置文件详解

项目目录下创建 ansible.cfg 覆盖默认设置:

[defaults]
inventory = ./inventory.ini
remote_user = admin
ask_pass = false                # 如果用密码登录设为 true
become = true                   # 默认启用提权
become_method = sudo
become_ask_pass = false

[privilege_escalation]
become = true
become_user = root

ansible-navigator 专用配置 ansible-navigator.yml

---
ansible-navigator:
  execution-environment:
    image: quay.io/ansible/creator-ee:latest
    pull:
      policy: missing
  playbook-artifact:
    enable: false               # 密码登录时必须禁用

查看当前生效配置:

ansible-navigator config

易错点:配置优先级复杂(环境变量 > 项目目录 > 用户目录 > /etc/ansible),建议每个项目都带自己的 ansible.cfg,避免全局污染。


5. 编写与执行 Playbook 基础

Playbook 是 YAML 文件,扩展名通常 .yml

简单示例 site.yml

---
- name: 配置 Web 服务器基础环境
  hosts: webservers
  become: true
  tasks:
    - name: 确保 httpd 已安装
      ansible.builtin.dnf:
        name: httpd
        state: present

    - name: 确保 httpd 服务启动并开机自启
      ansible.builtin.service:
        name: httpd
        state: started
        enabled: true

执行:

ansible-navigator run site.yml -m stdout     # 标准输出模式
ansible-navigator run site.yml --check      # 干跑模式(不实际修改)
ansible-navigator run site.yml --syntax-check  # 语法检查

关键点

  • 使用 FQCN(完全限定集合名称)如 ansible.builtin.dnf,避免未来冲突

  • 给 play 和 task 加 name,运行时输出更清晰

  • 大部分模块幂等,多次运行只有第一次会 changed


6. 多 Play 实施与特权提升

一个 Playbook 可包含多个 Play,分别针对不同主机组:

---
- name: 配置所有服务器通用设置
  hosts: all
  become: true
  tasks:
    - name: 更新所有软件包
      ansible.builtin.dnf:
        name: "*"
        state: latest

- name: 配置数据库服务器
  hosts: dbservers
  remote_user: dbadmin
  become: true
  become_user: root
  tasks:
    - name: 安装 mariadb
      ansible.builtin.dnf:
        name: mariadb-server
        state: present

特权提升建议:不要全局 become=true,按需在 play 或 task 级别设置,更安全。


7. 模块选择与文档查看技巧

查看可用模块:

ansible-navigator collections                    # 浏览所有集合
ansible-navigator doc -l                        # 列出模块
ansible-navigator doc ansible.builtin.dnf        # 查看具体文档
ansible-navigator doc -t module dnf             # 搜索模块

常用任意命令模块(慎用,非幂等):

- name: 执行重启(仅在需要时)
  ansible.builtin.command: /sbin/reboot
  when: update_result.changed

优先使用专用模块(如 dnfservice),再考虑 command/shell


8. 核心知识点汇总与易错点分析

知识点 核心作用与应用场景 易错点与建议
无代理架构 控制节点 Push 任务到受控节点 受控节点必须 SSH 可达 + Python
Inventory 定义管理主机与分组 忘记指定 -i 时用默认 /etc/ansible/hosts
ansible.cfg 覆盖默认行为 配置冲突时用 ansible-navigator config 查看生效配置
Playbook YAML 缩进 严格空格缩进(不能用 Tab) vim 中设置 set expandtab
模块 FQCN 避免命名冲突 新 Playbook 必须用 ansible.builtin.xxx
become 特权提升 按需提权到 root 全局开启不安全,建议 play 级别控制
ansible-navigator 现代执行工具,支持执行环境 密码登录时必须禁用 playbook-artifact

9. 总结

Ansible 的魅力在于“简单却强大”:用几行 YAML 就能管理整个机房。

后续会继续分享变量、事实、任务控制、角色等高级内容。欢迎留言交流你在用 Ansible 时遇到的坑,或者分享你的自动化脚本~

(完)

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐