自动化运维工具——ansible详解(一)

一、 核心概念与架构

1.1 什么是 Ansible?

Ansible 是一款基于 Python 开发的开源自动化运维工具,它集成了众多同类工具(如 Puppet, Chef, Fabric)的优点,能够实现批量系统配置、批量程序部署、批量运行命令等功能。

核心特性

  • 无代理架构:基于 SSH 协议与远程主机通信,无需在目标主机上安装任何客户端(Agent)
  • 模块化设计:功能由模块实现,Ansible 本身提供执行框架。
  • 简单易用:使用 YAML 语言编写 Playbook,学习曲线平缓。
  • 功能强大:拥有大量内置模块,覆盖日常运维的绝大部分场景。
  • 被红帽收购:已成为自动化运维领域的事实标准之一。
1.2 Ansible 架构

组件 说明
Ansible Core 核心引擎,负责解析 Playbook、调用模块、管理任务流。
Inventory 主机清单,定义 Ansible 需要管理的主机及其分组信息。
Playbooks “剧本”,YAML 格式文件,用于定义复杂、可重复的自动化任务序列。
Core Modules 核心模块,Ansible 自带的模块库,是执行具体操作(如文件管理、包管理)的单元。
Custom Modules 自定义模块,用户可用 Python 等语言编写,扩展 Ansible 功能。
Connection Plugins 连接插件,默认使用 SSH,也支持 WinRM、Docker 等其他连接方式。
1.3 任务执行模式
  • Ad-Hoc 模式(临时命令):使用 ansible 命令行工具执行单条命令或单个模块,适合快速、一次性的任务。
    1
    2
    ansible all -m ping
    ansible web_servers -m shell -a 'uptime'
  • Playbook 模式(剧本):使用 ansible-playbook 执行 YAML 格式的 Playbook 文件,用于定义复杂的、可版本控制的自动化流程,是 Ansible 的主要使用方式。

二、 安装与基础配置

2.1 安装 Ansible

方式一:YUM 安装(推荐用于 RHEL/CentOS)

1
2
3
4
# 1. 安装 EPEL 仓库
yum install epel-release -y
# 2. 安装 Ansible
yum install ansible -y

方式二:PIP 安装(适用于任何支持 Python 的系统)

1
2
3
4
# 1. 安装 pip
yum install python-pip -y
# 2. 使用 pip 安装 Ansible
pip install ansible

安装后目录结构(YUM安装)

  • 配置文件目录/etc/ansible/
  • 执行文件目录/usr/bin/
  • 模块库目录/usr/lib/pythonX.X/site-packages/ansible/
2.2 配置文件 (ansible.cfg)

Ansible 按以下顺序查找配置文件(后者覆盖前者):

  1. 环境变量 ANSIBLE_CONFIG 指定的文件。
  2. 当前目录下的 ./ansible.cfg
  3. 用户家目录下的 ~/.ansible.cfg
  4. 系统默认的 /etc/ansible/ansible.cfg

常见配置项/etc/ansible/ansible.cfg):

1
2
3
4
5
6
7
[defaults]
inventory = /etc/ansible/hosts # 主机清单文件路径
library = /usr/share/ansible # 模块库路径
remote_user = root # 默认远程连接用户
host_key_checking = False # 首次连接不检查主机密钥(方便测试)
timeout = 10 # SSH 连接超时时间(秒)
log_path = /var/log/ansible.log # 启用日志记录(默认不记录)
2.3 主机清单 (inventory)

主机清单文件(默认为 /etc/ansible/hosts)定义了被管理的主机,支持分组和变量定义。

基本语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 1. 直接定义主机(IP 或主机名)
192.168.1.101
web01.example.com

# 2. 定义主机组
[web_servers]
192.168.1.101
192.168.1.102

[db_servers]
db01.example.com
db02.example.com

# 3. 嵌套组和变量
[datacenter:children] # 定义一个父组,包含其他组
web_servers
db_servers

[web_servers:vars] # 为 web_servers 组设置变量
ansible_user = deploy
http_port = 8080
2.4 配置 SSH 免密登录

为了执行流畅,建议配置控制节点到所有被管节点的 SSH 密钥认证。

1
2
3
4
5
6
7
# 1. 在控制节点生成密钥(如果尚未生成)
ssh-keygen -t rsa

# 2. 将公钥分发到所有被管节点
ssh-copy-id root@192.168.1.101
ssh-copy-id root@192.168.1.102
# 或使用脚本批量分发

三、 命令行工具与 Ad-Hoc 模式

3.1 Ansible 核心命令集
命令 用途
ansible 执行 Ad-Hoc 命令的核心工具。
ansible-doc 查看模块文档和帮助信息。
ansible-playbook 执行 Playbook 剧本。
ansible-vault 加密/解密敏感数据文件。
ansible-galaxy 从 Galaxy 社区下载/管理 Roles。
ansible-console 交互式命令行界面。
ansible-pull 拉取模式(较少使用)。
3.2 ansible 命令详解

基本语法ansible <主机模式> -m <模块名> -a "<模块参数>" [选项]

常用选项

选项 说明
-i INVENTORY 指定自定义的主机清单文件。
-m MODULE 指定要执行的模块(默认为 command)。
-a ARGS 传递给模块的参数。
-u REMOTE_USER 指定远程连接用户。
-k 提示输入 SSH 密码。
-K 提示输入 sudo 密码。
-b, --become 提权执行(通常用 sudo)。
--become-user USER 提权到指定用户。
-f FORKS 并行执行的任务数(默认5)。
-v, -vv, -vvv 输出更详细的执行信息。

示例

1
2
3
4
5
6
7
8
# 测试所有主机的连通性
ansible all -m ping

# 在所有 web 服务器上执行 shell 命令
ansible web_servers -m shell -a "uptime"

# 使用 sudo 安装软件包
ansible db_servers -m yum -a "name=mysql-server state=present" -b -K
3.3 ansible-doc 命令

用于查询模块的详细用法。

1
2
3
4
5
6
# 列出所有可用模块
ansible-doc -l

# 查看指定模块的详细帮助和示例
ansible-doc -s yum # 查看概要
ansible-doc yum # 查看完整文档(包含示例)
3.4 Ansible 执行流程(Ad-Hoc)
  1. 加载配置(ansible.cfg)。
  2. 解析主机清单(inventory),确定目标主机。
  3. 加载指定模块。
  4. 生成临时 Python 脚本,并通过 SFTP/SCP 传输到目标主机的 ~/.ansible/tmp/ 目录。
  5. 在目标主机上执行该脚本。
  6. 返回执行结果,并删除临时脚本。

四、 常用核心模块详解

4.1 连接测试模块:ping

用于测试与目标主机的连通性及 Ansible 环境是否正常。

1
ansible all -m ping

返回 pong 即表示成功。

4.2 命令执行模块:command & shell
  • command 模块:执行简单的命令,不支持管道 |、重定向 >、环境变量 $HOME 等 Shell 特性。是默认模块。
    1
    ansible web -m command -a "ls -l /var/www"
  • shell 模块:通过 /bin/sh 执行命令,支持所有 Shell 特性
    1
    ansible web -m shell -a "ps aux | grep nginx"

常用参数

  • chdir:在执行命令前,先切换到此目录。
  • creates:如果此路径的文件存在,则不执行命令。
  • removes:如果此路径的文件不存在,则不执行命令。
4.3 文件管理模块:copy

将本地文件复制到远程主机。

1
ansible web -m copy -a "src=/etc/nginx/nginx.conf dest=/etc/nginx/nginx.conf owner=root group=root mode=0644"

常用参数

  • src:本地源文件路径(可以是目录)。
  • dest:远程目标路径(必须是绝对路径)。
  • owner/group/mode:设置文件属主、属组和权限。
  • backup=yes:覆盖前备份原文件。
  • content:直接用字符串内容创建文件,替代 src
4.4 文件属性模块:file

管理文件、目录、链接的属性。

1
2
3
4
5
6
7
8
9
10
11
# 创建目录
ansible web -m file -a "path=/app/data state=directory mode=0755"

# 创建软链接
ansible web -m file -a "src=/etc/nginx.conf dest=/app/nginx.conf state=link"

# 删除文件或目录
ansible web -m file -a "path=/tmp/old.log state=absent"

# 修改属主和权限
ansible web -m file -a "path=/app/www owner=www group=www mode=755"

state 参数

  • directory:创建目录。
  • touch:创建空文件或更新时间戳。
  • link / hard:创建软/硬链接。
  • absent:删除。
4.5 包管理模块:yum (RHEL/CentOS)

管理软件包。

1
2
3
4
5
6
7
8
9
10
11
# 安装最新版
ansible web -m yum -a "name=nginx state=latest"

# 安装指定版本
ansible web -m yum -a "name=nginx-1.20.1 state=present"

# 卸载软件包
ansible web -m yum -a "name=nginx state=absent"

# 更新所有包
ansible web -m yum -a "name=* state=latest"

state 参数

  • presentinstalled:确保安装。
  • latest:确保安装最新版。
  • absentremoved:确保卸载。
4.6 服务管理模块:service

管理系统服务。

1
2
3
4
5
6
7
8
# 启动服务并设置开机自启
ansible web -m service -a "name=nginx state=started enabled=yes"

# 重启服务
ansible web -m service -a "name=nginx state=restarted"

# 停止服务
ansible web -m service -a "name=nginx state=stopped"
4.7 用户管理模块:user

管理系统用户。

1
2
3
4
5
6
7
8
# 创建用户
ansible db -m user -a "name=mysql uid=1001 group=mysql shell=/sbin/nologin"

# 删除用户并移除家目录
ansible db -m user -a "name=olduser state=absent remove=yes"

# 修改用户密码(需要已加密的密码字符串)
ansible db -m user -a 'name=test password="{{ \'mypassword\' | password_hash(\'sha512\') }}"'
4.8 计划任务模块:cron

管理 Cron 任务。

1
2
3
4
5
# 添加计划任务
ansible web -m cron -a 'name="Daily Backup" minute="0" hour="2" job="/opt/backup.sh"'

# 删除计划任务
ansible web -m cron -a 'name="Daily Backup" state=absent'
4.9 信息收集模块:setup

收集目标主机的详细信息(Facts),这些信息可以作为变量在 Playbook 中使用。

1
2
3
4
5
6
7
8
# 收集所有信息
ansible web -m setup

# 过滤收集特定信息(如内存)
ansible web -m setup -a 'filter="ansible_memory_mb"'

# 将收集的信息保存到本地文件
ansible web -m setup --tree /tmp/facts/
4.10 其他实用模块
  • **fetch**:从远程主机拉取文件到控制节点。
  • **script**:在远程主机上执行控制节点本地的脚本。
  • **group**:管理系统用户组。
  • **get_url**:从 HTTP/FTP 下载文件。
  • **unarchive**:解压文件。

五、 总结与后续

本文涵盖了 Ansible 的基础知识、安装配置、Ad-Hoc 命令以及最常用的核心模块。掌握这些内容是使用 Ansible 进行自动化运维的第一步。

核心要点回顾

  1. 无代理、基于 SSH 是 Ansible 的基石。
  2. Inventory 定义了“对谁操作”。
  3. 模块 定义了“执行什么操作”。
  4. Ad-Hoc 用于快速执行单次任务。
  5. Playbook 是用于复杂、可重复任务的强大工具(将在后续文章中详述)。

下一步学习建议

  1. 深入 Playbook:学习 YAML 语法、任务结构、变量、循环、条件判断等。
  2. 理解 Roles:用于组织和复用 Playbook 的最佳实践。
  3. 使用 Ansible Vault:加密管理密码等敏感数据。
  4. 探索 Ansible Galaxy:从社区获取现成的 Roles。
  5. 学习高级特性:如动态 Inventory、回调插件、自定义模块等。

通过结合 Ad-Hoc 命令的灵活性和 Playbook 的强大编排能力,Ansible 能够帮助您高效、可靠地管理从几台到上万台服务器的运维工作。