当前位置: 首页 > news >正文

Ansible入门指南——自动化运维的第一步

为什么选择Ansible?

想象一下这样的场景:你需要同时在10台服务器上安装Nginx,配置防火墙,部署代码。传统方式是一台台SSH登录操作,耗时且容易出错。Ansible就是为解决这种批量服务器管理而生的自动化工具。

与其他自动化工具相比,Ansible的主要优势:

· 无代理:通过SSH管理,无需在被管理节点安装客户端
· 简单易学:基于YAML语法,接近自然语言
· 幂等性:多次执行同一任务,结果一致
· 模块化设计:丰富的模块满足各种需求

Ansible核心架构

[控制节点]
↓ (SSH)
[被管理节点1] [被管理节点2] [被管理节点3]

控制节点:运行Ansible命令的机器,需要安装Python
被管理节点:被Ansible管理的服务器,只需要支持SSH和Python

环境准备与安装

1. 控制节点安装(Ubuntu示例)

# 更新包索引
sudo apt update

# 安装Ansible
sudo apt install ansible -y

# 验证安装
ansible --version
# 应显示:ansible 2.9.x

# 安装Tree(可选,方便查看目录结构)
sudo apt install tree -y

2.配置SSH免密登录

# 生成SSH密钥(如果还没有)
ssh-keygen -t rsa -b 2048

# 复制公钥到被管理节点(需要输入密码)
ssh-copy-id user@server1
ssh-copy-id user@server2

# 测试连接
ssh server1 "hostname" # 应无密码登录并返回主机名

3.创建Ansible工作目录

mkdir -p ~/ansible-project/{inventory,group_vars,host_vars,playbooks,roles}
cd ~/ansible-project
tree .
# 应显示:
# .
# ├── group_vars
# ├── host_vars
# ├── inventory
# ├── playbooks
# └── roles

基础配置:清单文件详解

Ansible通过清单文件(Inventory) 定义管理哪些主机。创建 inventory/hosts:

# inventory/hosts - 主机清单文件

# 按环境分组
[web_servers]
web1 ansible_host=192.168.1.101 ansible_user=ubuntu
web2 ansible_host=192.168.1.102 ansible_user=ubuntu

[db_servers]
db1 ansible_host=192.168.1.111 ansible_user=ubuntu

# 按地理位置分组
[shanghai:children]
web_servers

[beijing:children]
db_servers

# 所有主机
[all_servers:children]
web_servers
db_servers

# 组变量(也可以在group_vars中定义)
[web_servers:vars]
http_port=80
max_requests_per_child=500

[db_servers:vars]
db_port=3306

重要概念:

· [] 定义主机组
· ansible_host 指定IP地址
· ansible_user 指定连接用户
· :children 创建组嵌套
· :vars 定义组变量

必备的Ad-hoc命令(临时命令)

Ad-hoc命令适合快速执行简单任务,无需编写Playbook。

1. 基础连接测试

# 测试所有主机连通性
ansible all -i inventory/hosts -m ping

# 测试特定组
ansible web_servers -i inventory/hosts -m ping

# 测试单个主机
ansible web1 -i inventory/hosts -m ping

# 使用别名文件简化(创建ansible.cfg)
echo -e "[defaults]\ninventory = ./inventory/hosts" > ansible.cfg
# 之后可以省略 -i 参数
ansible all -m ping

2.常用模块示例

# 1. 执行shell命令
ansible web_servers -m shell -a "uptime && whoami"

# 2. 管理服务
ansible web_servers -m service -a "name=nginx state=started"
ansible web_servers -m service -a "name=nginx state=restarted"
ansible web_servers -m service -a "name=nginx state=stopped"

# 3. 管理软件包
ansible web_servers -m apt -a "name=nginx state=present" # Ubuntu
ansible web_servers -m yum -a "name=nginx state=present" # CentOS

# 4. 文件操作
ansible web_servers -m file -a "path=/tmp/test mode=755 state=directory"
ansible web_servers -m file -a "path=/tmp/test.txt state=touch"
ansible web_servers -m file -a "path=/tmp/test state=absent" # 删除

# 5. 复制文件
ansible web_servers -m copy -a "src=./config.txt dest=/tmp/config.txt owner=root mode=644"

# 6. 获取主机信息
ansible web_servers -m setup # 收集所有facts
ansible web_servers -m setup -a "filter=ansible_distribution*" # 过滤显示

3.高级Ad-hoc用法

# 并行执行(默认5个并行)
ansible all -m ping -f 10 # 10个并行

# 以特定用户执行
ansible all -m shell -a "whoami" --become --become-user=root

# 限制执行主机
ansible all -m ping --limit "web1"
ansible all -m ping --limit "web_servers:&shanghai"

# 查看模块帮助
ansible-doc ping
ansible-doc -l | grep -i service # 查找模块

Ansible配置优化

创建ansible.cfg配置文件:

# ansible.cfg - 主配置文件
[defaults]
# 清单文件路径
inventory = ./inventory/hosts

# SSH连接设置
host_key_checking = False # 禁用密钥检查(测试环境)
timeout = 10
retries = 3

# 并行设置
forks = 20 # 并发数

# 日志记录
log_path = ./ansible.log

# 性能优化
gathering = smart # 智能收集facts
fact_caching = jsonfile
fact_caching_connection = ./facts_cache
fact_caching_timeout = 3600

# 安全设置
sudo_user = root
allow_world_readable_tmpfiles = False

[ssh_connection]
# SSH优化
ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o Compression=yes
pipelining = True # 提高执行速度
control_path = %(directory)s/ansible-ssh-%%h-%%p-%%r

速查表:20个最常用命令

# 连接测试
ansible all -m ping

# 执行命令
ansible all -m shell -a "命令"

# 文件管理
ansible all -m file -a "path=路径 state=directory/file/absent"
ansible all -m copy -a "src=源文件 dest=目标文件"

# 包管理
ansible all -m apt -a "name=包名 state=present/absent/latest" # Ubuntu
ansible all -m yum -a "name=包名 state=present/absent/latest" # CentOS

# 服务管理
ansible all -m service -a "name=服务名 state=started/stopped/restarted"

# 用户管理
ansible all -m user -a "name=用户名 state=present/absent"

# 权限提升
ansible all -m shell -a "需要root的命令" --become

总结

Ansible的Ad-hoc命令是你的自动化瑞士军刀。记住这些要点:

1. 从简单开始:先用Ad-hoc命令自动化重复任务
2. 测试为先:使用--check和--diff预览更改
3. 逐步复杂:当Ad-hoc命令变得复杂时,就是时候写Playbook了

http://www.jsqmd.com/news/116121/

相关文章:

  • 我发现Zstd压缩级太高内存涨 后来调level参数优化平衡
  • 研究生必备!9个AI写论文工具,10分钟生成1万字问卷类论文含真实参考文献
  • 从入门到精通:大模型赋能千行百业的百万元级AI解决方案价值图谱
  • 【毕设】车辆故障管理系统的设计实现(任务书+文献综述+答辩PPT+论文)
  • 代码挑战:构建一个支持“并发安全”的防抖 Hook,确保在 transition 期间不会丢弃最后的更新
  • 2025大模型完全指南:从零基础到月薪30K+的AI工程师之路_全网最新首发AI大模型入门教程(非常详细)
  • 【毕设】基于深度学习的交通标识识别系统的设计与实现 (开题+任务书+论文+答辩PPT)
  • AI元人文构想:迈向人类与AI的意义共治
  • 【C2000系列DSP的Bootloader详解】如何利用脚本自动生成Hex/Bin/S19文件
  • 深度解析:为什么 React 不允许在 `useEffect` 里同步调用导致重渲染的 `setState`?
  • Flutter与OpenHarmony订单列表组件开发指南
  • 火山引擎 MongoDB 进化史:从扛住抖音流量洪峰到 AI 数据底座 - 指南
  • 【C2000系列DSP的反向灌电流】为什么热插拔的时候I2C总线电平会被拉低?
  • 代码实战:利用 `useSyncExternalStore` 实现一个支持“时间旅行”的全局状态管理器
  • Flutter与OpenHarmony购物车组件完整实现
  • 【C2000系列DSP的Bootloader详解】实现过程、流程图与示例代码
  • 手写实现 `useLazyValue`:一个只有在组件真正进入视口时才进行昂贵计算的自定义 Hook
  • 二叉树的前中后和层序遍历
  • SchoolDash Alpha冲刺随笔4 - Day 7
  • 微观交通流仿真软件:AIMSUN_(13).案例研究与实践
  • 跟着Datawhale动手学Ollama - TASK3: Ollama API 的使用
  • 【C2000系列DSP的Bootloader详解】如何利用脚本自动合并hex文件
  • 【C2000系列DSP的Bootloader详解】如何利用脚本自动合并Bin文件
  • 016.递归枚举
  • 微观交通流仿真软件:AIMSUN_(15).用户界面与操作
  • 切木棍最小成本方法
  • C语言 文件的操作
  • 曼哈顿距离与切比雪夫距离的互相转化 小记
  • 微观交通流仿真软件:AIMSUN_(16).交通规划应用
  • InoProShop汇川程序学习笔记(一、轴的快速调试)