Ansible-基础
- 官方文档:https://docs.ansible.com/
- Ansible Galaxy:共享 Playbook 和角色的社区平台
- GitHub 仓库:https://github.com/ansible/ansible
Ansible 是一款功能强大的开源自动化运维工具,广泛应用于配置管理、应用部署、任务自动化和多节点管理等领域。下面我将从多个方面详细介绍 Ansible 的核心概念、特点、架构和使用方法。
Ansible 概述
Ansible 是由 Michael DeHaan 于 2012 年创建的自动化工具,名称来源于科幻小说《安德的游戏》中的即时通信工具。2015 年 10 月,Red Hat 以 1.5 亿美元收购了 Ansible。
Ansible 基于 Python 语言开发,使用 Paramiko 和 PyYAML 两个关键模块构建。它集合了众多运维工具的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
Ansible 核心特点
无代理架构:Ansible 不需要在被控节点上安装任何代理软件,通过 SSH 协议与被控节点通信。这简化了部署,提高了安全性,并节省了系统资源。
基于模块工作:Ansible 本身没有批量部署的能力,真正执行任务的是各种模块。Ansible 提供了大量内置模块,也支持自定义模块。
幂等性:Ansible 的绝大多数模块都具备幂等性,即多次执行同一操作对系统的影响是一致的。例如停止一个已经停止的服务不会产生任何影响。
声明式语法:使用 YAML 格式的 Playbook 描述期望的系统状态,Ansible 会自动确保系统达到该状态。
易于学习和使用:Ansible 的语法简单直观,学习曲线平缓。
Ansible 架构与工作原理
Ansible 的核心组件
- 控制节点:运行 Ansible 的机器,负责发送任务指令。
- 被管理节点:需要被配置或管理的目标机器。
- 主机清单(Inventory):记录所有被管理节点及其分组信息。
- 模块(Modules):执行具体操作的核心组件。
- Playbook:YAML 格式的任务定义文件。
- 插件(Plugins):扩展 Ansible 功能的组件。
Ansible 的工作流程
- 解析主机清单确定目标节点
- 通过 SSH 连接被管理节点
- 根据 Playbook 执行相应模块和任务
- 收集并返回执行结果
Ansible-安装与配置
安装方法
# 在 CentOS/RHEL 上安装
yum --y install epel-release
# openEuler 直接安装
yum -y install ansible
# 在 Ubuntu/Debian 上安装
apt update
apt install software-properties-common
apt-add-repository --yes --update ppa:ansible/ansible
apt install ansible
# 通过 pip 安装
pip3 install ansible
# 查看版本
ansible --version第一次ask确认取消
Ansible第一次通信的时候会有客户端key确认,可以有如下两种方式避免
修改ansible.cfg(推荐)
vi /etc/ansible/ansible.cfg
# 其实就是把#去掉
# host_key_checking = False修改ssh_config
vi /etc/ssh/ssh_config
# 将ask改成no
StrictHostKeyChecking no
# 重启ssh服务
systemctl restart sshd配置 SSH 免密登录
为了便于管理,建议配置控制节点到被控节点的 SSH 免密登录:
# 生成密钥对
ssh-keygen -t rsa -f ~/.ssh/id_rea -C "免密登录"
# 分发公钥
ssh-copy-id root@被控节点IP主机清单配置
主机清单文件通常位于 /etc/ansible/hosts,修改ansible.cfg中的inventory参数指定自定义的主机清单位置。
配置文件优先级
Ansible会按照以下顺序查找主机清单文件:
- 命令行通过
-i参数指定的文件 ANSIBLE_CONFIG环境变量指定的配置文件中的inventory设置- 当前目录下的
ansible.cfg中定义的inventory - 用户家目录下的
.ansible.cfg中定义的inventory /etc/ansible/ansible.cfg中定义的inventory- 默认的
/etc/ansible/hosts
主机与组定义方法
基本主机定义
# 单台主机定义
192.168.1.1
host1.example.com主机组定义
使用中括号[]定义组名,组内主机可以按行列出
[webservers]
web1.example.com
web2.example.com
192.168.1.10
[dbservers]
db1.example.com
db2.example.com主机范围定义
对于连续编号的主机,可以使用范围表示法简化配置
[webservers]
web[01:50].example.com # web01到web50
[dbservers]
db-[a:f].example.com # db-a到db-f嵌套组定义
使用:children后缀定义组嵌套关系
[production:children]
webservers
dbservers
[webservers]
web1.example.com
[dbservers]
db1.example.com这表示production组包含webservers和dbservers两个子组
YAML格式定义
主机清单也支持YAML格式,特别适合复杂嵌套结构
all:
hosts:
192.168.1.60:
192.168.1.61:
children:
webservers:
hosts:
web1.example.com:
web2.example.com:
dbservers:
hosts:
db1.example.com:
db2.example.com:连接参数配置
主机连接参数
可以为每台主机单独指定连接参数
host1 ansible_host=192.168.1.10 ansible_port=2222 ansible_user=admin
host2 ansible_host=192.168.1.11 ansible_user=root ansible_password=123456常用连接参数包括:
ansible_host:实际连接的主机地址ansible_port:SSH端口,默认22ansible_user:SSH用户名ansible_password:SSH密码(不推荐明文存储)ansible_ssh_private_key_file:SSH私钥路径ansible_connection:连接类型(ssh, paramiko, local等)
组连接参数
使用[groupname:vars]为整个组设置变量
[webservers]
web1.example.com
web2.example.com
[webservers:vars]
ansible_user=admin
ansible_port=2222
ansible_ssh_pass=password123
ansible_python_interpreter=/usr/bin/python3 # 指定Python解释器变量定义
主机变量
直接在主机后定义变量
host1 ansible_host=192.168.1.10 http_port=8080组变量
使用[groupname:vars]定义组变量
[webservers]
web1.example.com
web2.example.com
[webservers:vars]
nginx_version=1.18.0
max_connections=1000变量文件
可以将变量存储在单独的文件中,放在以下目录
host_vars/:主机变量,文件名与主机名相同group_vars/:组变量,文件名与组名相同
变量文件支持YAML或JSON格式
# group_vars/webservers
nginx_version: 1.18.0
max_connections: 1000主机选择模式
基本选择
ansible all -m ping # 选择所有主机
ansible webservers -m ping # 选择webservers组
ansible host1 -m ping # 选择单个主机模式匹配
ansible 'web*' -m ping # 选择名称以web开头的主机
ansible '192.168.1.*' -m ping # 选择192.168.1网段的主机逻辑运算
ansible 'webservers:dbservers' -m ping # webservers或dbservers
ansible 'webservers:&production' -m ping # 同时在webservers和production组的主机
ansible 'webservers:!production' -m ping # 在webservers但不在production组的主机正则表达式
ansible '~(web|db).*\.example\.com' -m ping # 匹配web或db开头,以.example.com结尾的主机特殊组
Ansible有两个内置的特殊组
all:包含清单中的所有主机ungrouped:包含不属于任何自定义组的主机
