自动化运维工具 Ansible 集中化管理服务器
目录
前言
一、Ansible
1.Ansible简介
2.Ansible 特点
3.Ansible 作用
4.典型使用场景
5.Ansible 环境安装部署
6.Ansible 基础命令及模块操作
命令格式
command 模块
shell 模块
cron 模块
user 模块
group 模块
copy 模块
file 模块
hostname 模块
ping 模块
yum 模块
service/systemd 模块
script 模块
setup 模块
调试方法
二、Inventory 主机清单与变量配置
1.主机清单配置
2.常用 Inventory 变量
主机变量与组变量
组嵌套的实现
变量优先级规则
三、Ansible-Playbook 剧本编写
1.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 环境安装部署
sudo yum install epel-release -y
sudo yum install ansible -y
[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-copy-id 将公钥复制到目标主机的 authorized_keys 文件中:
ssh-copy-id user@target_host
替换 user 为目标主机的用户名,target_host 为目标主机 IP 或域名。需输入目标主机的密码一次。
6.Ansible 基础命令及模块操作
命令格式
command 模块
- name: Execute a command
command: /usr/bin/command arg1 arg2
shell 模块
类似 command 模块,但通过远程节点的 shell 执行(如 /bin/sh),支持管道和变量。
- name: Execute a shell command
shell: echo $HOME > /tmp/home_var
cron 模块
管理 crontab 计划任务。
- name: Add a cron job
cron:
name: "Backup"
minute: "0"
hour: "2"
job: "/opt/scripts/backup.sh"
user 模块
管理用户账户。
- name: Add a user
user:
name: "testuser"
group: "admin"
shell: "/bin/bash"
group 模块
管理用户组。
- name: Ensure group exists
group:
name: "developers"
state: present
copy 模块
复制文件到远程节点。
- name: Copy a file
copy:
src: /local/path/file.conf
dest: /remote/path/file.conf
owner: root
group: root
mode: '0644'
file 模块
设置文件/目录属性或创建符号链接。
- name: Create a directory
file:
path: /path/to/directory
state: directory
mode: '0755'
hostname 模块
修改主机名。
- name: Set hostname
hostname:
name: "webserver01"
ping 模块
测试远程主机的连接性。
- name: Test connection
ping:
yum 模块
使用 yum 包管理器管理软件包(RHEL/CentOS)。
- name: Install a package
yum:
name: nginx
state: latest
service/systemd 模块
管理系统服务。
- name: Start a service
service:
name: nginx
state: started
enabled: yes
script 模块
将本地脚本传输到远程节点并执行。
- name: Run a script
script: /local/scripts/deploy.sh
setup 模块
收集远程主机的 facts 信息(自动运行,无需显式调用)。
- name: Display all facts
debug:
var: ansible_facts
每个模块支持更多参数,可通过 ansible-doc 查看完整文档。模块设计遵循幂等性,重复执行不会产生意外结果。
调试方法
详细输出
增加输出详细程度:
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格式示例:
[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关键字实现,子组继承父组的变量,但子组的变量优先级更高。
[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 的结构
2.Ansible Playbook 示例
以下是一个完整的 Ansible Playbook 示例,用于部署 Nginx 并配置一个简单的静态网站。该示例展示了 Playbook 的基本结构和常用模块。
playbook.yml
---
- 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)
[webservers]
server1.example.com
server2.example.com
Nginx 配置模板 (templates/example.com.conf.j2)
server {
listen 80;
server_name example.com;
root {{ website_dir }};
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
运行 Playbook
执行以下命令运行 Playbook:
ansible-playbook -i inventory.ini playbook.yml
高级功能示例
变量文件 (vars.yml)
website_dir: /var/www/production.com
index_content: "Welcome to Production"
包含角色的 Playbook
---
- name: Deploy web stack
hosts: webservers
become: yes
roles:
- nginx
- firewall
条件任务
- name: Install debug tools on dev servers
apt:
name: htop
state: present
when: "'dev' in group_names"
使用 with_items 或 loop 进行迭代
在 Ansible Playbook 中,with_items 或 loop 用于对列表或字典进行迭代操作。with_items 是较旧的语法,而 loop 是 Ansible 2.5 之后推荐的现代语法。
示例:迭代列表
- name: Install multiple packages
ansible.builtin.apt:
name: "{{ item }}"
state: present
loop:
- nginx
- mysql-server
- php
示例:迭代字典
- name: Add users
ansible.builtin.user:
name: "{{ item.name }}"
uid: "{{ item.uid }}"
group: "{{ item.group }}"
loop:
- { name: "user1", uid: 1001, group: "admin" }
- { name: "user2", uid: 1002, group: "dev" }
使用 Templates 模块动态生成文件
template 模块结合 Jinja2 模板引擎,可以动态生成配置文件。
示例:生成 Nginx 配置文件
- name: Configure Nginx
ansible.builtin.template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
owner: root
group: root
mode: "0644"
Jinja2 模板示例 (nginx.conf.j2)
server {
listen 80;
server_name {{ server_name }};
root {{ web_root }};
}
使用 Tags 模块优化任务执行
Tags 允许选择性运行 Playbook 中的特定任务,适合调试或部分更新场景。
示例:标记任务
- name: Install Nginx
ansible.builtin.apt:
name: nginx
state: present
tags: nginx
- name: Install MySQL
ansible.builtin.apt:
name: mysql-server
state: present
tags: mysql
运行特定标记的任务
ansible-playbook playbook.yml --tags "nginx"
使用 Roles 模块组织复杂 Playbook
Roles 将 Playbook 拆分为可复用的结构,适合大型项目。
目录结构示例
roles/
webserver/
tasks/
main.yml
templates/
nginx.conf.j2
handlers/
main.yml
vars/
main.yml
示例 Role 任务 (roles/webserver/tasks/main.yml)
- name: Install Nginx
ansible.builtin.apt:
name: nginx
state: present
- name: Deploy Nginx config
ansible.builtin.template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
在 Playbook 中调用 Role
- hosts: web_servers
roles:
- webserver
最佳实践
- 使用
ansible-lint检查 Playbook 语法 - 将敏感数据存储在
ansible-vault加密文件中 - 使用
tags标记任务以便选择性运行 - 遵循 Ansible Galaxy 的目录结构标准
总结
Ansible通过Inventory和Playbook的组合,提供了一种灵活且强大的自动化解决方案。Inventory文件清晰地组织目标主机,而Playbook以声明式的方式定义任务流程,使运维工作变得可重复、可维护。
通过合理设计Playbook,可以实现模块化、可复用的自动化脚本,显著提升运维效率。无论是简单的服务器配置,还是复杂的多阶段部署,Ansible都能以一致且可靠的方式完成任务。掌握这些工具的使用,将为团队带来更高的生产力和更稳定的系统环境。









