SaltStack的state定义主机状态及Jinja模版的使用

        在前面我们学习了远程执行模块,这些模块的执行类似语段 she11 脚本,每次执行都会触发一次相同的功能,在大量的 minion 上运行远程命令当然是重要的,但是对于 minion 的环境控制,使用状态进行管理更为合适,转台是对 minion 的一种描述和定义,管理人员可以不用关心具体部署的任务是如何完成的,只需要描述 minion 要达到什么状态,底层由 salt 的状态模块来完成功能。

一、state模块概述

1.什么是 state

        State 是 saltstack 系统中的配置语言,在日常运维中需要编写大量的 state 文件,例如:创建用户、安装软件、配置软件、服务运行等。需要编写一些 state SLs 文件,即状态配置文件去描述和实现相应的功能。state sLs 主要使用 YAML 语言,也可以支持使用 Python 语言编写。
        例如以下语句,用 yaml 语言描述了一个安装 apache 的 state 模块。

apache-install:#ID声明,ID必须唯一
  pkg.installed:#state 状态声明
    - names:#选项声明
    - httpd #选项列表
    - httpd-devel

apache-service:
  service.running:
    - name:httpd
    - enable:True

2.state 模块的作用

        远程执行是 salt 的核心所在。
        管理员可与通过执行远程执行模块,达到对 minion 的控制(如 cmd.run "yum install -y httpd")
但对于 minion 的环境控制,即你想 minion 达到一个什么样的状态,用 state 模块更为合适。你只需要描述你想 salt minion 达到什么状态就行了,剩下的交由 state 模块来完成。

3.state配置文件的各个要素

        state 模块可以使用 SLS(SaLtstack)配置文件来定义,SLS 配置文件是使用 yaml 语言描述的,yaml 是一个有很多强大特效型的标记性语言,salt 使用的一个yaml的小型子集,用来映射那些非常常用的数据结构,像列表和字典。yaml renderer 将yam1 的数据格式编译成为 python 数据结构给 salt使用。
        YAML 的语法和其它语言类似,也可以表达散列表、标量等数据结构。其中结构(structure)通过空格来展示;序列(sequence)里的项用“_”来代表;Map 里的键值对用“:”分隔。YAML 文件扩展名通常为:yaml,也可以简写为yml。
        只需要记住三个非常简单的规则就可以使用 yaml 编写 SLS 文件了,

(1)缩进

        yaml 使用了一个固定的缩进风格来表示数据层的结构关系,salt 需要每个缩进级别用两个空格。注意不要用制表符(Tab)。

(2)冒号

        Python 的字典是一种简单的键值对,这个数据类型在其他语言用户中又叫做哈希表或关联属组。

        字典的 keys 在 yaml 中的表现实行是一个冒号结尾的字符串。values 的表现形式是冒号后面用一个空格隔开,然后写 values 值。

(3)横杠

        用一个短横杠加一个空格来表示列表项,多个项使用同样的缩进级别作为同一列表的一部分。

二、saltstack 常用模块及应用

        在前面我们曾经用“salt"web81"sys.list_modules“命令获取 minion 端所有可以执行的模块,也可以用“sys.list functions“获取某一模块包含的所有函数,用“sys.doc“获取某一个函数的具体用法。
        Saltstack 工具提供了非常多的功能模块,以便于对操作系统的基础功能和常用工具进行操作。接下来我们演示几个典型的模块,通过这些常见模块的使用,我们掌握模块应用的一般规律。

1.pkg模块

pkg 模块的作用是包管理,包括增、删、更新。

(1)设置 top.sls 文件
[root@master ~]# cd /srv/salt/
[root@master salt]# vim top.slsbase:'web*':- init.apache
[root@master salt]# mkdir init
(2)安装单个httpd包 
[root@master salt]# cd init/
[root@master init]# vim apache.slshttpd:pkg.installed
[root@master init]# salt '*' state.highstate
(3)卸载一个包

如果要卸载一个包,可以使用下面的方法 

[root@master init]# vim apache.slshttpd:pkg.removed

 备注:
也可以直接用 salt 命令进行安装或卸载
#在 minion 上安装 httpd
[root@master ~]# salt'web01' pkg.install "httpd"

#检查 httpd 包的版本
[root@master ~]# salt 'web01' pkg.version "httpd'

#卸载 minion 上的 "httpd"
[root@master ~]# salt'web01'pkg.remove "httpd"

(3)安装一系列软件包

方法 1:

[root@master init]# vim apache.slsmypkgs:pkg.installed:- pkgs:- httpd: '=2.4.6'- mariadb

注意:可以使用<,<=,>=,and >等符号指定要安装的版本。 

[root@master init]# salt '*' state.highstate
(4)卸载一组包 
[root@master init]# vim apache.slsmypkgs:pkg.removed:- pkgs:- httpd: '=2.4.6'- mariadb

 备注
也可以用 salt 命令直接对一组包进行管理
[root@master ~]# salt '*' pkg.install pkgs='["httpd","mariadb"]


[root@master ~]# salt '*' pkg.install pkgs='["mariadb", {"httpd": “2.4.6"}]
[root@master ~]# salt '*' pkg.remove pkgs='["httpd","mariadb"]'

(5)升级软件包到最新
[root@master init]# vim apache.slsmypkgs:pkg.latest:- pkgs:- httpd- mariadb
[root@master init]# salt '*' state.highstate
 (6)通过rpm 文件安装指定的rpm 包

上传 rpm 包文件到 base日录:/srv/salt

[root@master salt]# ls
init  top.sls  zabbix-agent-5.2.1-1.el7.x86_64.rpm
[root@master init]# vim apache.sls mypkgs:pkg.installed:- sources:- zabbix-agent: salt://zabbix-agent-5.2.1-1.el7.x86_64.rpm
[root@master init]# salt '*' state.highstate

2.file模块 

        file 模块的作用是管理文件操作,包括同步文件,设置文件权限,所属用户组,删除文件等操作。file 模块的函数如下所示:

  • file.managed:文件管理;
  • file.append:向文件中添加内容;
  • file.comment:文件注释操作;
  • file.copy:把 Minion 本地文件复制到某个目录下;
  • file.directory:目录创建;
  • file.exists:判断文件是否存在;
  • file.absent:删除文件;
  • file.symlink:建立 link 链接参数详解:
  • file.touch:创建空文件,或者修改文件三个时间;

下面演示几个 file 模块的使用方法:

(1)YUM 安装源配置文件同步
[root@master salt]# rm -rf *
[root@master salt]# vim top.slsbase:'web*':- init.myfile
[root@master salt]# mkdir init
[root@master salt]# mkdir files
[root@master salt]# cp /etc/hosts /srv/salt/files/
[root@master salt]# cd init/
[root@master init]# vim myfile.slsmyhosts:file.managed:- name: /etc/hosts- source: salt://files/hosts- mode: 644- owner: root- group: root
[root@master init]# salt '*' state.highstate
[root@master init]# echo '192.168.10.104 node3' >>/srv/salt/files/hosts 
[root@master init]# salt '*' state.highstate
[root@master init]# salt '*' state.highstate

 同步后再minion端查看/etc/hosts文件的变化

(2)同步之前备份文件
[root@master salt]# vim top.slsbase:'web*':- init.myfile
[root@master salt]# cd init
[root@master init]# vim myfile.slsmyhosts:file.managed:- name: /etc/hosts- source: salt://files/hosts- mode: 644- owner: root- group: root- backup: minion
[root@master init]# echo '192.168.10.105 node4' >>/srv/salt/files/hosts 
[root@master init]# salt '*' state.highstate
[root@master init]# echo '192.168.10.106 node5' >>/srv/salt/files/hosts 
[root@master init]# salt '*' state.highstate

同步后再minion端查看/etc/hosts文件的变化 

[root@minion01 ~]# ll /var/cache/salt/minion/file_backup/etc
(3)向Minion的文件中追加内容 
[root@master init]# vim myfile.sls /etc/hosts:file.append:- text:- '192.168.10.107 test01'- '192.168.10.108 test02'
[root@master init]# salt '*' state.highstate

 直接向minion中的文件追加内容

(5)把 minion 端的本地的文件拷贝到 minion 端的其他目录中
[root@master init]# vim myfile.sls /opt/hosts.bak:file.copy:- source: /etc/hosts- makedirs: True- force: True
[root@master init]# salt '*' state.highstate

注意:
这两个目录和文件都是 minion 端的 

(6)创建目录,并作相应设置
[root@master init]# vim myfile.sls /opt/aaa/bbb/ddd/fff:file.directory:- user: root- group: root- dir_mode: 755- file_mode: 644- makedirs: True
[root@master init]# salt '*' state.highstate

 注意:
makedirs: True        如果要创建的是目录树,要启用递归方式创建,

(7)判断文件是否存在
[root@master init]# vim myfile.sls /opt/hosts.bak:file.exists
[root@master init]# salt '*' state.highstate
 (8)设置链接
[root@master init]# vim myfile.sls /opt/hosts-link.bak:file.symlink:- target: /opt/hosts.bak- force: True
[root@master init]# salt '*' state.highstate
 (9)创建一个空文件
[root@master init]# vim myfile.sls /opt/aaa.log:file.touch
(10)删除文件 
[root@master init]# vim myfile.sls /opt/aaa.log:file.touch

3.cmd模块 

cmd 模块的作用是在 Minion 上执行命令或者脚本,参数如下所示。

cmd.run 参数

  • name:执行脚本或者命令的名字;
  • onlyif:测试命令,如果执行测试命令返回 true,cmd.run 的命令才有可能执行;
  • unless:与 onlyif 相反,如果执行后为 false,cmd.run 的命令才有可能执行;
  • cwd:执行命令当前目录设置,默认为/root;
  • user:执行命令的用户,默认 root;
  • group:执行命令的组,默认root;
  • shell:执行命令使用的 Shell;
  • env:执行命令的环境设置;
  • umask:运行命令时候 umask 设置;
  • output loglevel:执行命令日志输出级别,其中特殊的设置是 quiet,不输出日志;
  • timeout:执行命令的超时时间,如果超时就发送 kill -l SIGTERM 命令,如果"kill -l SIGTERM"被忽略了,那么紧接着发送 kill 命令。

cmd.wait 参数

        与 cmd.run 中的参数相比,只是 wait 中没有 timeout 参数,其他参数意义一样。

        cmd.run 和 cmd.wait 的区别是:有多个判断条件的时候,在 cmd.run 中只要有一个条件满足就会执行cmd.run;而在cmd.wait 中则所有的条件都满足才会执行 cmd.wait。

        cmd.run 在每次应用 state 的时候都会被执行;而 cmd.wait 用于在某个 state 变化时才会执行,状态不变化,就不会执行,通常和watch 一起使用,watch 用来检测状态的变化。

(1)使用root用户执行脚本/opt/aaa.sh
[root@master ~]# cd /srv/salt/
[root@master salt]# rm -rf *
[root@master salt]# vim top.slsbase:'web*':- init.cmd
[root@master salt]# mkdir init
[root@master salt]# mkdir files
[root@master salt]# cd init/
[root@master init]# echo "ls" >/srv/salt/files/aaa.sh
[root@master init]# vim cmd.sls/opt/aaa.sh:file.managed:- source: salt://files/aaa.sh- mode: 744
run aaa.sh:cmd.run:- name: /opt/aaa.sh- cwd: /- user: root
[root@master init]# salt '*' state.highstate

 备注:
cwd:执行命令时的当前工作目录
mode:744 要设置执行权,否则无法在 minion 端执行此脚本

(2)判断 httpd 配置文件是否改动

如果改动,执行同步,然后测试配置文件是否可用,如果可用,重新加载配置文件

[root@master ~]# cd /srv/salt/
[root@master salt]# vim top.slsbase:'web*':- init.cmd

#在minion 上安装 httpd,并启动 

[root@master salt]# salt '*' pkg.install "httpd"
web02:----------
web01:----------
[root@master salt]# salt '*' service.start "httpd"
web01:True
web02:True
[root@master salt]# mkdir -p /srv/salt/httpd/conf
[root@master salt]# yum -y install httpd

注意:此处安装httpd,只是为了得到一个httpd的配置文件。 

[root@master salt]# cp /etc/httpd/conf/httpd.conf /srv/salt/httpd/conf/
[root@master salt]# vim /srv/salt/httpd/conf/httpd.conf
#修改端口号为8080
Listen 8080
[root@master salt]# cd init
[root@master init]# vim cmd.sls "/etc/httpd/conf/httpd.conf":file.managed:- source: salt://httpd/conf/httpd.confhttpd:cmd.wait:- name: "/usr/sbin/httpd -k graceful"- watch:- file: "/etc/httpd/conf/httpd.conf"
[root@master init]# salt '*' state.highstate

在minion端查看改动情况: 

[root@minion01 opt]# netstat -anpt | grep httpd
tcp6       0      0 :::8080                 :::*                    LISTEN      4517/httpd

        需要注意的是:"/etc/httpd/conf/httpd.conf”配置文件这块,最好使用引号,因为有时候可能会含有特殊字符。另外,端口不要有冲突,否则,minion端的服务无法启动 

备注:

        执行 httpd -k restart 或者 httpd -k graceful 指令都会重启子进程(主进程未重启)

        只不过后者更加强调顺滑、优雅,先是启动了相同数量的子进程替代之前的进程进行服务,之后才去关闭之前的进程。-k是明确执行的对象是正在运行中的 httpd 服务,所以有些教程又把这种带 -k 的启动,叫热启动,重启叫热重启。

4.user 模块

user 模块的作用是管理系统账户操作。

user.present 用于创建用户

  • name:要创建的用户名;
  • uid:设置 uid;
  • gid:设置默认的组 gid;
  • groups:设置用户所属组:
  • home:用户的自定义登录目录;
  • password:为用户设置密码:
  • enforce_password:如果密码已设置且密码哈希值与“password“字段中设置的密码不同,则设置为 False 以防止密码被更改。如果未设置“password“,则忽略此选项,默认为 True;
  • shell:设置用户的登录后的 Shell,默认将设置为系统默 Shell;
  • uid、gid、home 等选项没有设置是系统默认设置

user.absent 用于删除用户

  • name:设置需要删除的用户名:
  • purge:是否删除用户家目录;
  • force:如果用户当前已登录,则 absent state 会失败。选项为 True 时,就算用户当前处于登录状态也会删除本用户。
(1)创建用户并设置密码、shell、home 日录、uid、gid、其他所属组
[root@master salt]# rm -rf *
[root@master salt]# vim top.slsbase:'web*':- init.user
[root@master salt]# mkdir init
[root@master salt]# cd init/
[root@master init]# vim user.slszhangsan:user.present:- password: 'pwd123'- shell: /bin/bash
[root@master init]# salt '*' state.highstate

5.service模版 

service 模块的作用是管理系统服务操作,包括 start、stop、reload、restart。

service 模块的操作有:

  • name:服务名称:
  • enable:设置自启动 True,默认不设置
  • watch:监控一些条件,如果成立默认执行restart。
  • reload:默认为 False,如果设置为 True 时候,当 watch 条件成立,则会 reload, 不会restart.
(1)编写入口文件
[root@master salt]# rm -rf *
[root@master salt]# vim top.slsbase:'web*':- init.service
(2)编写服务启动文件
[root@master salt]# mkdir init
[root@master salt]# cd init/
[root@master init]# vim service.slshttpd:service:- running- enable: True- reload: True
[root@master init]# salt '*' state.highstate
 (3)编写关闭服务文件
[root@master init]# vim service.slshttpd:service:- dead- enable: True- reload: True
[root@master init]# salt '*' state.highstate

 备注:
service.running:        #服务状态运行
  - enable:True        #允许开机启动
  - reload:True        #允许 reload 服务,默认 restart

其他:

[root@master init]# salt '*'service.start httpd
[root@master init]# salt '*'service.stop httpd
[root@master init]# salt '*'service.restart httpd

[root@master init]# salt '*'service.status httpd

6.corn模块

cron 模块作用管理 cron 服务操作
cron.present添加cron 任务的操作:

  • name:资源名字;
  • user:默认 root,或者指定用户执行;
  • minute、hour、daymonth、month、dayweek:参数默认是*;
  • cron.absent:删除cron 任务。
(1)添加 cron 任务
[root@master salt]# rm -rf *
[root@master salt]# vim top.slsbase:'web*':- init.cron
[root@master salt]# mkdir init
[root@master salt]# cd init/
[root@master init]# vim cron.sls/path/to/cron/script:cron.present:- user: root- minute: random- hour: 2- daymonth: '*'- month: '*/2'- dayweek: 4- comment: "this script is rsync pic"

 备注:

        - minute:random    随机的时间

[root@master init]# salt '*' state.highstate
 (2)删除 cron 任务
[root@master init]# vim cron.sls
/path/to/cron/script:cron.absent

 注意
        cron.absent 后面没有冒号

[root@master init]# salt '*' state.highstate

7. hosts 模块

hosts 模块的作用是管理/etc/hosts 文件,参数如下所示。

host.present 添加域名操作方法

  • name:域名;
  • names:多个域名;
  • ip:ip 地址。

host.absent 删除域名。

(1)添加 ip 与域名对应
[root@master salt]# rm -rf *
[root@master salt]# vim top.slsbase:'web*':- init.hosts
[root@master salt]# mkdir init
[root@master salt]# cd init/
[root@master init]# vim hosts.slshost1:host.present:- ip:192.168.10.101- name: master
host2:host.present:- ip:192.168.10.102- names: - web01
host2:host.present:- ip:192.168.10.103- names: - web02- mysql02
[root@master init]# salt '*' state.highstate
(3) 删除ip对应的域名
[root@master init]# vim hosts.slshost2:host.absent:- ip:192.168.10.102- names: - web01
[root@master init]# salt '*' state.highstate

三、Jinja模板

        对于同一文件,推送到不同主机上时,需要改动的内容不一定相同。比如 web 中我们需要监听对应minion 端自己的一个网卡 IP、某个端口,就不可以直接配置文件指定 IP,需要涉及到一些变量进行获取后更改操作。现在 Saltstack 使用 Jinja 模板进行文件管理,在 jinja 中使用 grains、pillar 等标识并加上一些变量,就可以实现上述操作,同时可以使得文件管理更灵活,使用 jinja 可以减少人为操作,提升工作效率。

1.什么是 Jinja

        jinja 是 state(即.sls)文件中默认模版语言,基于 python

        state 文件中使用“_template:jinjia”声明

        Jinja 模板包含变量和表达式,变量用{{ }}包围,表达式用{% %}包围。

2.Jinja 模板使用的三个场景

(1)file 状态使用 template 参数
(2)模板文件里边使用变量名称{{ 变量 }} 。比如 {{ HOST }}{{PORT}}
(3)变量列表(变量列表和 default 对齐)

3.Jinjia 语法

(1)变量和表达式的定义

设置变量用{% 表达式 %},jinja 取变量的方法是使用{{ 变量 }}。

定义方法如下所示:

#设置变量
{% set var ='good' %}

#取变量值
{{ var }}
{{ grains['id'] }}

(2)判断语句

{% if grains['os']=='centos' %}

apache: httpd
{% elif grains['os']=='Debian' %}

apache:apache2

{% endif %}

(3)循环语句

{% for user in users%}
  {{ user }}
{{ endfor }}

4.利用 grains 数据,编写 Jinja 模板文件

(1)编写 top 文件
[root@master salt]# rm -rf *
[root@master salt]# vim top.slsbase:'web*':- init.myfile
(2)编写模板文件 
[root@master salt]# mkdir init
[root@master salt]# mkdir files
[root@master salt]# vim files/
[root@master salt]# cd files/
[root@master files]# vim myhost.conf{% if grains['os'] == 'RedHat' %}
host: {{ grains['host'] }}
{% elif grains['os'] == 'CentOS' %}
host: {{ grains['fqdn'] }}
{% endif %}
(3)编写同步文件 
[root@master salt]# cd init/
[root@master init]# vim myfile.slsmyhost:file.managed:- name: /opt/myhost.conf- source: salt://files/myhost.conf- mode: 644- owner: root- group: root- template: jinja
(4)执行同步命令 
[root@master init]# salt '*' state.highstate
(5)minion端查看同步过去的文件 
[root@minion01 ~]# cat /opt/myhost.conf host: minion01

 5.利用 pillar 数据编写 Jinja 模板--nginx 安装案例

(1)配置 pillar

        在主控端上创建入口文件 top.sls,入口文件的作用是定义 pillar 的数据覆盖被控主机的有效域范围。具体内容如下:

[root@master ~]# vim /srv/pillar/top.slsbase:group1:- match: nodegroup- web01group2:- match: nodegroup- web02
 (2)分别定义不同组主机的 Nginx 的根目录
[root@master ~]# vim /srv/pillar/web01.slsnginx:root: /data
[root@master ~]# vim /srv/pillar/web02.slsnginx:root: /www
(3)使用以下命令查看pillar配置的情况 
[root@master ~]# salt 'web01' pillar.datanginx:----------root:/data
[root@master ~]# salt 'web02' pillar.data
nginx:----------root:/www

 在执行结果中可以很明显的看出,被控主机的 Nginx 的根目录被配置成功。

(4)定义 state 的入口 top.sls 文件

注意和 pillar 的入口文件名字一样,内容如下。

[root@master ~]# vim /srv/salt/top.slsbase:'*':- nginx
 (5)定义被控机执行的状态,安装 Nginx 软件、配置、启动。
[root@master ~]# vim /srv/salt/nginx.slsnginx:pkg:- installedfile.managed:- source: salt://nginx/nginx.conf- name: /etc/nginx/nginx.conf- user:root- group: root- mode: 644- template: jinjaservice.running:- enable: True- reload: True- watch:- file: /etc/nginx/nginx.conf- pkg: nginx

备注:

  •  salt://nginx/nginx.conf 为配置模板文件位置;
  • enable:True 表示检查服务是否在开机自启动服务队列中,如果不在则加上,等价于chkconfig nginxon 命令;
  • reload:True 表示服务支持 reload 操作,不加则会默认执行 restart 操作;
  • watch 即用于检测/etc/nginx/nginx.conf 是否发生变化,又用于确保 Nginx 已安装成功。
  • Jinja 是一种基于 python 的模板引擎,在 SLS 文件里可以直接使用 jinja 模板来做一些操作,通过 iinja 模板可以为不同服务器定义各自的变量。
(6)创建 nginx 模板文件
[root@master ~]# vim /srv/salt/nginx/nginx.confuser nginx;
worker_processes {{grains['num_cpus']}};
{% if grains['num_cpus'] ==1 %}
worker_cpu_affinity 10;
{% elif grains['num_cpus'] ==2 %}
worker_cpu_affinity 01 10;
{% elif grains['num_cpus'] == 4 %}
worker_cpu_affinity 0001 0010 0100 1000;
{% elif grains['num_cpus'] == 8 %}
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
{% else %}
worker_cpu_affinity 0001 0010 0100 1000;
{% endif %}
error_log /var/log/nginx_error.log;
pid /var/run/nginx.pid;
events{worker_connections 1024;}
http{include /etc/nginx/mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 60;log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" '  '"$http_user_agent" "$http_x_forwarded_for"' ;server{listen 80 default_server;server_name _;location / {root {{ pillar['nginx']['root'] }};index index.html index.htm;}error_page 404 /404.html;location = /404.html {root /usr/share/nginx/html;}error_page 500 502 503 504 /50x.html;location = /50x.html {root /usr/share/nginx/html;}}}

(7)在主控端执行刷新state配置 

[root@master ~]# salt '*' state.highstate

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

从零开始制作AI无人直播插件!

AI无人直播插件应运而生&#xff0c;它利用人工智能技术&#xff0c;实现了直播内容的自动化生成与播放&#xff0c;极大地降低了直播的人力成本和时间成本&#xff0c;本文将带你从零开始&#xff0c;探索如何制作一个AI无人直播插件&#xff0c;并分享五段关键的源代码。 AI…

谷歌深度学习研究揭示OpenAI O1模型优化策略:比规模更重要的计算效率

引言 近年来&#xff0c;大型语言模型&#xff08;LLMs&#xff09;如OpenAI的GPT-4和Google DeepMind的Palm 2已成为自然语言处理领域的佼佼者&#xff0c;它们通过生成类人文本、回答复杂问题、编写代码等能力&#xff0c;改变了许多行业的工作方式。然而&#xff0c;随着这…

IO流体系(FiletOutputStream)

书写步骤&#xff1a; 1.创建字节输出流对象 细节1:参数是字符串表示的路径或者是File对象都是可以的 细节2:如果文件不存在会创建一个新的文件&#xff0c;但是要保证父级路径是存在的。 细节3:如果文件已经存在&#xff0c;则会清空文件 2.写数据 细节:write方法的参数…

大白话解读末日期权是什么意思?末日期权与黑天鹅!

今天带你了解大白话解读末日期权是什么意思&#xff1f;末日期权与黑天鹅&#xff01;末日期权与黑天鹅事件的关系主要体现在风险和波动性管理上&#xff0c;交易者需要谨慎对待这两者的互动。 末日期权和期权黑天鹅事件之间的关系主要体现在风险管理和市场波动性上。 末日期…

没有那个文件或目录 #include <bits/libc-header-start.h>

Ubuntu 18.04 编译需要编译32位系统 gcc -ggdb -m32 -c -o exploit.o exploit.c gcc -m32 -L/usr/lib32 exploit.o -o exploit 报错&#xff1a; 解决方法&#xff1a; sudo apt-get install libc6-dev-i386sudo apt-get install gcc-multilib

【C++】哈希表:字母异位词分组(体会泛型编程的强大)

1.题目 2.思路 利用map的特性&#xff0c;第一个值存排好序的string&#xff0c;第二个值存vector<string>。这样就可以很好的将异位词分组。 3.代码 class Solution { public:vector<vector<string>> groupAnagrams(vector<string>& strs) {un…

25届计算机专业毕设选题推荐-基于python的二手电子设备交易平台【源码+文档+讲解】

&#x1f496;&#x1f525;作者主页&#xff1a;毕设木哥 精彩专栏推荐订阅&#xff1a;在 下方专栏&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; 实战项目 文章目录 实战项目 一、基于python的二手电子设备交…

六西格玛绿带培训多少钱?从授“鱼”到授“渔”

六西格玛作为一种全球公认的质量管理方法&#xff0c;其影响力日益扩大&#xff0c;而六西格玛绿带培训作为这一体系中的关键环节&#xff0c;更是吸引了众多希望在职场上脱颖而出的专业人士。本文&#xff0c;深圳天行健企业管理咨询公司将从多个维度深入探讨“六西格玛绿带培…

【大模型】初识大模型(非常详细)零基础入门到精通,收藏这一篇就够了_大模型入门

大模型的定义 大模型是指具有数千万甚至数亿参数的深度学习模型。近年来&#xff0c;随着计算机技术和大数据的快速发展&#xff0c;深度学习在各个领域取得了显著的成果&#xff0c;如自然语言处理&#xff0c;图片生成&#xff0c;工业数字化等。为了提高模型的性能&#xf…

游戏如何应对云手机刷量问题

云手机的实现原理是依托公有云和 ARM 虚拟化技术&#xff0c;为用户在云端提供一个安卓实例&#xff0c;用户可以将手机上的应用上传至云端&#xff0c;再通过视频流的方式&#xff0c;远程实时控制云手机。 市面上常见的几款云手机 原本需要手机提供的计算、存储等能力都改由…

在校三个月备考软考中项顺利拿证,经验分享

作为一名在校生&#xff0c;我在三个月的备考软考中项后成功拿到证书&#xff0c;对于软考中项的考试技巧有着丰富的经验。首先&#xff0c;我给你分享一些备考技巧&#xff1a; 1. 不要死记硬背&#xff01;最好是结合跟班学习和教材双管齐下。先过一遍所有知识点&#xff08…

如何查看Android设备的dpi

adb shell getprop ro.sf.lcd_density adb shell cat /system/build.prop > build_prop.txt shell cat system/build.prop 结果&#xff1a;参考&#xff1a; 如何查看Android设备的dpi_安卓 查看手机dpi-CSDN博客

【里程碑】轻空间SPIKE AIRDOME项目落地印尼雅加达

在经过半年的激烈角逐与严苛考量后&#xff0c;轻空间凭借其卓越的气承式球幕技术&#xff0c;成功赢得印尼最大城市建设商的青睐&#xff0c;正式签约 SPIKE AIRDOME 项目。该项目将落地印尼首都雅加达CBD&#xff0c;成为这一繁华商业中心的全新地标。轻空间技术负责人亲切地…

一些线上常用排查问题的命令

排查CPU过高时使用到的一些命令 top free df top命令 top 命令是一个动态的实时视图&#xff0c;显示系统的整体运行状况&#xff0c;包括 CPU 使用率、内存使用情况、进程信息等。 free 命令 free 命令用于显示系统中物理内存和交换内存的使用情况。 df 命令 df 命令用…

如何从 Nutanix 迁移至 SmartX 超融合?解读 4 类迁移方案和 2 例迁移实践

2022 年底&#xff0c;Nutanix&#xff08;路坦力&#xff09;正式宣布将中国市场交由合作伙伴&#xff08;联想&#xff09;主导销售&#xff0c;并于 2023 年 8 月完成全面转型。转型后&#xff0c;虽然中国用户依旧可以使用 Nutanix 产品&#xff0c;但在软件的续保和维保方…

基于flask+vue框架的传染病防控酒店信息系统zvt93(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;患者,服务人员,病房类型,病房信息,病房分配,需求箱,商品分类,商品信息,购买商品,分配反馈,健康上报,患者信息,患者分配 开题报告内容 基于flaskvue框架的传染病防控酒店信息系统开题报告 一、项目背景 在全球公共卫生事件频发的背景下…

鸿蒙应用生态构建的核心目标

保护开发者和用户利益的同时维护整体系统的安全性&#xff0c;对生态构建者是至关重要的。以开发者为中心&#xff0c;构建端到端应用安全能力&#xff0c;保护应用自身安全、运行时安全&#xff0c;保障开发者权益&#xff0c;是鸿蒙应用生态构建的核心目标。 应用生命周期主要…

汽车焊机数据通信:Profinet转Canopen网关的神奇连接

在汽车制造领域&#xff0c;汽车焊机的高效、稳定运行对于整车质量至关重要。而Profinet转Canopen网关在汽车焊机的数据通信中发挥着关键作用。 Profinet是一种广泛应用于工业自动化领域的通信协议&#xff0c;具有高速、实时、可靠等特点。Canopen则在汽车电子等领域有着广泛…

【Qt笔记】QTabWidget控件详解

目录 引言 一、基本功能 二、核心属性 2.1 标签页管理 2.2 标签位置 2.3 标签形状 2.4 标签可关闭性 2.5 标签可移动性 三、信号与槽 四、高级功能 4.1 动态添加和删除标签页 4.2 自定义标签页的关闭按钮行为 4.3 标签页的上下文菜单 五、样式设置 六、应用示例…

【Linux入门】基本指令(一)

目录 一.使用环境 二.快捷键 三. 登录与用户管理 1.ssh root[ip地址] 2.whoami 3.ls /home 4.adduser [用户名] 5.passwd [用户名] 四.目录文件操作 1.ls 2.pwd 3.cd 4.touch 5.mkdir 6.rm 7.cp 五.命令手册 一.使用环境 云服务器&#xff1a;市面上有很多&am…