本专栏文章持续更新,新增内容使用蓝色表示。

对于系统管理员而言,手动管理每一台服务器不仅维护难度极大,而且即使经验丰富,也难免出现疏忽和错误。

自动化技术能有效避免因手动管理系统和基础架构而产生的各类问题。其优点包括:

  1. 基础设施即代码 (IaC):将CPU、内存、网络、存储(如虚拟机的网卡、PVC逻辑卷)等底层基础设施的配置和管理通过代码来定义和实现,从而使其可版本化、可重复、可审计。

  2. 状态清晰可见:代码化的配置易于阅读和理解,便于快速掌握整个系统的状态。

  3. 高效的版本控制:所有自动化代码(如Ansible Playbook)均可使用Git等版本控制系统进行管理。

  4. 契合DevOps最佳实践:自动化是DevOps文化的核心组成部分,它通过促进开发与运维的协作,实现了与CI/CD流程的无缝集成。

  5. 减少人为错误:通过自动执行重复性任务,显著降低了因手工操作导致的故障风险。

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 并实施


如有问题或建议,欢迎在评论区中留言~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/93868.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/93868.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/93868.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rs-fMRI_两篇文章中分析方法的梳理(近乎翻译)

文章一文章信息APOE ε4 influences within and between network functional connectivity in posterior cortical atrophy and logopenic progressive aphasia2024美国梅奥诊所发表在Alzheimers Dement. 的文章。“APOE ε4等位基因对后皮质萎缩与进行性语言障碍型失语症的网络…

在互联网大厂的Java面试:谢飞机的搞笑历险记

在互联网大厂的Java面试:谢飞机的搞笑历险记 在一个阳光明媚的早上,我们的主角,程序员谢飞机,走进了一家著名的互联网大厂,准备迎接他人生中最严峻的挑战——Java面试。 第一轮:基础技术面试 面试官&#x…

微软AD国产化替换倒计时——不是选择题,而是生存题

一直以来,微软Active Directory(AD)作为企业身份管理和访问控制的核心组件,承担着用户认证、权限分配、资源目录管理等基础职能。然而,随着政策、合规与网络安全压力不断加剧,AD面临着前所未有的挑战&#…

MyBatis-Plus MetaObjectHandler的几个坑(主要是id字段)

1.背景 主要是要实现一个id字段的自增长,不依赖数据库的能力(已避免后续换库的问题)。姑且使用redis作为表的id分配器,因此使用MyBatis-Plus MetaObjectHandler对每个insert的id进行分配。 2.实施过程 以下是实现过程 1.实现MetaO…

Springboot 项目配置多数据源

Springboot 项目配置多数据源 基础环境 java8、springboot2.2.13、mybatis、mysql5.x、oracle 项目配置 1.application.yml spring:datasource:mysql1:username: abcpassword: 123456url: jdbc:mysql://127.0.0.1:3306/panda?useUnicodetrue&characterEncodingUTF-8&z…

STM32_0001 KEILMDK V5.36 编译一个STM32F103C8T6说core_cm3.h文件找不到以及编译器版本不匹配的解决办法

KEILMDK V5.36 编译一个STM32F103C8T6说core_cm3.h文件找不到的解决办法利用KEILMDK V5.36 编译一个STM32F103C8T6说core_cm3.h文件找不到。主要错误信息如下D:/stm32studio/Armmdk/Packs/Keil/STM32F1xx_DFP/2.4.1/Device/Include\stm32f10x.h(486): error: core_cm3.h file n…

基于Transformer的机器翻译——训练篇

前言 还在为机器翻译模型从理论到落地卡壳?系列博客第三弹——模型训练篇强势登场,手把手带你走完Transformer中日翻译项目的最后关键一步! 前两期我们搞定了数据预处理(分词、词表构建全流程)和模型搭建&#xff08…

智能编程中的智能体与 AI 应用:概念、架构与实践场景

一、智能体(Intelligent Agent)在编程中的定义与架构1. 智能体的核心概念 智能体是指在特定环境中能够自主感知、决策并执行动作的软件实体,具备以下特征:自主性:无需人工干预即可根据环境变化调整行为。交互性&#x…

数组实现各类数据结构

目录 一、数组实现单链表 二、数组实现双链表 三、数组实现栈 四、数组模拟队列 五、数组模拟单调栈 六、数组模拟单调队列&#xff08;滑动窗口&#xff09; 七、数组模拟堆 一、数组实现单链表 #include<iostream> #include<algorithm> #include<cstr…

数据处理与统计分析 —— apply自定义函数

目录 一、向量化与伪向量化 1、向量化 2、np.vectorize 伪向量化&#xff08;特定场景&#xff09; 3、apply&#xff08;自定义函数&#xff09; 二、apply函数 1、对series中使用apply 2、对dataframe中使用apply 3、apply函数案例-泰坦尼克号数据集] 数据集下载链接&#xf…

如何有效利用大语言模型来智能加速产业联盟的产业链转化路径?

观点作者&#xff1a;科易网AI技术转移研究院在科技创新浪潮席卷全球的今天&#xff0c;科技成果转化已成为衡量一个国家创新能力的重要标志。然而&#xff0c;一项权威调查显示&#xff0c;我国科技成果转化率不足30%&#xff0c;大量有价值的创新成果仍停留在实验室阶段&…

视频加水印 视频加水印软件 视频加动态水印

如果你有一个视频&#xff0c;你想给他加一个水印&#xff0c;那么你可以使用这个工具&#xff0c;准备好你的视频和水印。水印一般采用PNG&#xff0c;打开这个工具&#xff0c;把你的视频和水印拖进这个方框当中。视频限制是MP4&#xff0c;水印限制是PNG&#xff0c;它可以把…

面向DeepSeek chat coding实录(二)

向DeepSeek的提问 帮我设计以下两个python class Span 属性&#xff1a; hash值&#xff08;在init函数中通过时间初始化&#xff09; 创建时间&#xff1a;时间&#xff08;在init函数中通过时间初始化&#xff09; 结束时间&#xff1a;时间&#xff08;可选&#xff0c;默认…

Hi3516CV610-00S 海思SOC芯片 可申请开发资料

1.1 概述Hi3516CV610 是一颗应用在安防市场的 IPC SoC。在开放操作系统、新一代视频编解码标准、网络安全和隐私保护、人工智能方面引领行业发展&#xff0c;主要面向室内外场景下的枪机、球机、半球机、海螺机、枪球一体机、双目长短焦机等产品形态&#xff0c;打造极具竞争力…

算法题Day4

目录 13. 练习13 : 整数十位 14. 练习14 : 时间转换 15. 练习15 : 小雨的游泳时间 13. 练习13 : 整数十位 解题方法: #include <iostream> using namespace std; int a; int main() {cin >> a;cout << a % 100 / 10 << endl;return 0; } 14. 练习…

加速你的故障排查:使用 Elasticsearch 构建家电手册的 RAG 应用

作者&#xff1a;来自 Elastic Alessandro Brofferio 学习如何使用 Elasticsearch 构建 RAG 应用&#xff0c;轻松排查你的家电问题。 想要获得 Elastic 认证吗&#xff1f;来看看下一次 Elasticsearch 工程师培训什么时候开始吧&#xff01; Elasticsearch 拥有大量新功能&am…

6.Shell脚本修炼手册---grep命令使用指南

grep 命令&#xff1a;从文本中精准筛选信息的实用指南 文章目录grep 命令&#xff1a;从文本中精准筛选信息的实用指南一、什么是 grep&#xff1f;为什么要用它&#xff1f;二、grep 基本语法三、常用选项详解&#xff08;附实例&#xff09;&#xff08;一&#xff09;模式选…

Python day51

浙大疏锦行 Python day51 复习日&#xff0c;DDPM class DenoiseDiffusion():def __init__(self, eps_model: nn.Module, n_steps: int, device: torch.device):super().__init__()self.eps_model eps_modelself.n_steps n_stepsself.device deviceself.beta torch.linsp…

数据结构:生成 (Generating) 一棵 AVL 树

目录 搭建“创世”的舞台 注入序列&#xff0c;观察演化 注入 10 注入 20 注入 30 注入 40 注入 50 注入 25 再次审视 上一讲&#xff0c;我们已经从最根本的逻辑出发&#xff0c;推导出了 AVL 树失衡时所必需的修复操作——旋转 (Rotation)。 现在&#xff0c;我们将…

github 上传代码步骤

登录GitHub → 点击右上角 ​​ → New Repository​​。填写仓库名称&#xff08;建议与本地项目同名&#xff09;&#xff0c;选择 ​​Public/Private​​。​​关键&#xff1a;不要勾选​​ “Initialize with README”&#xff08;避免与本地仓库冲突&#xff09;。点击 …