初识puppet!

2023-10-27

什么是puppet

puppet是一个IT基础设施自动化管理工具,它能够帮助系统管理员管理基础设施的整个生命周期: 供应(provisioning)、配置(configuration)、联动(orchestration)及报告(reporting)。

基于puppet ,可实现自动化重复任务、快速部署关键性应用以及在本地或云端完成主动管理变更和快速扩展架构规模等。
遵循GPL 协议(2.7.0-), 基于ruby语言开发。2.7.0 以后使用(Apache 2.0 license)
对于系统管理员是抽象的,只依赖于rubyfacter
能管理多达40 多种资源,例如:fileusergrouphostpackageservicecronexecyum repo等。

puppet的工作机制

1)工作模型

puppet 通过声明性、基于模型的方法进行IT自动化管理。
  定义:通过puppet 的声明性配置语言定义基础设置配置的目标状态;
  模拟:强制应用改变的配置之前先进行模拟性应用;
  强制:自动、强制部署达成目标状态,纠正任何偏离的配置;
  报告:报告当下状态及目标状态的不同,以及达成目标状态所进行的任何强制性改变;

在这里插入图片描述

puppet三层模型
  puppet三层模型如下:

puppet三层模型

2)工作流程
  1. 客户端puppetd调用facter,facter探测出主机的一些变量,例如主机名,内存大小,ip地址等。pupppetd 把这些信息通过ssl连接发送到服务器端;
  2. 服务器端的puppetmaster 检测客户端的主机名,然后找到manifest里面对应的node配置,并对该部分内容进行解析,让对应的客户端执行。
  3. 客户端接收到catalog日志,并且执行,客户端把执行结果发送给服务器;
  4. 服务器端把客户端的执行结果写入日志

工作流程

3)使用模型

puppet的使用模型分为单机使用模型master/agent模型,下面我们来看看这两个模型的原理图。
单机使用模型
  实现定义多个manifests --> complier --> catalog --> apply

单机使用模型工作原理

puppet架构

master/agent模型
  master/agent模型实现的是集中式管理,即 agent 端周期性向 master 端发起请求,请求自己需要的数据。然后在自己的机器上运行,并将结果返回给 master 端。
  架构和工作原理如下:
架构

master/agent模式架构

工作原理

master/agent模式工作原理

img

  1. 客户端Puppetd向Master发起认证请求,或使用带签名的证书。
  2. Master告诉Client你是合法的。
  3. 客户端Puppetd调用Facter,Facter探测出主机的一些变量,例如主机名、内存大小、IP地址等。Puppetd将这些信息通过SSL连接发送到服务器端。
  4. 服务器端的Puppet Master检测客户端的主机名,然后找到manifest对应的node配置,并对该部分内容进行解析。Facter送过来的信息可以作为变量处 理,node牵涉到的代码才解析,其他没牵涉的代码不解析。解析分为几个阶段,首先是语法检查,如果语法错误就报错;如果语法没错,就继续解析,解析的结 果生成一个中间的“伪代码”(catalog),然后把伪代码发给客户端。
  5. 客户端接收到“伪代码”,并且执行。
  6. 客户端在执行时判断有没有File文件,如果有,则向fileserver发起请求。
  7. 客户端判断有没有配置Report,如果已配置,则把执行结果发送给服务器。
  8. 服务器端把客户端的执行结果写入日志,并发送给报告系统。

puppet资源解析

Ansible靠模块实现,而puppet靠的是资源实现;puppet的模块类似于Ansible的角色roles;定义的模块是为了复用,不是为了管控;定义模块的文件叫资源清单(manifest);为每个站点主机定义具体使用哪个模块的叫站点清单(sitemanifest);

  • 资源:是puppet的核心,通过资源申报,定义在资源清单中。相当于ansible中的模块,只是抽象的更加彻底。
  • 类:一组资源清单。
  • 模块:包含多个类。相当于ansible中的角色
  • 站点清单:以主机为核心,应用哪些模块。

puppet基本语法格式:puppet <subcommand> [options] <action> [options]

subcommand:

help Display Puppet help.

apply Apply Puppet manifests locally

describe Display help about resource types

agent The puppet agent daemon

master The puppet master daemon

module Creates, installs and searches formodules on the Puppet Forge

puppet安装

我们可以通过单机模式进行具体介绍puppet各组件的作用

puppet下载地址

1.配置/etc/hosts文件(以server端为例)
[root@server ~]# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.2.10 server
192.168.2.11 client
[root@server ~]# scp /etc/hosts root@client:/etc/hosts

2.安装软件包

server端:
[root@server ~]# rpm -ivh http://yum.puppetlabs.com/el/7/products/x86_64/puppetlabs-release-7-12.noarch.rpm
[root@server ~]# yum install openssl openssl-devel  ruby -y
[root@server ~]# rpm -ql puppet | less       # 可以通过rpm命令查看puppet是否安装成功,并且同时查看到包内的文件
其中主配置文件为/etc/puppet/puppet.conf,使用的主程序为/usr/bin/puppet。
[root@server ~]# ls /etc/puppet/
auth.conf  fileserver.conf  manifests  modules  puppet.conf

client端:
[root@client ~]# rpm -ivh http://yum.puppetlabs.com/el/7/products/x86_64/puppetlabs-release-7-12.noarch.rpm
[root@client ~]# yum install puppet -y
[root@client ~]# ls /etc/puppet/
auth.conf  modules  puppet.conf
------------------------------------------------------------------------------------------------------------
# auth.conf --> client访问puppet server的ACL配置文件
# fileserver.conf --> puppet server 作为文件服务器的ACL配置文件
# puppet.conf --> Puppet服务器配置文件
# manifests --> Puppet脚本主文件目录,至少需要包含site.pp文件。site.pppuppet主文件(入口文件)。所有要在服务器上执行的操作都写在这种.pp结尾的文件中。
------------------------------------------------------------------------------------------------------------

3.起服务
[root@server ~]# systemctl start puppetmaster.service 
[root@server ~]# netstat -nutlp |  grep 8140
tcp        0      0 0.0.0.0:8140            0.0.0.0:*               LISTEN      17951/ruby         
[root@server ~]# lsof -i:8140          # 查看8140端口被哪个进程所占用
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
puppet  17951 puppet    9u  IPv4 635991      0t0  TCP *:8140 (LISTEN)

4.client端修改配置文件
[root@client ~]# vim /etc/puppet/puppet.conf 
[agent]
    server=server        # 指定puppetmaster主机名
[root@client ~]# systemctl start puppet


4.配置ssl证书
[root@server ~]# puppet cert list --all       # 查看证书,查看所有的曾经过来请求了证书的,包含已经分配了证书的,“+”表示该证书已经分配给了客户端了。该客户端已经可以直接使用的
  "client" (SHA256) 7D:27:3E:2E:66:A6:ED:BD:72:AB:D0:81:87:D0:08:35:F5:2B:E7:F4:BA:1D:89:D5:0F:F8:AD:11:A6:35:70:6F
+ "server" (SHA256) 38:EC:31:51:4B:AA:93:78:F8:1F:E3:F4:94:D3:98:35:B2:B3:75:A6:B3:86:4D:A5:9C:F5:FE:CD:11:CD:75:5D
[root@server ~]# puppet cert list             # 查看有哪些客户端过来请求了证书而没有分配的客户端,表示当前客户端已经进行了请求但是服务端还没有给分配证书
  "client" (SHA256) 7D:27:3E:2E:66:A6:ED:BD:72:AB:D0:81:87:D0:08:35:F5:2B:E7:F4:BA:1D:89:D5:0F:F8:AD:11:A6:35:70:6F

[root@server ~]# puppet cert --sign  client       # 给指定的客户端进行证书分配
Notice: Signed certificate request for client
Notice: Removing file Puppet::SSL::CertificateRequest client at '/var/lib/puppet/ssl/ca/requests/client.pem'
[root@server ~]# puppet cert --sign  --all       # 如果有多个客户端可以使用--all选项,当前只有一个客户端
Error: No waiting certificate requests to sign

------------------------------------------------------------------------------------------------------------
以上所有的过程:客户端过来请求证书,服务端未分配(puppet cert list 查看),服务端手工分配证书(puppet  cert --sign  xxx.client.com)(puppet  cert  list)(puppet cert list --all再次查看), 客户端过来拿证书(puppet  agent --test   --server  xxx.server.com)
------------------------------------------------------------------------------------------------------------

[root@server ~]# puppet cert list --all        # 当前所有的客户端都已经分配了证书
+ "client" (SHA256) 41:C3:64:F6:8F:BE:FA:45:AF:E0:8F:8D:0C:E0:20:09:8E:39:E9:31:43:06:F8:EC:3B:71:69:07:C8:51:25:42
+ "server" (SHA256) 38:EC:31:51:4B:AA:93:78:F8:1F:E3:F4:94:D3:98:35:B2:B3:75:A6:B3:86:4D:A5:9C:F5:FE:CD:11:CD:75:5D
[root@server ~]# ls /var/lib/puppet/ssl/ca/signed/
client.pem  server.pem

 
[root@client ~]# puppet agent -t               # 客户端发送连接认证,出现以下内容即代表认证成功
Notice: Ignoring --listen on onetime run
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for client
Info: Applying configuration version '1605231854'
Notice: Finished catalog run in 0.01 seconds

测试

file资源,文件测试

属性:
path:文件路径;(相当于name)
content:定义文件内容(只是少量信息);
source:复制目标文件到path;
recurse:递归复制文件到path;(true/false)
ensure:present、file、directory、link、absent;
file:类型为普通文件,其内容由content属性生成或复制由source属性指向的文件路径来创建;
link:类型为符号链接文件,必须由target属性指明其链接的目标文件;
directory:类型为目录,可通过source指向的路径复制生成,recurse属性指明是否递归复制;
target:链接文件link路径;
owner:属主
group:属组
mode:权限;

# server端编写测试
建立pp文件测试
puppet的第一个执行的代码是在/etc/puppet/manifest/site.pp
因此这个文件必须存在,而且其他的代码也要通过代码来调用.
[root@server ~]# vim /etc/puppet/manifests/site.pp
node default {
file {
   "/tmp/test.txt":
   content => "this is a text file";		
}
}
此时,因为第一次配置认证后已经重启了puppetmaster ,以后配置资源就不用重启服务了。客户端直接拉取就行了

# 客户端拉取
[root@client ~]# puppet  agent --server server --test       # 不运行这个命令也可以,默认是30分钟去服务端去拉取一次,这里就采取手动拉取,立即更新资源到本地
Notice: Ignoring --listen on onetime run
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for client
Info: Applying configuration version '1605234695'
Notice: Finished catalog run in 0.01 seconds

[root@client ~]# cat /tmp/test.txt                         # 查看文件
this is a text file
package资源,包的测试

属性:

ensure: installed, present, latest, absent, any version string (implies present)

name: 包名;

source: 程序包来源,仅对不会自动下载相关程序包的provider有用,例如rpm或dpkg;

provider: 指明安装方式;

platform: 平台(X86_64……)

# server端编写
[root@server ~]# vim /etc/puppet/manifests/site.pp
node default {
package {
   ["ntp","vsftpd"]:                         # 软件包的名,可以为多个
   allow_virtual => false,                   # 虚拟包名
   ensure => "installed";                    # 下载安装,ensure :软件包的状态,installed或present表示安装,absent表示卸载;pureged表示一处软件包;latest表示安装最新的。
   
   "lrzsz":                                  # 软件包名
   allow_virtual => false,                   # 虚拟包名
   ensure => "absent";                       # 卸载软件
}
}
# client端查看结果
[root@client ~]# rpm -q  vsftpd
vsftpd-3.0.2-27.el7.x86_64
[root@client ~]# rpm -q  ntp
ntp-4.2.6p5-29.el7.centos.2.x86_64
[root@client ~]# rpm -q  lrzsz
未安装软件包 lrzsz 


# 同时,puppet也可以通过source源指定软件包,通过rpm方式安装.
# server端编写
[root@server ~]# vim /etc/puppet/manifests/site.pp
node default {
package { "lrzsz":
      ensure => present,
      source => "/mnt/gz/Packages/lrzsz-0.12.20-36.el7.x86_64.rpm",
      provider => "rpm";
}
}

# client端查看
[root@client ~]# puppet  agent --server server --test
Notice: Ignoring --listen on onetime run
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for client
Info: Applying configuration version '1605238159'
Notice: Finished catalog run in 0.11 seconds

[root@client ~]# rpm -q lrzsz           # 查看该包已经安装成功
lrzsz-0.12.20-36.el7.x86_64
service资源,系统服务的管理

属性:

enable: 是否开机自起(true/false);

binary: 启动程序的二进制路径

hasrestart: 是否支持传参数重起(true:直接restart;false:先stop再start);

restart: 定义重启命令,通常用于定义reload操作;

stop:

start: 手动定义启动命令;

status:

path: 脚本的搜索路径,默认为/etc/init.d/;

ensure: stopped/false;running/true;

# server端编写
[root@server ~]# vim /etc/puppet/manifests/site.pp
node default {
service {
    "httpd":
     ensure => "running";

    "nfs":
    ensure => "stopped";
}
}

# client端查看
[root@client ~]# puppet  agent --server server --test
Notice: Ignoring --listen on onetime run
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for client
Info: Applying configuration version '1605238673'
Notice: /Stage[main]/Main/Node[default]/Service[httpd]/ensure: ensure changed 'stopped' to 'running'
Info: /Stage[main]/Main/Node[default]/Service[httpd]: Unscheduling refresh on Service[httpd]
Notice: Finished catalog run in 0.07 seconds

[root@client ~]# ss -nutlp |  grep 80
tcp    LISTEN     0      128    [::]:80                 [::]:*                   users:(("httpd",pid=101418,fd=4),("httpd",pid=101417,fd=4),("httpd",pid=101416,fd=4),("httpd",pid=101415,fd=4),("httpd",pid=101414,fd=4),("httpd",pid=101413,fd=4))
cron资源,计划任务的管理

属性:

command: 要执行的任务;

ensure: present/absent;

minute: 分

hour: 时

monthday: 日

month: 月

weekday: 周

user: 以哪个用户的身份运行命令

target: 添加为哪个用户的任务

name: cron job的名称;

# server端编写
[root@server ~]# vim /etc/puppet/manifests/site.pp
node default {
cron {
    "echo":
    command => "/usr/bin/echo  heihei >> a.txt",
    user => "root",
    hour => "14",
    minute => "*";
}
}

# client端测试
[root@client ~]# puppet  agent --server server --test
Notice: Ignoring --listen on onetime run
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for client
Info: Applying configuration version '1605247781'
Notice: /Stage[main]/Main/Node[default]/Cron[echo]/command: command changed '/usr/sbin/echo  heihei >> a.txt' to '/usr/bin/echo  heihei >> a.txt'
[root@client ~]# cat a.txt
heihei
heihei
文件推送

将本地的文件推送到服务器的文件夹中,client端进行同步,相当于ftp的共享目录

[root@server ~]# vim /etc/puppet/fileserver.conf
在文件的末尾添加:
[files]
        path /etc/puppet/files                        # 推送目录,要先存在此目录
        allow *

# server端写一个简单的脚本
[root@server ~]# vim /data/sh/auto_ssh.sh
#!/bin/bash
# yum -y install expect
passwd='1'
/usr/bin/expect  2>&1 << EOF
set time 30
spawn ssh tian@client 
expect {
"*yes/no" {send "yes\n";exp_continue }
"*password:" { send "$passwd\r"}
}
expect eof
EOF

# server端编写site.pp
[root@server ~]# vim /etc/puppet/manifests/site.pp 
node default {
file {
      "/mnt/auto_ssh.sh":
      source => "puppet://server/files/auto_ssh.sh",               # 源地址,书写格式为puppet://服务端主机名/files
      group => "root",
      owner => "root",
      mode => "755";
}
}

# client端连接测试
[root@client ~]# puppet  agent --server server --test
Notice: Ignoring --listen on onetime run
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for client
Info: Applying configuration version '1605516748'
Notice: /Stage[main]/Main/Node[default]/File[/mnt/auto_ssh.sh]/ensure: defined content as '{md5}05d1d648dd8148f7e8f879cca128e8eb'
Notice: Finished catalog run in 0.10 seconds

[root@client ~]# ll /mnt/auto_ssh.sh 
-rwxr-xr-x 1 root root 209 11月 16 16:52 /mnt/auto_ssh.sh
exec远程执行命令,(类似于command)

属性:

command (namevar): 要运行的命令(命令具有幂等性);

cwd: The directory from which to run the command.

creates: 文件路径,仅此路径表示的文件不存在时,command方才执行;

user/group: 运行命令的用户身份;

path: 指明搜索路径;

onlyif: 此属性指定一个命令,此命令正常(退出码为0)运行时,当前command才会运行;

unless: 此属性指定一个命令,此命令非正常(退出码为非0)运行时,当前command才会运行;

refresh: 重新执行当前command的替代命令;

refreshonly: 仅接收到订阅的资源的通知时方才运行;

# server端编写
[root@server ~]# vim /etc/puppet/manifests/site.pp 
node default {
exec {
       "bash /tmp/auto_ssh.sh":
       cwd => "/tmp",
       user => "root",
       path => [ "/bin/bash","/usr/bin","/usr/sbin","/bin" ];
}
}

# client端同步
[root@client ~]# puppet  agent --server server --test
Notice: Ignoring --listen on onetime run
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for client
Info: Applying configuration version '1605511620'
Notice: /Stage[main]/Main/Node[default]/Exec[bash /tmp/auto_ssh.sh]/returns: executed successfully
Notice: Finished catalog run in 10.20 second

参考文档:https://www.cnblogs.com/feihongwuhen/archive/2012/08/17/7169802.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

初识puppet! 的相关文章

  • Xilinx 7 系列 serdes速度

    目录 一 各器件的速率 一 各器件的速率 High speed interfaces including Serial ATA Aurora 1G Ethernet PCI Express OBSAI CPRI EPON GPON Disp
  • 将图片通过高通滤波进行锐化处理_AI智能图片清晰放大神器强势来袭,简直无敌了[189期]...

    获取方式请查看文章底部 点击上方 知秋设计素材 点右上角 点选 设为星标 AI智能图片无损放大神器 MAC WIN AI智能图片锐化清晰神器 mac win AI智能图片无损放大神器 Topaz A I Gigapixel是一款非常实用的A
  • Jenkins在centos环境下连接gitee报错问题

    问题描述 在centos环境下jenkins配置gitee时测试连接出现无法连接ERROR问题 期初怀疑是加速镜像导致gitee插件失效问题 后来看了后台错误日志后发现在centos环境下缺失jar包 之前在windows环境下测试不会出现
  • buildroot教程

    什么是buildroot Buildroot是Linux平台上一个开源的嵌入式Linux系统自动构建框架 0 下载buildroot Buildroot版本每2个月 2月 5月 8月和11月发布一次 版本号的格式为YYYY MM 例如201
  • 【翻译】全新16英寸MacBook Pro评测:开发人员的梦想成真

    要问现在适合开发者用的笔记本 市面上还是有很多选择的 比如Dell的XPS系列 外星人系列 游戏也是杠杠滴 联想拯救者系列 还有形形色色的高配机型 价格也从几千到几万不等 但是 笔吧评测室的猪哥说过 从一万元开始 就已经难以用定位的方式来给
  • Mycat windows安装

    id iframe1033655 0 src http pos baidu com jcrm rtbid 2097325 rdid 9223372032564562618 dc 2 di 1033655 dri 0 dis 0 dai 1
  • 报错:JSONException: illegal identifier : \pos 1, line 1, column 2 或not close json text, token : error

    报错 JSONException illegal identifier pos 1 line 1 column 2 或JSONException not close json text token error 简述问题 处理 结果 简述问题
  • spring IOC控制反转及IOC实现的三种方式和bean标签使用

    spring IOC控制反转及IOC实现的三种方式和bean标签使用 IOC 控制反转 简单的说是指对象的创建不再使用new 而是由spring框架创建 当服务器开始运行时 读取spring的主配置文件 经过spring框架从主配置文件中识
  • 黄勇-flask教程-学习笔记

    课时4 虚拟环境 pip install virtualenv 安装虚拟环境 virtualenv venv 创建虚拟环境 venv Scripts activate 激活虚拟环境 课时10 url反转 url for url for引用视
  • linux命令如何查看dns,linux查看dns命令

    linux下我们要查看服务器的DNS信息可以通过命令来实现 下面由学习啦小编为大家整理了linux查看dns命令的相关知识 希望对大家有帮助 linux查看dns命令1 查看 etc resolv con文件 root localhost
  • 索引原理学习

    一 介绍 1 什么是索引 一般的应用系统 读写比例在10 1左右 而且插入操作和一般的更新操作很少出现性能问题 在生产环境中 我们遇到最多的 也是最容易出问题的 还是一些复杂的查询操作 因此对查询语句的优化显然是重中之重 说起加速查询 就不
  • linux安装jdk tar包

    1 java删除openJDK rpm qa grep java rpm e nodeps 查出来的java软件 例 rpm e nodeps java 1 8 0 openjdk headless 1 8 0 101 3 b13 el7
  • Elasticsearch好用查询插件分享

    以前我常用的ES查询工具是Head 作为插件形式在浏览器中运行 挺方便的 后来发现head不太好用 比如在数据浏览的时候 不小心就点击了两个索引 背景色设置的还不够明显 比较容易看错数据的 于是想找个更好用的工具 以前用过cerebro 觉
  • Linux内核学习(二):Bootloader

    Linux内核学习 二 UBOOT 在上一篇的文章中通过图片介绍了linux镜像的生成与加载 引出了一个东西叫uboot 是这个玩意一手把生成的内核镜像加载进去的 于是在进一步之前 我们得看看学习一下什么是Uboot 以及其工作流程和逻辑
  • com.google.common.base.Preconditions

    前提条件 Guava提供了许多前置条件检查实用程序 我们强烈建议您静态导入这些内容 每种方法都有三种变体 没有额外的争论 抛出任何异常都没有错误消息 一个额外的Object论点 抛出任何异常并显示错误消息 object toString 一
  • 【Linux】冯诺依曼体系结构思想

    冯诺依曼体系结构 冯诺依曼体系结构 冯诺依曼体系结构的五大部分 冯诺依曼体系结构的运行过程 存储器中的木桶效应 扩展 计算机存储设备金字塔 实例 qq聊天数据传输过程 小结 博客主页 小智 x0 0x 欢迎关注 点赞 收藏 留言 系列专栏
  • UnityVR--组件10--UGUI简单介绍

    目录 前言 UI基础组件 1 Canvas 2 EventSystem 3 Image 4 Text TextMeshPro InputField 5 Button控件 其他 前言 UGUI是Unity推出的新的UI系统 它与Unity引擎
  • 2023年第47届(第二届)浙江技能大赛网络安全项目 (世赛省选拔赛)C模块任务书

    2023年第47届 第二届 浙江技能大赛网络安全项目 世赛省选拔赛 C模块任务书 模块C 夺旗挑战赛 1竞项赛目简介 1 1 介绍 1 2环境和目标 1 2 1 CTF 架构 1 2 2 挑战 1 3 评分方案 1 4 工作流程 2竞赛项目
  • Unity接入GooglePlay服务

    请大家关注我的微博 NormanLin BadPixel坏像素 前置条件 Google开发者账号 需要支持Visa的信用卡 java与Android开发环境的搭建 Unity上连接AndroidSDK与Java jdk AndroidSDK
  • 毕业设计-基于机器学习的双目测距系统-OpenCV

    目录 前言 课题背景和意义 实现技术思路 一 系统环境要求与流程图 二 摄像机模型和标定 四 立体匹配与测距 五 测距系统实验结果 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备

随机推荐

  • 由动态库文件dll生成lib库文件

    本文基于OpenBlas的编译和安装 来说明怎样从一个dll文件生成lib库文件 參考OpenBlas的说明 Howto generate import library for MingW 和MinGW的说明HOWTO Create an
  • 揭秘前端文件上传原理(二)

    上一篇文章讲到了以Form表单 将文件数据编码为特定的类型 来作为前端文件上传的载体 这一篇再来看看 如果不使用Form表单 不以FormData去提交数据 我们又将如何上传文件到云端呢 Form表单的意义 首先来想一想 Form表单对文件
  • 详解 七大经典排序算法

    文章目录 概念 代码 一 插入排序 直接插入排序 希尔排序 二 选择排序 选择排序 堆排序 三 交换排序 冒泡排序 快速排序 四 归并排序 归并排序递归 归并排序非递归 法一 法二 五 非比较排序 计数排序 排序算法总结 复杂度和稳定性 效
  • mysql故障记录以及binlog2sql学习使用

    mysql两次故障记录 centos7 4和7 5 一 故障描述 故障一 mysql主库的vip漂移到了备库 20分钟后后人工切换了回来 由于不是主主同步模式 所以主库缺失了这写入备库的20分钟的数据 故障二 有人员误删生产库中某个表的几百
  • OAuth 简介

    OAuth是一个在不提供用户名和密码的情况下 授权第三方应用访问Web资源的安全协议 常用的应用 OAuth 的场景 一般是某个网站想要获取一个用户在第三方网站中的某些资源和服务 比如在人人网上 想要导入用户MSN里的好友 在没有OAuth
  • lua 的 table表 大小、元素个数 #操作 的体会【结论是错误的, 此后再更新】

    有个体会 lua table 的 操作 是针对 table insert table remove 这一对操作的 操作数维护 每次调用 table insert 都会是 操作值增加 这是我自己的表达 即使 用 table 取得表的 返回值
  • requests上传和flask接收OpenCV的图片数据

    方式一 从本地读取到图片或帧 上传到flask服务器 客户端发送 def image post data type code type code area id area id 以文件的格式上传 节省传输时间 file file file
  • 腾讯云技术大牛教你,MySQL内核深度优化

    作者介绍 简怀兵 腾讯云数据库高级工程师 负责腾讯云CDB内核及基础设施建设 先后供职于Thomson Reuters和YY等公司 PTimeDB作者 曾获一项发明专利 从事MySQL内核开发工作8年 具有丰富的优化经验 在分布式存储等领域
  • main(int argc, char **argv)中argc和argv的具体含义,以及操作系统如何处理它们

    main int argc char argv 中argc和argv的具体含义 以及操作系统如何处理它们 请高手详细解释一下 谢谢 1 argc 参数的个数 argv 参数的字符串形式的数组 2 C C code int main int
  • 解决display:none

    selenium 解决页面元素display none的方法 在UI自动化测试中 有时候会遇到页面元素无法定位的问题 包括xpath等方法都无法定位 是因为前端元素被设置为不可见导致 这篇博客 介绍下如何通过JavaScript修改页面元素
  • 2019CISCN华中赛区分区赛部分wp

    pwn1 64位程序 只开启了NX 栈不可执行 保护 试着运行发现是一个菜单题 选项二 三没用 拖到IDA中查看 发现在encrypt选项中存在gets造成的栈溢出漏洞 不过输进去的字符串被分段异或了 我们可以先进行异或一下 然后在输入程序
  • 嵌入式C惯用法

    1 cpp里的c代码按照c的方式来编译和调用 时常在cpp的代码之中看到这样的代码 ifdef cplusplus extern C endif 一段代码 ifdef cplusplus endif 这样的代码到底是什么意思呢 首先 cpl
  • git for Linux 详细安装步骤 及 详细设置 ----git源码编译安装

    前记 git svn sourcetree gitee github gitlab gitblit gitbucket gitolite gogs 版本控制 仓库管理 系列工程笔记 Platform Ubuntu18 04 LTS Git
  • gulp-rev 和 rev-collector 控制版本总是上一个旧版本的bug原因

    原因是执行顺序的问题 css处理 gulp task css function return gulp src css path pipe stylus config stylus pipe autoprefixer config auto
  • Acwing - 131. 直方图中最大的矩形

    131 直方图中最大的矩形 AcWing题库 题目描述 tag 单调栈 直方图是由在公共基线处对齐的一系列矩形组成的多边形 矩形具有相等的宽度 但可以具有不同的高度 例如 图例左侧显示了由高度为 2 1 4 5 1 3 3 的矩形组成的直方
  • 2021年防关联浏览器哪个好(防关联测评)

    之前文章我已经介绍了防关联浏览器行业的隔离效果比较 这次专门为大家分享一下各个软件的售后客服专业度 软件操作界面易上手程度 以及相应时间方面的比较 作为一个付费用户 尤其是像我这种花了几万学习的亚马逊测评基础知识的同学 本身就没有什么电脑网
  • wifi 小米pro 驱动 黑苹果_macOS安装教程兼小米Pro安装过程记录

    引言 一直以来就想写个macOS的安装教程 可惜没有TransMac以及BIOS设置的截图 正好小米PRO黑苹果高级群的班长 原味菠萝最近一直在写小米Pro安装黑苹果的教程 由于他工作繁忙 一直也没有完稿 我就在他写作的基础上将这篇教程完善
  • Day 6 - 集合及字符串习题

    输入一个字符串 打印所有奇数位上的字符 下标是1 3 5 7 位上的字符 例如 输入 abcd1234 输出 bd24 s1 adkfuyhiwuhtshd print s1 1 2 输入用户名 判断用户名是否合法 用户名长度6 10位 u
  • 小白教程!x2m和x3m音频格式转换.mp3格式

    如果你下载的文件是一个 x2m或 x3m格式文件的 这种格式是经过加密处理的 正常情况下是无法进行格式转换的 不过这里也不是完全没有办法 今天就教你一个比较简单的x2m和x3m格式转换方法 这个格式转换方法需要借助一个小工具来实现 不过它并
  • 初识puppet!

    什么是puppet puppet是一个IT基础设施自动化管理工具 它能够帮助系统管理员管理基础设施的整个生命周期 供应 provisioning 配置 configuration 联动 orchestration 及报告 reporting