一:ansible基础知识

1.1 ansible的定义与工作原理简述

ansible是一个自动化运维工具,用于执行自动化任务,包括像配置管理,应用部署,任务执行等等,本质上来说也是基础设施及代码工具,通过可读性较强的代码声明基础设施的期望状态,再通过附带的ansible模块去执行。

什么是基础设施?

基础设施及代码”里的**“基础设施”,专指支撑应用运行的所有底层环境和依赖**,而不限于传统意义上的机房、机柜、网线。它通常被拆成三层:

  1. 计算资源
    物理机、虚拟机(KVM/VMware/Hyper-V)、容器运行时(Docker/containerd)、Kubernetes Node、Lambda/Function 等可运行代码的实体。

  2. 网络与连通性
    VPC、子网、路由表、安全组、负载均衡(ELB/SLB/NGINX Ingress)、VPN、DNS、CDN、Service Mesh 等让流量能正确且安全地进出的组件。

  3. 存储与数据
    块存储(EBS、云盘)、对象存储(S3、OSS)、文件存储(EFS、NAS)、数据库(RDS、Aurora、MongoDB)、缓存(Redis、Memcached)、备份与快照。

一句话:
“基础设施”= 让应用能跑起来、能被访问、能把数据存下来的所有“云+底层资源”;把这一切用代码(Terraform、Ansible、Pulumi、K8s YAML、Helm Chart)声明出来,就成了 IaC 中的“基础设施”。

工作原理是什么?

  1. 加载配置
    读取 ansible.cfg、环境变量、命令行参数,决定 SSH/WinRM 选项、并发数(forks)、回调插件等。

  2. 生成库存(Inventory)
    把静态 INI、动态脚本(AWS、VMware、OpenStack、K8s CRD 等)或 Tower 数据库里的主机信息解析成内存对象,附带变量(host_vars、group_vars)。

  3. 建立连接
    控制节点按 ansible_connection 字段决定用 SSH、local、docker、kubectl、winrm 等协议并发地与目标机握手;这一步只建一次连接,后续指令复用同一通道。

  4. 任务编排与模块传输
    • 对每条 Play/Role,先按策略插件(linear、free、debug)切分批次。
    • 把要执行的模块(Python 文件或二进制)+ 参数打包成 ZIP,通过 SCP/SFTP 推到远端临时目录(~/.ansible/tmp/...)。
    • 远端用指定的解释器(/usr/bin/python3/usr/bin/pwsh 等)一次性执行该模块,返回 JSON 结果。
    • 如果是幂等模块,会先收集当前状态做差异比较(例如 yum list installed nginx),再决定是否改动。

  5. 结果收集与回调
    控制节点把每台主机的 JSON 回包解析成统一结构(changed、ok、failed、skipped),通过回调插件输出到终端、日志、Slack、Prometheus 或 Tower 数据库,并根据 any_errors_fatalmax_fail_percentage 决定是否中止整个 Playbook。

ansible的优势是什么?

核心能力拆解

  1. 声明式编排
    Playbook 只描述“要变成什么样”,而不是“怎么变”。例如“确保 nginx 已安装并运行”,Ansible 会自己判断是否需要安装、启动或重启。

  2. 幂等执行
    同一 Playbook 反复运行,结果不变。第 1 次会改动系统,第 N 次直接返回 OK,天然适合 CI/CD 与回滚。

  3. 无 agent 架构
    控制节点通过 SSH(Linux/Unix)或 WinRM(Windows)连接,目标机无需预装客户端,降低入侵面和维护成本。

  4. 模块化插件体系
    6000+ 个模块(command、yum、template、kubernetes、vmware…)+ 回调插件、动态库存、过滤器,几乎覆盖所有基础设施和应用场景。

  5. 可版本化、可审计
    Playbook/Role 是纯文本,天然进 Git;执行日志可 JSON 化输出,方便审计与合规。

  6. 跨平台:可以操控linux,windows,unix,网络设备等等。

什么是幂等执行,如何实现的?

幂等执行(idempotency)指:
无论操作执行 1 次还是 N 次,系统的最终状态都保持一致,且不会产生额外副作用。

举例:

  • 第 1 次执行“确保 nginx 已安装并启动” → 系统安装了 nginx 并启动。

  • 第 2 次执行同样指令 → 检测到 nginx 已安装且进程已运行,直接返回 OK,不再重复安装或重启。


Ansible 实现幂等的核心机制

  1. 声明式模块
    每个模块内部先“查现状”,再“算差异”,最后“只做必要改动”。

    • yum: 模块 → 先 rpm -q nginx;若已安装则直接返回 ok

    • service: 模块 → 先 systemctl is-active nginx;若已是 active,则跳过启动。

    • copy: 模块 → 先比较 checksum;文件一致则跳过传输。

  2. facts 缓存
    运行 setup 模块把系统信息(包列表、服务状态、文件属性等)缓存到 ansible_facts,后续任务可直接引用,避免重复查询。

  3. check mode / diff mode

    • ansible-playbook -C:模拟运行,只返回“哪些任务会改变”,不真正执行。

    • ansible-playbook -D:在终端显示文件 diff,提前确认变更。

  4. 条件判断与 register
    通过 register 保存任务结果,再用 whenchanged_when/failed_when 控制后续逻辑,避免重复操作。

  5. 幂等性开关
    个别模块提供显式参数:

    • command: / shell: 默认非幂等,但可配 creates/removes 文件标记。

    • uri: 模块可用 status_code 判断接口是否已创建资源。

一句话总结:
Ansible 的幂等性不是靠用户写“if not exist then …”,而是每个模块内部自带“查-比-改”三步逻辑,从而保证多次执行结果一致。

1.2 ansible的分类

  ansible是属于redhat公司的核心产品,分为红帽企业版和社区版,两者差别就是在于模块数量和功能完整度,社区版的软件包是ansible-core只包含了运行ansible的必需几个组件和内建模块通过pip下载,而企业版通过rpm包下载,不仅包含了ansible-core,还包含了最新的组件ansible-navigator可以代替过去多个ansible命令,用于开发和测试ansible的playbook。

过去常用的ansible命令有哪些?

  1. 运行 playbook
    ansible-playbook

  2. 查看 playbook 中某个关键词用法
    ansible-doc 关键词

  3. 查看主机清单
    ansible-inventory --list

  4. 查看配置
    ansible-config dump

现在的ansible-navigator怎么全部代替他们?

老命令ansible-navigator 等价用法
ansible-playbook site.ymlansible-navigator run site.yml
ansible-doc 关键字ansible-navigator doc 关键字
ansible-inventory --listansible-navigator inventory --list
ansible-config dumpansible-navigator config dump

ansible-core软件包和ansible-navigator软件包运行环境有什么这区别?

一句话区分
• ansible-core:直接在你本地 Python 环境里跑 ansible-playbook
• ansible-navigator:把 ansible-core 装进一个容器镜像里跑,你用 navigator 命令只是去启动那个容器

所以:
– 安装 ansible-core 要先配 Python、pip 依赖;
– 安装 ansible-navigator 只要装好 podman/docker,它自动拉镜像,里面已经打包好 ansible-core 和所有常用集合,版本隔离、依赖不污染宿主机。

为什么ansible一定需要一个运行环境?

Ansible 控制节点必须有一个“运行环境”,是因为 它才是真正干活的程序,而不是一个单纯的“遥控器”。
简单一句话:

控制节点需要 Python + Ansible 代码 + 模块库,用来 把 YAML 翻译成远程机器上可执行的命令,并收集结果

具体作用拆开说:

  1. 解释 Playbook
    YAML 里的任务、变量、模板全由控制节点的 Python 进程解析成内部数据结构。

  2. 加载并执行模块
    每个任务对应一个 .py 模块,控制节点先把模块代码通过 SSH/WinRM 复制到目标机,再远程执行;模块返回 JSON 结果,控制节点再解析。

  3. 变量与事实处理
    控制节点运行 setup 收集 facts,再把 host_vars、group_vars、Jinja2 模板在本地渲染好,再下发。

  4. 并发与结果聚合
    forks、策略插件、回调插件都在控制节点里跑,负责并发调度、输出格式化、失败重试等。

  5. 依赖管理
    模块、集合、Jinja2 过滤器、额外 Python 库(如 boto3、kubernetes)都装在控制节点;目标机不需要这些依赖。

因此,控制节点必须有一个 包含 Python 解释器 + ansible-core + 相关依赖 的运行环境;没有它,YAML 只是纯文本,无法变成可执行指令。

二:实施ansible的playbook

前提条件

实施playbook前需要集齐主机清单和ansible的配置。

2.1 主机清单

主机清单是用来管控ansible实施主机对象的文件,分为静态主机清单文本文件和通过外部程序提供信息动态生成主机信息的动态主机清单。(以静态主机清单为例)。

格式如下:由主机ip或域名与主机组构成。

  1. 直接列主机

192.168.1.10
web01.example.com

     2分组 + 主机 + 变量

[web]
web01 ansible_host=192.168.1.10 ansible_user=deploy
web02 ansible_host=192.168.1.11[db]
db01 ansible_host=192.168.2.5
db02 ansible_host=192.168.2.6 ansible_port=2222[web:vars]        # 全组共用变量
http_port=80
  1. 直接写在主机后面

web01 ansible_host=192.168.1.10 ansible_user=deploy

     2写在组名 :vars 段里(组内共用)

[web:vars]
http_port=80
  1. 3写在 all:vars 段里(全体共用)

[all:vars]
ansible_ssh_private_key_file=~/.ssh/id_rsa

保存后 Ansible 会自动读取这些变量,优先级:主机变量 > 组变量 > all 变量。

   3嵌套/继承组

[prod:children]
web
db

存在默认的两个主机组

all:全体主机

ungrouped:没有被列进主机组的主机

另外在主机清单里还可以通过[start:end]格式来简化主机格式例如:

inventory查找的默认顺序如下:(ansible执行的时候工作路径是当前执行的工作路径)

Ansible 查找主机清单的默认顺序(从先到后):

  1. 命令行 -i 指定的文件或脚本。

  2. ANSIBLE_INVENTORY 环境变量指定的路径。

  3. 当前目录下的 ansible.cfginventory = ... 指定的路径。

  4. 用户主目录 ~/.ansible.cfginventory = ... 指定的路径。

  5. 系统级 /etc/ansible/ansible.cfginventory = ... 指定的路径。

  6. 若以上都没有,则回退到 /etc/ansible/hosts

2.2 ansible的配置文件

ansible的配置文件一般基础配置文件命名为ansible.cfg,管理ansible-navigator的配置文件命名为ansible-navigato.yml.

ansible.cfg包含两个部分[defaults]和[privilege_escalation].

  1. defaults 段
    [defaults]
    • inventory = ./hosts # 指定清单文件
    • remote_user = deploy # 默认 SSH 用户
    • forks = 20 # 并发数
    • host_key_checking = False # 首次连接免确认

  2. privilege_escalation 段
    [privilege_escalation]
    • become = True # 默认启用提权
    • become_method = sudo # 用 sudo
    • become_user = root # 提权到 root

可以通过ansible-navigator config去查看ansible.cfg所有配置。

ansible-navigator.yml文件主要包含以下部分:

playbook-artifact 就是 把一次 playbook 运行的完整结果(每个 play、每个任务的状态、stdout、返回值等)自动写成一个 JSON 快照文件,作用:

  1. 事后回放
    ansible-navigator replay xxx.json 随时在终端里“重看”这次运行,不用原 playbook 和清单。

  2. 共享/审计
    JSON 单文件即可发给同事或归档,满足合规和变更追踪需求。

  3. 离线排查
    失败现场被完整保留,方便脱离原始环境做调试。

一句话:playbook-artifact 是把运行结果“录像”成 JSON,随时回放、共享、审计。

ansible两个配置文件的执行查找顺序是什么?

先找 ansible.cfg → 再找 ansible-navigator.yml

  1. ansible-navigator 启动时,先用 Ansible 自己的查找顺序(当前目录 → ~/.ansible.cfg → /etc/ansible/ansible.cfg)确定 ansible.cfg

  2. 然后读取同一目录下的 ansible-navigator.yml(或 ~/.ansible-navigator.yml)。

后者仅对 navigator 生效,不会覆盖 ansible.cfg 中已设置的参数,只是补充或改用容器执行环境。

2.2 ansible playbook的语法规则

一个完整的ansible playbook的示例如下:

---
- name: Ensure nginx is installed and runninghosts: webbecome: yesvars:http_port: 80tasks:- name: Install nginxyum:name: nginxstate: presentwhen: ansible_facts['os_family'] == 'RedHat'- name: Deploy index.htmltemplate:src: templates/index.html.j2dest: /usr/share/nginx/html/index.html- name: Ensure nginx is started and enabledservice:name: nginxstate: startedenabled: yes- name: Verify port is listeningwait_for:port: "{{ http_port }}"host: "{{ ansible_default_ipv4.address }}"

开头为:---

注释用#

在 Playbook 中,只有当 YAML 需要「列表项」时才必须写 - (破折号+空格)
出现位置只有两处:

  1. 顶层:每个 play 是列表成

    ---
    - name: play1      # ← 这里hosts: web
    - name: play2      # ← 再一个 play
  2. 任务/角色/变量等列表:tasks、roles、pre_tasks、post_tasks、vars、loop、block、handlers 

    tasks:- name: task1    # ← 任务列表- name: task2

其余场景(字典 key、模块参数、变量赋值)绝不要 -,直接键值对即可。

常用执行的参数如下:

类别参数作用说明
清单/范围-i <文件>指定主机清单
-l <模式>只跑匹配的主机或组
语法检查--syntax-check仅检查 playbook 语法
空运行--check 或 -C干跑,不真正改变系统
--diff空跑时显示文件差异
输出详细程度-v详细输出
-vv / -vvv更详细 / 最详细
并发-f N并发进程数(默认 5)
提权--become自动使用 sudo/ become
标签-t <标签>仅执行带指定 tag 的任务

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

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

相关文章

Vue原理与高级开发技巧详解

Vue 的底层原理、高级用法、性能优化和生态整合 文章目录Vue 的底层原理、高级用法、性能优化和生态整合一、Vue 双向绑定原理深度剖析1. Vue 2 实现原理&#xff08;Object.defineProperty&#xff09;2. Vue 3 实现原理&#xff08;Proxy&#xff09;3. v-model 高级用法二、…

axios的封装

axios的封装 在src目录下新建文件夹utils工具类&#xff0c;文件夹里面新建http.js文件&#xff0c;如果项目涉及到多个基地址可以新建http2.js文件。 import axios from axios;/*** 后端*/// 创建axios实例 const http axios.create({// 1.接口基地址baseURL: http://192.168…

MariaDB 数据库管理与web服务器

MariaDB 数据库管理与WEB 服务器 介绍 MariaDB 数据库介绍 **数据库&#xff0c;是一个存放计算机数据的仓库。**这个仓库是按照一定的数据结构来对数据进行组织和存储的&#xff0c;我们可以通过数据库提供的多种方法来管理其中的数据。 数据结构&#xff0c;是指数据的组织形…

分治-归并-912.排序数组-力扣(LeetCode)

一、题目解析1、将数组排升序2、在不使用任何内置函数的情况下解决问题二、算法原理分治-归并合并两个有序数组1、双指针遍历两个合并数组2、将比较后的较小值放到新开数组中3、防止有指针未遍历完&#xff0c;特殊处理4、将nums中的元素还原三、代码示例vector<int> tmp…

网络安全初学者学习心得

看到你对网络安全学习的兴趣&#xff0c;我感到非常振奋&#xff01;这个领域既充满挑战又回报丰厚&#xff0c;作为初学者&#xff0c;理清学习内容和方向确实至关重要。下面我将结合多年的行业观察和指导经验&#xff0c;为你详细拆解网络安全初学者的学习内容并分享一些核心…

防火墙笔记优化版

一、防火墙的核心定义防火墙是一种基于预设安全策略&#xff0c;用于隔离内网与外网、控制网络流量的安全系统&#xff08;可分为软件系统或硬件系统&#xff09;。其核心作用包括&#xff1a;流量隔离&#xff1a;物理或逻辑分隔内网、外网及 DMZ 区域&#xff08;DMZ 为内网与…

vue3前端项目cursor rule

cursor rule是什么&#xff0c;以及怎么定义&#xff0c;看这个文章&#xff1a; cursor中定义cursor rules_cursor rules如何编写-CSDN博客 针对现有一个vue3的前端项目&#xff0c;写了一份cursor rule&#xff0c;可以作为参考&#xff0c;内容如下&#xff08;仅作为参考&…

基于51单片机红外遥控定时开关智能家电插座设计

1. 功能介绍 本设计是一款基于 STC8C52 单片机 的智能家电插座系统&#xff0c;集 红外遥控控制、定时开关控制、自动与手动模式切换、掉电数据保存、液晶显示、蜂鸣器提示 于一体&#xff0c;能够方便用户对家用电器进行精准的定时控制与远程操作。系统广泛适用于家用电器、办…

下一代防火墙组网方案

知识回顾&#xff1a;1.传统防火墙包括包过滤防火墙、应用网关防火墙、状态检测防火墙。2.包过滤防火墙工作在3、4层。3.包过滤防火墙特点&#xff1a;4.应用网关防火墙主要作用&#xff1a;①截取用户初始化连接请求&#xff0c;对用户进行认证&#xff1b;②通过ALG能让多通道…

WEB开发-第二十七天(PHP篇)

DW PHPStorm PhpStudy Navicat Premium DW : HTML&JS&CSS开发 PHPStorm : 专业PHP开发IDE PhpStudy &#xff1a;Apache MYSQL环境 Navicat Premium: 全能数据库管理工 变量覆盖安全&#xff1a; $GLOBALS&#xff1a;这种全局变量用于在PHP脚本中的任意位置访…

Lwip深度阅读-网络架构

LWIP网络协议栈详细介绍 本文的内容基本基于野火的LWIP手册&#xff0c;和LWIP源码撰写。 网络协议栈概述 从图片可以看出&#xff0c;网络协议栈采用分层架构&#xff0c;每一层都有特定的功能和协议。 TCP/IP协议分层模型数据封装过程MAC数据包 我使用wireShark抓包的时候&am…

嵌入式系统学习Day16(C语言中的位运算)

位运算二进制位的运算嵌入式:通过位运算 控制 硬件运算: 运算规则 & 与 一假则假 | 或 一真则真 ~ 非 真假相对 ^ 异或 相同为假 不同为真 << 左移 表示二进制位的移动 >> 右移 eg:int a 0x55; int b 0x33;0101 0101 //0x55 &am…

Endnote下载,导入曼大 harvard_manchester格式

下载endnote 并激活中国农业科技文献与信息服务平台&#xff0c;点击下载 下载harvard_manchester 格式 Harvard Manchester - Referencing guide at the University of Manchester - Subject guides at University of Manchester 双击打开第二步下载的安装包&#xff08;使用…

【Docker进阶实战】从多容器编排到集群部署

Docker进阶实战&#xff1a;从多容器编排到集群部署 当你已经熟悉Docker的基本操作后&#xff0c;面对的下一个挑战往往是&#xff1a;如何管理多个容器的协作&#xff1f;如何实现容器的集群化部署与扩展&#xff1f;如何保证服务的高可用&#xff1f; 一、Docker Compose&…

【Linux文件操作】文件操作系统调用

目录 一、文件创建&#xff08;creat 系统调用&#xff09;​ 1.1 函数原型 1.2 参数说明​ 1.3 返回值​ 1.4 使用示例 二、文件打开&#xff08;open 系统调用&#xff09;​ 2.1 函数原型 2.2 参数说明​ 2.3 返回值​ 2.4 使用示例 三、文件读写&#xff08;read 和 write …

FreeRTOS源码分析六:vTaskDelay vs xTaskDelayUntil任务延时

系列文章目录 FreeRTOS源码分析一&#xff1a;task创建&#xff08;RISCV架构&#xff09; FreeRTOS源码分析二&#xff1a;task启动&#xff08;RISCV架构&#xff09; FreeRTOS源码分析三&#xff1a;列表数据结构 FreeRTOS源码分析四&#xff1a;时钟中断处理响应流程 Free…

Linux学习-应用软件编程(fread/fwrite,流定义相关接口)

freadsize_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); 功能按块从文件读取数据&#xff0c;从文件中读 nmemb 个、每个 size 字节的元素&#xff0c;存入 ptr 指向的内存。参数- ptr &#xff1a;存储读取数据的内存首地址&#xff08;需提前分配足够…

IP分片(IP Fragmentation)

目录 一、核心概念:MTU与分片的必要性 二、IP分片的关键字段(IPv4头部) 三、分片与重组流程 1. 分片过程(发送端或中间路由器) 2. 重组过程(接收端) 四、IPv4与IPv6分片的差异 五、分片的潜在问题与风险 六、总结 一、传输效率降低,带宽开销增加 二、可靠性降低,数据丢…

高并发内存池 内存释放回收(6)

文章目录前言一、threadcache回收内存二、centralcache回收内存三、pagecache回收内存总结前言 Hello&#xff0c;我们继续乘胜追击   本篇难度较大&#xff0c;大家要好好学一下 一、threadcache回收内存 当某个线程申请的对象不用了&#xff0c;可以将其释放给 thread cac…

2438. 二的幂数组中查询范围内的乘积

2438. 二的幂数组中查询范围内的乘积 初始理解题目 首先&#xff0c;我们需要清楚地理解题目在说什么。题目给出一个正整数 n&#xff0c;要求我们构造一个数组 powers&#xff0c;这个数组满足以下条件&#xff1a; 元素性质​&#xff1a;数组中的每个元素都是 2 的幂。即…