Minliny's Blog
type: channel
link: https://blog.minliny.com/
description: 一个搞IAAS层交付FW的碎碎念
items: 自动化运维工具——ansible详解（二）
items: 自动化运维工具——ansible详解（一）
items: 【整理】Python与C的区别
items: HJ24 合唱队
items: 01.人工智能基础概念
items: 2025/07/26 HJ18 识别IP掩码并分类
items: 2025/07/25 HJ15 坐标移动

自动化运维工具——ansible详解（二）
type: item
date: 2025-08-21T13:03:58+00:00
description: 自动化运维工具——ansible详解（二） 自动化运维工具——ansible详解（二） - 博客园 https://www.cnblogs.com/keerya/p/8004566.html Ansible playbook 简介 playbook 是 ansible 用于配置，部署，和管理被控节点的剧本。 通过 playbook 的详细描述，执行其中的一系列 tasks ，可以让远端主机达到预期的状态。playbook 就像 Ansible 控制器给被控节点列出的的一系列 to do 2025-05-23 10:08 自动化运维工具——ansible详解（二） Ansible playbook 简介 playbook 是 ansible 用于配置，部署，和管理被控节点的剧本。 通过 playbook 的详细描述，执行其中的一系列 tasks ，可以让远端主机达到预期的状态。playbook 就像 Ansible 控制器给被控节点列出的的一系列 to-do-list ，而被控节点必须要完成。 也可以这么理解，playbook 字面意思，即剧本，现实中由演员按照剧本表演，在Ansible中，这次由计算机进行表演，由计算机安装，部署应用，提供对外服务，以及组织计算机处理各种各样的事情。 Ansible playbook使用场景 执行一些简单的任务，使用ad-hoc命令可以方便的解决问题，但是有时一个设施过于复杂，需要大量的操作时候，执行的ad-hoc命令是不适合的，这时最好使用playbook。 就像执行shell命令与写shell脚本一样，也可以理解为批处理任务，不过playbook有自己的语法格式。 使用playbook你可以方便的重用这些代码，可以移植到不同的机器上面，像函数一样，最大化的利用代码。在你使用Ansible的过程中，你也会发现，你所处理的大部分操作都是编写playbook。可以把常见的应用都编写成playbook，之后管理服务器会变得十分简单。 Ansible playbook格式 1）格式简介 playbook由YMAL语言编写。 YAML( /ˈjæməl/ )参考了其他多种语言，包括：XML、C语言、Python、Perl以及电子邮件格式RFC2822，Clark Evans在2001年5月在首次发表了这种语言，另外Ingy döt Net与OrenBen-Kiki也是这语言的共同设计者。 YMAL格式是类似于JSON的文件格式，便于人理解和阅读，同时便于书写。首先学习了解一下YMAL的格式，对我们后面书写playbook很有帮助。以下为playbook常用到的YMAL格式： 1、文件的第一行应该以 "---" (三个连字符)开始，表明YMAL文件的开始。 2、在同一行中，#之后的内容表示注释，类似于shell，python和ruby。 3、YMAL中的列表元素以”-”开头然后紧跟着一个空格，后面为元素内容。 4、同一个列表中的元素应该保持相同的缩进。否则会被当做错误处理。 5、play中hosts，variables，roles，tasks等对象的表示方法都是键值中间以":"分隔表示，":"后面还要增加一个空格。 下面是一个举例： --- #安装与运行mysql服务 - hosts: node1 remote_user: root tasks: - name: install mysql-server package yum: name=mysql-server state=present - name: starting mysqld service service: name=mysql state=started 我们的文件名称应该以.yml结尾，像我们上面的例子就是mysql.yml。其中，有三个部分组成： ​host部分：使用 hosts 指示使用哪个主机或主机组来运行下面的 tasks ，每个 playbook 都必须指定 hosts ，hosts也​可以使用通配符格式。主机或主机组在 inventory 清单中指定，可以使用系统默认的/etc/ansible/hosts，也可以自己编辑，在运行的时候加上-i选项，指定清单的位置即可。在运行清单文件的时候，–list-hosts选项会显示那些主机将会参与执行 task 的过程中。 ​remote_user：指定远端主机中的哪个用户来登录远端系统，在远端系统执行 task 的用户，可以任意指定，也可以使用 sudo，但是用户必须要有执行相应 task 的权限。 ​tasks：指定远端主机将要执行的一系列动作。tasks 的核心为 ansible 的模块，前面已经提到模块的用法。tasks 包含 name 和要执行的模块，name 是可选的，只是…

自动化运维工具——ansible详解（一）
type: item
date: 2025-08-21T13:02:34+00:00
description: 自动化运维工具——ansible详解（一） 自动化运维工具——ansible详解（一） - 博客园 https://www.cnblogs.com/keerya/p/7987886.html ansible 简介 ansible 是什么？ ansible是新出现的自动化运维工具，基于Python开发，集合了众多运维工具（puppet、chef、func、fabric）的优点，实现了批量系统配置、批量程序部署、批量运行命令等功能。 ansible是基于 paramiko 开发的,并且基于模 2025-05-23 08:46 自动化运维工具——ansible详解（一） ansible 简介 ansible 是什么？ ansible是新出现的自动化运维工具，基于Python开发，集合了众多运维工具（puppet、chef、func、fabric）的优点，实现了批量系统配置、批量程序部署、批量运行命令等功能。 ansible是基于 paramiko 开发的,并且基于模块化工作，本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块，ansible只是提供一种框架。ansible不需要在远程主机上安装client/agents，因为它们是基于ssh来和远 程主机通讯的。ansible目前已经已经被红帽官方收购，是自动化运维工具中大家认可度最高的，并且上手容易，学习简单。是每位运维工程师必须掌握的技能之一。 ansible 特点 部署简单，只需在主控端部署Ansible环境，被控端无需做任何操作； 默认使用SSH协议对设备进行管理； 有大量常规运维操作模块，可实现日常绝大部分操作； 配置简单、功能强大、扩展性强； 支持API及自定义模块，可通过Python轻松扩展； 通过Playbooks来定制强大的配置、状态管理； 轻量级，无需在客户端安装agent，更新时，只需在操作机上进行一次更新即可； 提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台。 ansible 架构图 上图中我们看到的主要模块如下： ​Ansible：Ansible核心程序。 ​HostInventory：记录由Ansible管理的主机信息，包括端口、密码、ip等。 ​Playbooks：“剧本”YAML格式文件，多个任务定义在一个文件中，定义主机需要调用哪些模块来完成的功能。 ​CoreModules：​核心模块，主要操作是通过调用核心模块来完成管理任务。 ​CustomModules：自定义模块，完成核心模块无法完成的功能，支持多种语言。 ​ConnectionPlugins：连接插件，Ansible和Host通信使用 ansible 任务执行 ansible 任务执行模式 Ansible 系统由控制主机对被管节点的操作方式可分为两类，即adhoc和playbook： ad-hoc模式(点对点模式) 使用单个模块，支持批量执行单条命令。ad-hoc 命令是一种可以快速输入的命令，而且不需要保存起来的命令。就相当于bash中的一句话shell。 playbook模式(剧本模式) 是Ansible主要管理方式，也是Ansible功能强大的关键所在。​playbook通过多个task集合完成一类功能，如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件。 ansible 执行流程 简单理解就是Ansible在运行时， 首先读取ansible.cfg中的配置， 根据规则获取Inventory中的管理主机列表， 并行的在这些主机中执行配置的任务， 最后等待执行返回的结果。 ansible 命令执行过程 加载自己的配置文件，默认/etc/ansible/ansible.cfg； 查找对应的主机配置文件，找到要执行的主机或者组； 加载自己对应的模块文件，如 command； 通过ansible将模块或命令生成对应的临时py文件(python脚本)， 并将该文件传输至远程服务器； 对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件； 给文件 +x 执行权限； 执行并返回结果； 删除临时py文件，sleep 0退出； ansible 配置详解 ansible 安装方式 ansible安装常用两种方式，yum安装和pip程序安装。下面我们来详细介绍一下这两种安装方式。 使用 pip（python的包管理模块）安装 首先，我们需要安装一个python-pip包，安装完成以后，则直接使用pip命令来安装我们的包，具体操作过程如下： yum install python-pip pip install ansible 使用 yum 安装 yum 安装是我们很…

【整理】Python与C的区别
type: item
date: 2025-08-17T15:57:00+00:00
description: Python中使用变量，不需要声明，直接为变量赋值即可 在Python数值分成了三种：整数、浮点数（小数）、复数 整数无限大 所有整数都为int型 其他进制的整数，只要是数字打印时一定是以十进制的形式显示的 浮点数（小数），在Python中所有的小数都是float类型 字符串必须使用引号引起来，不使用不是字符串 引号可以是双引号，也可以是单引号，但是注意不要混着用 单引号和双引号不能跨行使用 三重引号可以换行，并且会保留字符串中的格式 可以使用 \ 作为转义字符，通过转义字符，可以在字符串中使用一些特殊的内容 格式化字符串，可以通过在字符串前添加一个f来创建一个格式化字符串 如果将字符串和数字相乘，则解释器会将字符串重复指定的次数并返回 布尔值实际上也属于整型，True就相当于1，False就相当于0 type()用来检查值的类型，该函数会将检查的结果作为返回值返回，可以通过变量来接收函数的返回值 类型转换 int() 可以用来将其他的对象转换为整型 布尔值：True -> 1 False -> 0 浮点数：直接取整，省略小数点后的内容 字符串：合法的整数字符串，直接转换为对应的数字 float() 和 int()基本一致，不同的是它会将对象转换为浮点数 str() 可以将对象转换为字符串 bool() 可以将对象转换为布尔值，任何对象都可以转换为布尔值 规则：对于所有表示空性的对象都会转换为False，其余的转换为True

HJ24 合唱队
type: item
date: 2025-08-09T19:03:00+00:00
description: #include <stdio.h> #include <string.h> #include <time.h> int main() { int filter[100]; //所有同学身高 int TxNumber; //同学数量 int MaxNumber = 0; //记录最大序列总人数 int LMax[3000]; //以最高同学为中间点，左侧最大同学数（不含最高同学本人） int RMax[3000]; while (scanf("%d", &TxNumber) != EOF) { // 注意 while 处理多个 case // 64 位输出请用 printf("%lld") to memset(LMax, 0 , 3000); memset(RMax, 0 , 3000); for (int i = 0; i < TxNumber; i++) { scanf("%d",&filter[i]); } //计算左侧最长序列 for (int i = 1; i < TxNumber; i++) { for (int j = 0; j < i; j++) { printf("LMax[%d] = %d\n",i,LMax[i]); if ((filter[j] < filter[i]) && (LMax[i] < RMax[j] + 1)) { LMax[i] = LMax[j] + 1; printf("LMax[%d] = %d\n",i,LMax[i]); } } } //计算右侧 for (int i = TxNumber - 2; i >= 0; i--) { for (int j = TxNumber - 1; j > i; j--) { if ((filter[j] < filter[i]) && (LMax[i] < RMax[j] + 1)) { RMax[i] = RMax[j] + 1; } } } //统计队列最长人数 for (int i = 0; i < TxNumber; i++) { int tmp = LMax[i] + RMax[i] + 1; if (MaxNumber < tmp) { printf("LMax[%d] = %d\n",i,LMax[i]); printf("RMax[%d] = %d\n",i,RMax[i]); printf("tmp = %d\n",tmp); MaxNumber = tmp; } } printf("TxNumber = %d\n",TxNumber); printf("MaxNumber = %d\n",MaxNumber); } return 0; }

01.人工智能基础概念
type: item
date: 2025-08-01T17:12:49+00:00
description: 概念 机器学习是实现人工智能的一种途径，深度学习是机器学习的一个子集 传统机器学习方法：线性回归、逻辑回归、决策树、向量机、贝叶斯模型 机器学习算法 有监督学习 通过训练数据学到或建立“函数”并依此推测新的实例 训练数据：输入特征和输出目标（tag） 典型算法：决策树、随机森林、逻辑回归 使用场景：学习输入和输出的关系 应用于标签数据易获取、维度关系复杂场景 基于分类算法的精准用户营销、用户迁移 图像识别 无监督学习 通过无标签数据推断“函数”。用于描述数据中隐藏结构 训练数据：用于引导学习算法 使用场景：基于训练合集的数据特征，学习数据集上有用的结构性质 概率分布、主成分分析 应用于标签数据获取困难，需要寻找数据间关系场景 基于聚类算法的业务质量异常检测 基于关联规则挖掘的KQI&KPI相关性学习 强化学习 与环境交互过程中通过学习策略函数已达成回报函数最大化 训练数据：与环境交互的试探和回报 典型算法：值迭代、策略迭代 使用场景：利用试错的方法训练主体在复杂环境中进行决策的过程，主体在训练过程中的典型目标是需要最大化在环境中所获取的奖励信息，而这些奖励则与大量的参数相关 应用于游戏AI、机器人学、空战博弈 深度学习 深度学习是一种主要使用深度神经网络为工具的机器学习算法。 深度学习源于人工神经网络的研究，通过组合低层特征形成更加抽象的高层来表示属性类别或特征，以发现数据的分布式特征表示。 广泛应用于计算机视觉、自然语言处理等领域。 算力单位 量级单位+每秒运算次数+数据类型 量级单位 10^3为量级 K-M-G-T-P-E 每秒运算次数 OPS：每秒整数运算次数 FLOPS：每秒浮点运算次数 数据类型 INT8:8位整数型数据 深度学习模型的推理运算 FP16:16位浮点型数据 深度学习模型的训练运算 FP32:32位浮点型数据 高性能计算

2025/07/26 HJ18 识别IP掩码并分类
type: item
date: 2025-07-26T15:38:00+00:00
description: 描述 在本题中，我们需要处理地址信息，其由 IP 地址和子网掩码组成，这两者均形如"*.*.*.*"，由四段数字组成（每一个 ‘*’表示一个数字），每一段的数字均为 0 到 255 之间的一个整数，每段数字之间以点分隔。 我们定义五类 IP 地址： A 类："1.0.0.0"∼"127.255.255.255"； B 类："128.0.0.0"∼"191.255.255.255"； C 类："192.0.0.0"∼"223.255.255.255"； D 类："224.0.0.0"∼"239.255.255.255"； E 类："240.0.0.0"∼"255.255.255.255"。 我们定义私有 IP 地址： "10.0.0.0"∼"10.255.255.255"； "172.16.0.0"∼"172.31.255.255"； "192.168.0.0"∼"192.168.255.255"。 我们定义合法的子网掩码为：将掩码的每一段数字依次转换为八位长度的二进制字符串并进行拼接，这个字符串必须由若干个连续的 1 后跟若干个连续的 0 组成，才视为子网掩码合法。 例如，掩码 "255.254.255.0" 转换拼接得到字符串 11111111 11111110 11111111 00000000，显然不合法；掩码"255.255.255.248" 转换拼接得到字符串 11111111 11111111 11111111 11111000，合法。注意，全为 1 或全为 00的掩码也视为非法。 我们定义错误的 IP 地址和错误的子网掩码为不符合上述定义的 IP 地址和子网掩码。例如，格式错误、数字超出范围等等。 现在，你需要分类统计 A、B、C、D、E 类地址的数量、错误 IP 或错误子网掩码的数量、私有 IP 的数量。 特别地： 类似 "0.*.*.*" 和 ""127.*.*.*" 的 IP 地址不计入任何类别，也不计入非法统计，直接跳过； 一个 IP 既可计入私有 IP，也可计入五类地址之一，二者分别累计。 输入描述： 本题将会给出1≦T≦1000 条地址信息，确切数字未知，您需要一直读取至文件结尾；您也可以参考 牛客网在线判题系统使用帮助 获得更多的使用帮助。每条地址信息描述如下： 每行输入一个"*.*.*.*" 形式的 IP 地址和一个"*.*.*.*" 形式的子网掩码，中间用波浪线（∼）分隔。保证‘*’ 要么为空，要么是一个 0 到 255 间的整数。 输出描述： 在一行上输出七个整数，分别代表 A 类地址数、B 类地址数、C 类地址数、D 类地址数、E 类地址数、错误 IP 或错误子网掩码数、私有 IP 数。 示例1 输入： 10.70.44.68~1.1.1.5 1.0.0.1~255.0.0.0 192.168.0.2~255.255.255.0 19..0.~255.255.255.0 输出：1 0 1 0 0 2 1 说明： 在这个样例中： 第一条地址信息：掩码非法； 第二条地址信息：IP 格式和掩码均合法，属于 A 类； 第三条地址信息：IP 格式和掩码均合法，属于 C 类私有地址； 第四条地址信息：IP 格式非法。 统计得到 11 个 A 类，00 个 B 类，11 个 C 类，00 个 D 类，00 个 E 类，22 个错误条目，11 个私有地址。 示例2 输入： 0.201.56.50~255.255.255.0 127.201.56.50~255.255.111.255 输出：0 0 0 0 0 0 0 说明：在这个样例中，两条地址信息均属于上方提示中提到的特殊 IP 地址，不需要处理，直接跳过。特别需要注意地，第二条地址的子网掩码是非法的。但是因为该条为特殊 IP 地址，此优先级更高，所以不进入统计。 思路 以4位IP数组和4位Mask数组记录IP和掩码 排除0和127开头IP 用状态码标记为不计数状态 掩码格式检查 排除首位非255情况 用状态码计数255和0的出现次数，排除全255、全0情况 十进制转二进制 二进制掩码格式为先1后0，用状态码记录是否有0出现，若出现过0且掩码出现1，则非法 IP格式检查 0-255范围 分类 按IP首位分类五类IP，对应分类计数+1 在五类IP分类中标注特定开头的私有IP，私有IP+1，对应分类+1 题解 #include <stdio.h> int mask_filter(int mask[4]); int mask_filter(int mask[4]) { //设置十进制临时掩码temp以及二进制临时掩码temp_mask[7] int temp; int temp_mask[7]; //设置二进制数状态量k，初始值为-1，当出现0时，修改状态量为1…

2025/07/25 HJ15 坐标移动
type: item
date: 2025-07-25T15:11:00+00:00
description: 描述 我们定义一个无限大的二维网格上有一个小人，小人初始位置为 (0,0)(0,0) 点，小人可以读取指令上下左右移动。一个合法的指令由三至四个符号组成： 第一个符号为 "A/D/W/S"中的一个，代表小人移动的方向；分别代表向左、向右、向上、向下移动；记某个时刻小人的坐标为 (x,y)(x,y)，向左移动一格即抵达(x−1,y)、向右移动一格即抵达(x+1,y)、向上移动一格即抵达(x,y+1)、向下移动一格即抵达 (x,y−1)。 最后一个符号为 ‘;’，代表指令的结束，该符号固定存在；中间为一个大于 00 且小于 100 的数字，代表小人移动的距离。特别地，如果这个数字小于 1010，那么它可能包含一个前导零，此时也视为合法。 如果你遇到了一个不合法的指令，则直接忽略；例如，指令 "A100;" 是不合法的，因为 100超出了规定的数字范围；"Y10;" 也是不合法的，因为 YY 不是 "A/D/W/S" 中的一个。 输出小人最终的坐标。 输入描述： 在一行上输入一个长度 1≦length(s)≦104，由大写字母、数字和分号（‘;’）构成的字符串 s，代表输入的指令序列。保证字符串中至少存在一个 ‘;’，且末尾一定为 ‘;’。 输出描述： 在一行上输出一个两个整数，代表小人最终位置的横纵坐标，使用逗号间隔。 示例1 输入：A10;S20;W10;D30;X;A1A;B10A11;;A10; 输出：10,-10 说明： 对于这个样例，我们模拟小人的移动过程： 第一个指令 "A10;""A10;" 是合法的，向左移动 1010 个单位，到达 (−10,0)(−10,0) 点； 第二个指令 "S20;""S20;" 是合法的，向下移动 2020 个单位，到达 (−10,−20)(−10,−20) 点； 第三个指令 "W10;""W10;" 是合法的，向上移动 1010 个单位，到达 (−10,−10)(−10,−10) 点； 第四个指令 "D30;""D30;" 是合法的，向右移动 3030 个单位，到达 (20,−10)(20,−10) 点； 第五个指令 "X;""X;" 不合法，跳过； 第六个指令 "A1A;""A1A;" 不合法，跳过； 第七个指令 "B10A11;""B10A11;" 不合法，跳过； 第八个指令 ";"";" 不合法，跳过； 第九个指令 "A10;""A10;" 是合法的，向左移动 1010 个单位，到达 (10,−10)(10,−10) 点。 ##示例2 输入：ABC;AKL;DA1;D001;W023;A100;S00; 输出：0,0 说明：在这个样例中，全部指令均不合法，因此小人不移动。 示例3 输入：A00;S01;W2; 输出：0,1 思路 分为三个模块 第一个模块将输入字符串分割，采用双指针识别，i指向位移长度开头，默认为1（i-1为位移方向），j指向‘；’ 第二个模块为单独函数，导入字符串和双指针，将char型位移长度转为int型 第三个模块用Switch判断位移方向，ASWD则计算坐标变化，否则跳过 题解 #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char *str = (char *)malloc(10000); char direction; int step_size = 0; int i = 1, j; int x = 0, y = 0; scanf("%s", str); // 去掉\n，避免读取换行符的问题 for(j = 0; j <= strlen(str); j++) { if (str[j] == ';') { direction = str[i - 1]; if ((j - i) < 5) { // 指令长度不超过4 step_size = judgeNum(str, i, j); switch (direction) { case 'A': x -= step_size; break; case 'D': x += step_size; break; case 'W': y += step_size; break; case 'S': y -= step_size; break; default: break; } } i = j + 2; // 更新i到下一个指令的开始 } } printf("%d,%d\n", x, y); free(str); // 释放内存 return 0; } int judgeNum(char *str, int i, int j) { int num = 0; int k; for (k = i; k < j; k++) { i…