Ansible 学习笔记
简介
- 基于Python开发的自动化运维工具
- 集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点
- 基于模块工作,本身没有批量部署能力,批量部署由运行的模块实现
- 提供自动化运维框架
作用
- 批量系统配置
- 批量程序部署
- 批量运行命令
框架组成
- Connection Plugins:负责和被监控端实现通信
- Host Inventory:定义监控主机的配置文件
- 模块:
- 核心模块
- command模块
- 自定义模块
- 插件:完成记录日志邮件等功能
- Playbook:剧本,非必需,可让节点一次性运行多个任务
架构图
架构字段解释
- Ansible:核心程序
- Host Inventory:主机清单(可定义主机组和主机)
- 模块:实际执行任务的组件
- Playbook:Yaml定义的剧本文件(类似shell脚本)
- Connect Plugin:连接插件
工作原理
- 控制端通过inventory定义主机组
- 通过编写playbook或AD-HOC命令
- 使用SSH将模块推送到被控端
- 被控端执行任务(要求被控端有Python2环境)
- 任务完成后返回结果
命令执行过程
- 加载配置文件(/etc/ansible/ansible.cfg)
- 查找主机配置文件
- 加载对应模块文件
- 生成临时Python脚本并传输到远程主机
- 存储在远程主机的
~/.ansible/tmp/
目录 - 添加执行权限
- 执行并返回结果
- 删除临时文件
执行流程理解图
特性
- No Agents:无需在被控端安装客户端
- No Server:无服务端架构
- Modules in Any Languages:支持任意语言开发模块
- YAML:使用YAML语言编写playbook
- SSH by Default:默认基于SSH工作
- Multi-tier Solution:支持多级指挥
配置文件
配置文件优先级(从高到低):
- 项目目录下的
ansible.cfg
- 用户家目录下的
.ansible.cfg
- 默认的
/etc/ansible/ansible.cfg
主要配置项
1 | #inventory = /etc/ansible/hosts # 主机列表 |
优点
- 轻量级,客户端无需安装agent
- 批量任务可写成脚本且无需分发
- 基于Python,维护简单
- 支持sudo
环境搭建
主机规划
主机 | IP | 角色 |
---|---|---|
h1 | 192.168.50.60 | master |
h2 | 192.168.50.61 | host1 |
h3 | 192.168.50.62 | host2 |
h4 | 192.168.50.63 | host3 |
SSH免密登录配置
1 | ssh-keygen -t dsa -f ~/.ssh/id_dsa -P "" |
安装
1 | yum install -y ansible |
主机清单配置
1 | [hosts] |
测试
1 | ansible webservers -m command -a 'uptime' |
常用模块
setup模块
查看远程主机基本信息
1 | ansible webservers -m setup |
fetch模块
从主机获取文件
1 | ansible 192.168.50.61 -m fetch -a 'src=/root/t2 dest=/root' |
file模块
设置文件属性
选项:
force
: 强制创建软链接(yes|no)group
: 文件属组mode
: 文件权限owner
: 文件属主path
: 文件路径(必选)recurse
: 递归设置属性(仅目录)src
: 源文件路径(仅state=link时)dest
: 链接目标路径(仅state=link时)state
:directory
: 创建目录file
: 不创建文件link
: 创建软链接hard
: 创建硬链接touch
: 创建空文件或更新修改时间absent
: 删除文件/目录
示例:
1 | # 创建符号链接 |
copy模块
复制文件到远程主机
选项:
backup
: 覆盖前备份(yes|no)content
: 直接设置文件内容(替代src)dest
: 目标绝对路径(必选)directory_mode
: 递归设置目录权限force
: 强制覆盖(yes|no)src
: 本地源文件路径
示例:
1 | ansible hosts -m copy -a "src=/etc/ansible/ansible.cfg dest=/tmp/ansible.cfg owner=root group=root mode=0755" |
command模块
在远程主机执行命令
选项:
creates
: 文件存在时不执行free_form
: Linux命令chdir
: 执行前切换目录removes
: 文件不存在时不执行executable
: 指定shell路径
示例:
1 | ansible webservers -m command -a "ls -al /tmp" |
shell模块
支持管道操作的命令执行
示例:
1 | # 执行远程脚本 |
cron模块
管理计划任务
选项:
minute/hour/day/month/weekday
: 时间设置job
: 任务命令name
: 任务名称user
: 执行用户state
: present(添加)|absent(删除)
示例:
1 | # 创建任务 |
hostname模块
管理主机名
示例:
1 | # 修改主机名 |
yum模块
软件包管理
示例:
1 | # 安装tree |
service模块
服务管理
示例:
1 | # 启动ntpdate服务 |
group模块
用户组管理
示例:
1 | # 添加系统组 |
user模块
用户管理
选项:
name
: 用户名state
: present(新增)|absent(删除)force
: 删除时是否删除家目录system
: 是否系统用户uid
: 指定UIDshell
: 指定shellhome
: 指定家目录
示例:
1 | # 添加系统用户 |
YAML语法
- 数据序列化格式
- 基本结构:例如:
1
2
3
4key: value
- item1
- item2
- item3{name: jerry, age: 21}
Playbook
核心元素
- Tasks: 任务列表
- Variables: 变量
- Templates: 模板文件
- Handlers: 条件触发任务
- Roles: 角色
基础组件
Hosts
: 目标主机remote_user
: 执行用户sudo_user
: sudo用户tasks
: 任务列表
运行Playbook
1 | # 语法检查 |
示例
1. 添加用户和组
1 | - hosts: all |
2. 配置HTTP服务
1 | - hosts: hosts |
更多模块
synchronize
: 使用rsync同步文件raw
: 直接执行命令(类似shell)
模块帮助
# 列出所有模块
ansible-doc -l
# 查看模块帮助
ansible-doc -s MOD_NAME