Ansible 入门教程:从零开始掌握自动化运维

艺帆风顺 发布于 2025-04-07 17 次阅读


1. Ansible 的基本概念与特点

1.1 什么是 Ansible?

Ansible 是一款开源的自动化工具,广泛应用于配置管理、应用部署、任务自动化以及多节点管理等领域。它由 Michael DeHaan 于 2012 年创建,ansible目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。是每位运维工程师必须掌握的技能之一。

1.2 Ansible 的核心特点

1.2.1 无代理架构

Ansible 的无代理架构意味着不需要在被管理的节点上安装任何专门的代理软件。它通过 SSH与被控节点通信,实现任务的执行和数据的传输。

优点:

  • 简化部署:无需在每个被控节点上安装和维护代理程序,减少运维工作量。
  • 提高安全性:减少了潜在的攻击面,因为不需要开放额外的端口或运行额外的服务。
  • 节省资源:避免了代理软件占用系统资源的问题。

1.2.2 基于 SSH

Ansible 通过 SSH 协议与被控节点进行通信,这使得它能够在大多数类 Unix 系统(如 Linux、BSD、macOS)上无缝运行。同时,Ansible 也支持 Windows 主机,通过 PowerShell 或 WinRM 进行管理。

优势:

  • 广泛兼容性:支持多种操作系统,无需额外配置。
  • 安全性高:利用现有的 SSH 安全机制,确保数据传输的机密性和完整性。

1.2.3 声明式任务定义

Ansible 使用声明式语言(YAML)定义任务,描述目标状态而非具体的执行步骤。这种方式使得配置更加直观、易读,同时减少了错误和不一致性。

特点:

  • 可读性强:YAML 格式简洁明了,易于理解和编写。
  • 可重用性高:通过 Playbook 和角色(Roles)的复用,实现复杂任务的模块化管理。
  • 幂等性:确保多次运行相同的任务不会导致不一致的状态。

2. Ansible 的安装

2.1 支持的操作系统

  • 控制节点:主要支持 Linux 发行版(如 Ubuntu、CentOS、Debian)、macOS,以及通过 WSL 在 Windows 上运行。
  • 被控节点:支持几乎所有类 Unix 系统(Linux、BSD、macOS 等),部分模块支持 Windows 系统。

2.2 安装方法

Ansible 提供了多种安装方式,适应不同的操作系统和需求。以下是常见的安装方法:

方法 1:通过系统包管理器安装

在 Ubuntu/Debian 上安装

apt install ansible -y

在 CentOS/RHEL 上安装

yum install ansible -y

在 RockyLinux9上安装

yum install ansible-core -y

查看版本信息:

方法 2:通过 pip 安装

安装步骤
1、安装 Python 和 pip(如果尚未安装):

在 Ubuntu/Debian:

apt install python3 python3-pip -y

在 CentOS/RHEL:

sudo yum install python3 python3-pip -y

2、使用 pip 安装 Ansible:

pip3 install ansible

3. 控制节点和被控节点做免密登录

控制节点是运行 Ansible 的主机,负责发送任务并收集结果。被控节点是被 Ansible 管理的主机,无需安装任何额外软件,仅需确保 SSH 服务正常运行,并具备必要的访问权限。

ssh-keygen -t rsa (三次回车,不输入其他信息)

复制本机公钥到其它被控节点

# 执行命令后,输入正确密码即可
ssh-copy-id root@10.0.0.25
ssh-copy-id root@10.0.0.26

测试连接:

# 如果免密做成功则无需密码即可登录
ssh root@10.0.0.25
ssh root@10.0.0.26

如果能够无密码登录,则配置成功。

4 主机清单

清单(Inventory)定义 Ansible 将要管理的一批主机。这些主机也可以分配到组中,以进行集中管理。组可以包含子组,主机也可以是多个组的成员。清单还可以设置应用到它所定义的主机和组的变量。

可以通过静态和动态两种方式定义主机清单。本文主要讲解静态的主机清单,静态主机清单是一个文本文件。

4.1 基本语法

  • [组名]:定义一组主机。
  • 主机名:每行定义一个主机,主机可以是 IP 或域名。
  • 变量:可以通过 key=value 的形式为主机或组添加变量。

4.2 清单配置示例

4.2.1:基本清单

[webservers]
10.0.0.25
10.0.0.26

[dbservers]
db1.example.com
db2.example.com

4.2.2:主机级别变量

[webservers]
10.0.0.25 ansible_user=admin ansible_port=2222
10.0.0.26 ansible_user=root

[dbservers]
db1.example.com ansible_host=10.1.1.100
db2.example.com ansible_host=10.1.1.101 ansible_user=postgres

常用内置变量:

变量名描述
ansible_host主机的实际 IP 或域名(默认为清单中定义的主机名)
ansible_user用于连接主机的用户(默认为当前用户)
ansible_portSSH 连接端口(默认为 22)
ansible_passwordSSH 密码(通常不推荐明文存储)
ansible_ssh_private_key_fileSSH 私钥文件路径。

4.2.3 组级别变量

组变量使用 [组名:vars] 定义:

[webservers]
10.0.0.25
10.0.0.26

[dbservers]
db1.example.com
db2.example.com

[webservers:vars]
ansible_user=admin
ansible_port=2222

[dbservers:vars]
ansible_user=postgres

4.2.4 嵌套组

可以通过 [子组名:children] 定义组嵌套:

[frontend]
web1.example.com
web2.example.com

[backend]
db1.example.com
db2.example.com

[web:children]
frontend
backend

# 表示 web 组包含 frontend 和 backend 两个子组。

4.3 主机清单常用命令

查看主机清单结构

[root@localhost ~]ansible-inventoy -i /etc/ansible/hosts  --list

[root@localhost ~]ansible all --list-hosts
  hosts (2):
    10.0.0.25
    10.0.0.26

-i 参数是指定主机清单位置,默认读取/etc/ansible/hosts文件

检查主机是否可用

[root@localhost ~]ansible all  -m ping
10.0.0.26 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python""/usr/bin/python3"
    },
    "changed"false,
    "ping""pong"
}
10.0.0.25 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python""/usr/bin/python3"
    },
    "changed"false,
    "ping""pong"
}

查看主机分组关系

[root@localhost ~]ansible-inventory  --graph
@all:
  |--@ungrouped:
  |--@web:
  |  |--10.0.0.25
  |  |--10.0.0.26

5. 配置文件详解

Ansible 的配置文件是 Ansible 的核心组件之一,用于定义其行为和控制方式。

5.1 ansible.cfg 文件说明

ansible.cfg 是 Ansible 的主配置文件,控制着 Ansible 的运行参数。配置文件可以存在于多个位置,

优先级从高到低如下:

  • 当前工作目录下的 ansible.cfg
  • 用户主目录下的 .ansible.cfg
  • 系统目录下的 /etc/ansible/ansible.cfg

5.2 初始化配置文件

在2.12版本后需要通过init来到处默认配置文件,之前的版本直接放置在/etc/ansible/ansible.cfg中

ansible-config init --disabled > ansible.cfg

5.3 常见配置项

配置项说明
inventory指定主机清单文件路径
remote_user默认远程连接的用户名,如果未指定则使用当前用户名称
private_key_file默认 SSH 私钥文件路径
ask_pass是否提示输入ssh密码,默认为false
roles_path指定角色(Roles)的搜索路径
library指定自定义模块的路径
forks并发连接数(控制并发任务的数量)
timeout连接超时时间(秒)
become默认是否启用特权提升
become_user默认提升到的用户,通常是 root。
become_method提权方法,如 sudo、su
gather_facts是否自动收集主机信息,默认为 True
module_utils自定义模块工具路径。
log_path指定日志文件路径

配置一个基础的ansible.cfg文件

[defaults]
inventory = /etc/ansible/hosts
remote_user = root
forks = 50
timeout = 30
gathering = smart
fact_caching_timeout = 86400

[privilege_escalation]
become = True
become_method = sudo
become_user = root
become_ask_pass = False

6 执行命令

在完成 Ansible 的安装和环境配置后,执行第一个命令以验证 Ansible 是否正常工作。

6.1 Ping 测试

Ping 测试用于验证 Ansible 能否成功连接到被控节点。使用内置的 ping 模块,这个模块不会真正发送 ICMP 包,而是执行一个简单的 Python 脚本在被控节点上返回 "pong"。

[root@localhost ~]ansible all -m ping
10.0.0.25 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python""/usr/bin/python3"
    },
    "changed"false,
    "ping""pong"
}
10.0.0.26 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python""/usr/bin/python3"
    },
    "changed"false,
    "ping""pong"
}

参数解释

  • all:作用于所有在 Inventory 文件中定义的主机。
  • -m ping:指定使用 ping 模块。

说明:

  • 每个被控节点返回一个 JSON 格式的结果。
  • changed: 表示任务是否更改了被控节点的状态。false 表示没有更改。
  • ping: 返回的内容,成功时为 "pong"。

6.2 运行 Shell 命令

Ansible 提供了 shell 和 command 模块,用于在被控节点上执行任意 Shell 命令。两者的区别在于 shell 模块通过 Shell 运行命令,支持管道和重定向,而 command 模块直接运行命令,不经过 Shell。

示例:检查系统运行时间

[root@localhost ~]ansible all -m shell -a "uptime"
10.0.0.25 | CHANGED | rc=0 >>
 20:57:47 up 4 days, 11:50,  2 users,  load average: 0.00, 0.03, 0.00
10.0.0.26 | CHANGED | rc=0 >>
 20:57:47 up 3 days,  9:10,  2 users,  load average: 0.10, 0.03, 0.01

本片文章先简单介绍一下ansible,接下来文章进一下全面展开讲解ansible相关知识点,敬请期待。

如有帮助,请点个赞和“在看”!如有不足,敬请指出!感谢你的关注与支持。

路虽远,行则将至!

事虽难,做则必成!共勉!


往期精彩文章