本专栏文章持续更新,新增内容使用蓝色表示。
对于系统管理员而言,手动管理每一台服务器不仅维护难度极大,而且即使经验丰富,也难免出现疏忽和错误。
自动化技术能有效避免因手动管理系统和基础架构而产生的各类问题。其优点包括:
基础设施即代码 (IaC):将CPU、内存、网络、存储(如虚拟机的网卡、PVC逻辑卷)等底层基础设施的配置和管理通过代码来定义和实现,从而使其可版本化、可重复、可审计。
状态清晰可见:代码化的配置易于阅读和理解,便于快速掌握整个系统的状态。
高效的版本控制:所有自动化代码(如Ansible Playbook)均可使用Git等版本控制系统进行管理。
契合DevOps最佳实践:自动化是DevOps文化的核心组成部分,它通过促进开发与运维的协作,实现了与CI/CD流程的无缝集成。
减少人为错误:通过自动执行重复性任务,显著降低了因手工操作导致的故障风险。
1. 什么是 Ansible?
Ansible 是一款开源的自动化平台。它使用一种基于YAML的简单自动化语言(Playbook)来描述IT应用架构,并通过其自动化引擎来执行这些脚本。Ansible基于Python开发,采用声明式模型,用户只需定义系统的期望状态,Ansible会自动判断如何实现该状态。
2. Ansible的设计理念
简单易用、人性化、声明式(与Kubernetes的设计理念相似),其核心功能通过模块(Modules)实现,扩展功能则通过插件(Plugins)实现。
3. Ansible 的优点
人类可读的自动化:其Playbook采用YAML文本文件编写,语法简单,易于阅读、理解和协作维护。
全面的自动化能力:它是一款能够对应用程序生命周期(从部署、配置管理到编排)进行完整管理的自动化引擎。
无需代理:无需在目标主机上安装额外代理程序,通过SSH(Linux)或WinRM(Windows)协议进行安全高效的通信,降低了维护复杂性并增强了安全性。
跨平台支持:可统一管理Linux、Windows、网络设备及云资源。
环境即文档:Playbook本身即可清晰描述和记录IT环境的配置,实现了环境配置的文档化。
动态清单管理:管理的主机列表可以从外部资源动态更新。
集成与编排能力:Jenkins、Puppet、Red Hat Satellite等已有系统均可以被整合进 Ansible工作流。
4. Ansible的架构
Ansible 架构组成:控制节点和受管节点。
Ansible 软件仅在控制节点上安装和运行。受管节点被罗列在清单(Inventory)中,该清单文件和脚本位于控制节点上。
补充:控制节点在逻辑上只有一个,但在生产环境中为保障高可用性,通常会部署多个控制节点。其部署模式主要分为两种:按任务分工(如分环境、分团队)和构建完全冗余的高可用集群(由多个相同的实例组成,通过负载均衡器分发任务),旨在防止单点故障(SPOF),避免因控制节点崩溃而影响自动化作业,影响用户使用。
4.1 基础概念
Play:一个YAML格式的单元,针对指定的一组主机,按顺序执行一系列任务。可以将一个play类比成拍戏的一个场景。
Playbook:包含一个或多个 play 的YAML文件。
任务(Task): Play中的基本单位,调用一个模块(Module) 来执行特定操作。
注:此图仅为展示三者关系,生产上不建议一个 Playbook 包含多个Play(违反职责单一原则)。
模块(Module):由Ansible分发的、用各种语言编写的小段代码,用于确保系统某个特定方面达到期望状态。Ansible内置了数百个模块。
插件(Plugin): 扩展Ansible功能的代码片段。
Task、Play和Playbook均被设计为具有幂等性。这意味着可以在相同主机上多次安全地运行同一个Playbook。当系统已处于期望状态时,Ansible不会进行任何更改,仅报告 ok 状态而非 changed 状态。这是其声明式模式的核心体现。
4.2 Ansible 用例
配置管理、应用部署、资源调配(Provisioning)、持续交付(CI/CD)、安全与合规审计、服务编排(Orchestration)。
5. 清单 (inventory)
定义 Ansible 所要管理的受管节点。节点可以从属于一个或多个组,组用于对节点进行逻辑分类,标识主机的角色。
有两个特殊的主机组始终存在:all组(清单中列出的所有主机)和 ungrouped 主机组(清单中未定义在任何组(all 组除外)中的主机)。
主机清单定义方式:通过文本文件定义静态主机清单,或从外部 provider 生成动态主机清单。
5.1 静态主机清单
通常使用 INI 或 YAML 格式的文件定义(本文以 INI 格式示例)。
INI 格式示例:
每一部分的开头的方括号 [ ] 定义组名。
组名下方列出的每一行都是一个主机条目,可以是主机名、IP 地址或可解析的别名。
主机条目可以定义 Ansible 与该节点的通信方式。
补充:
1)子组:可以使用 :children 后缀来创建包含其他组的组,实现组的嵌套。
2)主机范围:可以使用 [start:end] 模式来定义连续的主机名或IP,以简化清单。
示例:web-server[01:10].example.com (匹配 web-server01 到 web-server10)
192.168.2.[1:50] (匹配 192.168.2.1 到 192.168.2.50)
[web_servers]
web01.example.com # 主机名
192.168.1.22 # IP 地址
server-pool-1 ansible_host=192.168.1.23 # 别名[db_servers]
db01.example.com
db02.example.com[production]
prod-web-01 ansible_host=10.0.1.10 ansible_user=deployer ansible_port=5922
prod-db-01 ansible_host=10.0.2.10 ansible_user=admin[datacenter_a:children] # 定义子组
web_servers
db_servers[load_balancers] # 使用主机范围模式
lb-[1:2].example.com[development]
dev-web-[01:03].example.com
dev-db-01.example.com
静态主机清单默认放在 /etc/ansible/hosts 文件中,但现在的微服务环境里通常将其定义到工作目录中。使用 ansible-navigator 命令可通过 --inventory PATHNAME(所需清单文件的路径) 或 –i PATHNAME 选项在命令行中指定清单文件的位置。
验证清单内容
使用 ansible-navigator inventory 命令验证计算机是否存在于清单中:
ansible-navigator inventory 自动化内容导航器,红帽 Ansible 自动化平台2提供,取代并扩展了多个命令行工具(e.g. ansible-playbook,ansible-config等)。
# 交互方式浏览主机和组
ansible-navigator inventory# -m 模式
ansible-navigator inventory -m stdout --host [主机名]# 列出所有清单内容
ansible-navigator inventory -m stdout --list# 列出组中主机
ansible-navigator inventory -m stdout --group [组名]# --graph选项 图形化输出清单结构
5.2 动态主机清单
Ansible 清单支持从外部系统动态生成,实时获取,对于管理现代云和容器化环境中频繁变动的基础设施至关重要。
动态清单来源:
云平台:AWS EC2、Microsoft Azure、Google Cloud Platform (GCP)、OpenStack、VMware vCenter 等。
配置管理数据库 (CMDB):ServiceNow、NetBox 等。
容器编排平台:Kubernetes、OpenShift。
动态清单脚本与插件:Ansible 通过清单插件 (Inventory Plugins) 来支持这些动态源。社区提供了大量官方维护的插件,用于从 AWS、OpenStack、VMware、Kubernetes 等常见平台获取主机、组和变量信息。
动态清单本身通常是一个可执行的脚本或由插件调用的源,它会向外部 API 查询信息,并将结果以正确的 JSON 格式输出给 Ansible,Ansible 再根据这些信息在内存中构建清单。
6. Ansible 配置文件
可在每个 Ansible 项目目录中创建和编辑以下两个配置文件:
1)ansible.cfg:配置 Ansible 的行为
2)ansible-navigator.yml:配置 ansible-navigator 命令的默认选项
配置文件可以有多种,当前使用哪一个配置文件,可使用以下方法查看:
1)使用 ansible --version 命令
显示安装的 Ansible 版本和当前生效的配置文件.
ansible --version
2)使用 -v (verbose) 选项
ansible-navigator run playbook.yml -v
3)查看 ansible-navigator 配置
# 查看当前生效的 navigator 配置
ansible-navigator config --mode stdout# 查看完整的配置信息
ansible-navigator config --mode stdout --help# 交互式查看,按Esc或键入:q退出
ansible-navigator config
6.1 ansible.cfg
由几个部分 (section) 组成,每一section 内容以键值对形式定义,section 的标题以方括号括起。以下基本配置项必须包含:
[defaults]:设置 Ansible 的默认值
[privilege_escalation]:配置 Ansible 如何在受管主机上执行特权升级(通常安装包时需要)
示例:
[defaults]
inventory = ./inventory # 清单文件路径
remote_user = user # 连接受管主机的默认用户名
ask_pass = false # 是否提示输入SSH密码,false表示使用SSH密钥认证[privilege_escalation]
become = true # 是否进行用户切换(提权)
become_method = sudo # 切换方法(使用sudo命令)
become_user = root # 切换目标用户
become_ask_pass = false # 是否提示输入become_method参数密码,默认false
ansible.cfg 优先级
Ansible 只使用最高优先级配置文件中的设置,忽略其它配置文件的设置。
优先级 | 配置文件路径 | 说明 |
---|---|---|
最高 | ./ansible.cfg | 当前项目目录下的配置文件 |
↓ | ~/.ansible.cfg | 当前用户家目录下的配置文件 |
最低 | /etc/ansible/ansible.cfg | 系统全局配置文件 |
使用 ansible-navigator 命令会自动在以上路径中查找,这些配置文件可以都不存在,或者部分存在,Ansible会有内置的默认值。
6.2 ansible-navigator 配置文件
该文件可以采用 JSON(.json) 和 YAML(.yaml / .yml) 格式,本文以 YAML 格式为例。
示例:
ansible-navigator:execution-environment: # 执行环境配置image: quay.io/ansible/ansible-navigator:latest # 执行环境镜像pull:policy: missing # 拉取策略:missing | always | neverplaybook-artifact:enable: false # 禁用工件
ansible-navigator.yml 优先级
优先级 | 配置来源 | 说明 |
---|---|---|
最高 | ANSIBLE_NAVIGATOR_CONFIG 环境变量 | 环境变量指定的配置文件路径 |
↓ | ./ansible-navigator.yml | 当前项目目录中的配置文件 |
最低 | ~/ansible-navigator.yml | 当前用户主目录中的配置文件 |
注意:以上路径中至少有一个存在!
预告下一篇
编写Ansible Playbook 并实施
如有问题或建议,欢迎在评论区中留言~