目录
[2.Ansible 特点](#2.Ansible 特点)
[3.Ansible 作用](#3.Ansible 作用)
[5.Ansible 环境安装部署](#5.Ansible 环境安装部署)
[6.Ansible 基础命令及模块操作](#6.Ansible 基础命令及模块操作)
[command 模块](#command 模块)
[shell 模块](#shell 模块)
[cron 模块](#cron 模块)
[user 模块](#user 模块)
[group 模块](#group 模块)
[copy 模块](#copy 模块)
[file 模块](#file 模块)
[hostname 模块](#hostname 模块)
[ping 模块](#ping 模块)
[yum 模块](#yum 模块)
[service/systemd 模块](#service/systemd 模块)
[script 模块](#script 模块)
[setup 模块](#setup 模块)
[二、Inventory 主机清单与变量配置](#二、Inventory 主机清单与变量配置)
[2.常用 Inventory 变量](#2.常用 Inventory 变量)
[三、Ansible-Playbook 剧本编写](#三、Ansible-Playbook 剧本编写)
[1.Playbook 的结构](#1.Playbook 的结构)
[2.Ansible Playbook 示例](#2.Ansible Playbook 示例)
前言
自动化运维在现代IT基础设施管理中扮演着关键角色,能够显著提升效率并减少人为错误。Ansible作为一款轻量级、无代理的配置管理工具,通过简洁的YAML语法实现任务编排,降低了学习和使用门槛。Inventory定义了目标主机和组,而Playbook则描述了具体的执行任务和流程。结合这两者,Ansible能够高效完成部署、配置管理、应用发布等复杂任务。
本指南旨在帮助用户理解Ansible的核心概念,并通过实例展示如何编写高效的Inventory和Playbook,从而快速实现自动化运维目标。
一、Ansible
1.Ansible简介
Ansible 是一款开源的自动化运维工具,用于配置管理、应用部署、任务自动化和持续交付。其核心设计理念是简单易用、无需代理、基于 SSH 协议实现远程管理,采用 YAML 语言编写剧本(Playbook),降低了学习成本。
具有以下优势:
①无需在被管理节点安装客户端,轻量级。
②通过 SSH 协议与节点通信。
③使用 YAML 和 Jinja2 模板语言进行配置和自动化任务编排。
2.Ansible****特点
无代理架构
Ansible 采用 SSH 或 WinRM 协议直接管理节点,无需在目标主机上安装额外代理程序。通过推送模式执行任务,降低系统资源占用和运维复杂度。
幂等性设计
任务脚本(Playbook)可重复执行且结果一致。若目标状态已满足,Ansible 不会重复执行操作,避免意外变更。例如文件权限修改仅在当前配置不符时触发。
声明式语言
使用 YAML 编写 Playbook,通过描述系统终态而非具体步骤实现配置管理。用户无需关注底层命令,例如定义软件包安装状态而非调用 apt-get install。
模块化扩展
内置超过 750 个核心模块(如 copy、yum、template),支持自定义模块开发。模块抽象底层操作,实现跨平台兼容性(如 Linux/Windows 统一文件管理)。
Ansible 的协作与集成能力
清单动态管理
支持静态 Inventory 文件和动态脚本生成主机列表,可与云平台(AWS EC2、Azure)或 CMDB 系统集成,实时获取基础设施状态。
分层变量系统
变量可定义于 Playbook、主机清单、角色或外部文件中,支持优先级覆盖。通过 host_vars 和 group_vars 实现环境差异化配置。
插件体系
提供回调插件(日志定制)、连接插件(Docker/Kubernetes 支持)、查找插件(从数据库读取变量)等扩展点,增强流程控制与数据交互能力。
3.Ansible作用
Ansible 是一款开源的自动化运维工具,用于配置管理、应用部署、任务自动化和持续交付。其核心作用包括:
配置管理
通过 YAML 格式的剧本(Playbook)定义服务器配置,确保环境一致性。例如批量安装软件、修改配置文件或管理用户权限。
应用部署
自动化应用从开发到生产的发布流程,支持滚动更新、回滚操作,与 CI/CD 工具(如 Jenkins)集成。
任务自动化
执行重复性任务,如日志轮转、备份、定时任务,通过 Ad-Hoc 命令快速完成临时操作。
编排复杂流程
协调多台服务器的操作顺序,例如先更新数据库再重启应用服务,依赖 roles 和 handlers 实现步骤控制。
无代理架构
基于 SSH 或 WinRM 协议直接管理节点,无需在目标机器安装客户端,降低维护成本。
4.典型使用场景
- 批量初始化云服务器(AWS、Azure)。
- 动态管理 Docker 或 Kubernetes 集群配置。
- 自动化测试环境搭建与销毁。
通过声明式语法和简单的学习曲线,Ansible 显著提升了运维效率与系统可靠性。
5.Ansible****环境安装部署
管理端安装 Ansible :
bash
sudo yum install epel-release -y
sudo yum install ansible -y
配置主机清单 :
stylus
[web_servers]
web1.example.com ansible_host=192.168.1.10
web2.example.com ansible_host=192.168.1.11
[db_servers]
db1.example.com ansible_host=192.168.1.20
db2.example.com ansible_host=192.168.1.21
[production:children]
web_servers
db_servers
配置免密 SSH 登录 :
分发公钥到目标主机
使用 ssh-copy-id 将公钥复制到目标主机的 authorized_keys 文件中:
bash
ssh-copy-id user@target_host
替换 user 为目标主机的用户名,target_host 为目标主机 IP 或域名。需输入目标主机的密码一次。
6.Ansible****基础命令及模块操作
命令格式
ansible < 组名 > -m < 模块 > -a < 参数 >
command 模块
用于在远程节点执行简单命令。不通过 shell 处理变量或特殊符号。
yaml
- name: Execute a command
command: /usr/bin/command arg1 arg2
shell 模块
类似 command 模块,但通过远程节点的 shell 执行(如 /bin/sh),支持管道和变量。
yaml
- name: Execute a shell command
shell: echo $HOME > /tmp/home_var
cron 模块
管理 crontab 计划任务。
yaml
- name: Add a cron job
cron:
name: "Backup"
minute: "0"
hour: "2"
job: "/opt/scripts/backup.sh"
user 模块
管理用户账户。
yaml
- name: Add a user
user:
name: "testuser"
group: "admin"
shell: "/bin/bash"
group 模块
管理用户组。
yaml
- name: Ensure group exists
group:
name: "developers"
state: present
copy 模块
复制文件到远程节点。
yaml
- name: Copy a file
copy:
src: /local/path/file.conf
dest: /remote/path/file.conf
owner: root
group: root
mode: '0644'
file 模块
设置文件/目录属性或创建符号链接。
yaml
- name: Create a directory
file:
path: /path/to/directory
state: directory
mode: '0755'
hostname 模块
修改主机名。
yaml
- name: Set hostname
hostname:
name: "webserver01"
ping 模块
测试远程主机的连接性。
yaml
- name: Test connection
ping:
yum 模块
使用 yum 包管理器管理软件包(RHEL/CentOS)。
yaml
- name: Install a package
yum:
name: nginx
state: latest
service/systemd 模块
管理系统服务。
yaml
- name: Start a service
service:
name: nginx
state: started
enabled: yes
script 模块
将本地脚本传输到远程节点并执行。
yaml
- name: Run a script
script: /local/scripts/deploy.sh
setup 模块
收集远程主机的 facts 信息(自动运行,无需显式调用)。
yaml
- name: Display all facts
debug:
var: ansible_facts
每个模块支持更多参数,可通过 ansible-doc <module_name> 查看完整文档。模块设计遵循幂等性,重复执行不会产生意外结果。
调试方法
详细输出
增加输出详细程度:
ansible-playbook playbook.yml -vvv
模块测试
直接测试模块功能:
ansible localhost -m debug -a "msg='Test message'"
检查语法
验证Playbook语法:
ansible-playbook playbook.yml --syntax-check
插入
复制
重新生成
二、Inventory****主机清单与变量配置
1.主机清单配置
主机清单(Inventory)是Ansible中定义管理目标的核心文件,通常以INI或YAML格式编写。默认路径为/etc/ansible/hosts,也可通过-i参数指定自定义文件。
INI格式示例:
ini
[web_servers]
web1.example.com ansible_port=2222
web2.example.com
[db_servers]
db1.example.com
db2.example.com ansible_user=admin
[cluster:children]
web_servers
db_servers
2.常用Inventory变量

主机变量与组变量
主机变量(Host Variables)通常指在Ansible中直接关联到特定主机的变量,定义在host_vars目录或清单文件中。这些变量仅对单个主机生效,优先级高于组变量。
组变量(Group Variables)是分配给Ansible主机组的变量,定义在group_vars目录或清单文件中。组变量对所有属于该组的主机生效,适用于共享配置的场景。
组嵌套的实现
组嵌套(Group Nesting)允许在Ansible中将一个组作为另一个组的成员,形成层级关系。通过children关键字实现,子组继承父组的变量,但子组的变量优先级更高。
ini
[web_servers]
host1.example.com
[db_servers]
host2.example.com
[production:children]
web_servers
db_servers
变量优先级规则
- 直接主机变量 :定义在
host_vars中的变量优先级最高。 - 子组变量:嵌套组中子组的变量覆盖父组的同名变量。
- 父组变量:父组变量优先级低于子组但高于全局变量。
- 全局变量 :定义在
group_vars/all中的变量优先级最低。
三、Ansible-Playbook****剧本编写
1.Playbook****的结构
Ansible 的 Playbook 是一个包含多个 Play 的 YAML 文件,每个 Play 负责对指定的 主机组 执行一系
列的任务。 Playbook 通常由以下几部分组成:
Tasks :每个任务会调用一个模块来在目标主机上执行操作。
Variables :通过定义和使用变量,使 Playbook 更具灵活性和可重用性。
Templates :通过 Jinja2 模板动态生成配置文件。
Handlers :用于响应任务执行后的变更( notify 触发)。
Roles :把多个任务、变量、模板、文件、处理程序组织成模块化结构,便于复用。
2.Ansible Playbook 示例
以下是一个完整的 Ansible Playbook 示例,用于部署 Nginx 并配置一个简单的静态网站。该示例展示了 Playbook 的基本结构和常用模块。
playbook.yml
yaml
---
- name: Deploy Nginx and static website
hosts: webservers
become: yes
vars:
website_dir: /var/www/example.com
index_content: "Hello, World!"
tasks:
- name: Install Nginx
apt:
name: nginx
state: present
update_cache: yes
- name: Create website directory
file:
path: "{{ website_dir }}"
state: directory
mode: '0755'
- name: Create index.html
copy:
content: "{{ index_content }}"
dest: "{{ website_dir }}/index.html"
mode: '0644'
- name: Configure Nginx site
template:
src: templates/example.com.conf.j2
dest: /etc/nginx/sites-available/example.com.conf
notify: restart nginx
- name: Enable site
file:
src: /etc/nginx/sites-available/example.com.conf
dest: /etc/nginx/sites-enabled/example.com.conf
state: link
notify: restart nginx
handlers:
- name: restart nginx
service:
name: nginx
state: restarted
关键组件说明
Inventory 文件 (inventory.ini)
ini
[webservers]
server1.example.com
server2.example.com
Nginx 配置模板 (templates/example.com.conf.j2)
nginx
server {
listen 80;
server_name example.com;
root {{ website_dir }};
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
运行 Playbook
执行以下命令运行 Playbook:
bash
ansible-playbook -i inventory.ini playbook.yml
高级功能示例
变量文件 (vars.yml)
yaml
website_dir: /var/www/production.com
index_content: "Welcome to Production"
包含角色的 Playbook
yaml
---
- name: Deploy web stack
hosts: webservers
become: yes
roles:
- nginx
- firewall
条件任务
yaml
- name: Install debug tools on dev servers
apt:
name: htop
state: present
when: "'dev' in group_names"
最佳实践
- 使用
ansible-lint检查 Playbook 语法 - 将敏感数据存储在
ansible-vault加密文件中 - 使用
tags标记任务以便选择性运行 - 遵循 Ansible Galaxy 的目录结构标准
总结
Ansible通过Inventory和Playbook的组合,提供了一种灵活且强大的自动化解决方案。Inventory文件清晰地组织目标主机,而Playbook以声明式的方式定义任务流程,使运维工作变得可重复、可维护。
通过合理设计Playbook,可以实现模块化、可复用的自动化脚本,显著提升运维效率。无论是简单的服务器配置,还是复杂的多阶段部署,Ansible都能以一致且可靠的方式完成任务。掌握这些工具的使用,将为团队带来更高的生产力和更稳定的系统环境。