Ansible PlayBook实践案例
一、PlayBook介绍
1.什么是playbook
playbook 顾名思义,即剧本,现实生活中演员按照剧本表演,在 ansible 中,由被控计算机表演,进行安装,部署应用,提供对外的服务等,以及组织计算机处理各种各样的事情。
playbook 是 ansible 用于配置,部署,和管理节点的剧本通过 playbook 的详细描述,执行其中的-些列 tasks,可以让远端的主机达到预期的状态。playbook 就像 ansible 控制器给被控节点列出的一系列 to-do-list,而且被控节点必须要完成。
2.Ansible playbook 使用场景
执行一些简单的任务,使用 ad-hoc 命令可以方便的解决问题,但是有时一个设施过于复杂,需要大量的操作的时候,执行的 ad-hoc 命令是不合适的,这时候最好使用 playbook。
就像执行 shell 命令与写 shell脚本一样,也可以理解为批处理任务,不过 playbook 有自己的语法格式使用 playbook 可以方便的重复使用这些代码,可以移植到不同的机器上面,像函数一样,最大化的利用代码。在你使用 Ansible 的过程中,你也会发现,你所处理的大部分操作都是编写 playbook。可以把常见的应用都编写为 playbook,之后管理服务器会变得很简单。
二、Playbook的组成
Playbook 是由一个或多个”play”组成的列表,主要功能在于通过将 task 定义好的角色归并为组进行统一管理,也就是通过 Task 调用 Ansible 的模板将多个“play”组织在一个 Playbook 中运行。
Playbook 本身由以下几部分组成:
- Tasks:任务,即调用模块完成的某操作;
- Variables:变量;
- Templates:模板;
- Handlers:处理器,某条件满足时,触发执行的操作; ['hendla(r)]
- Roles:角色。
下面是一个Playbook的简单实例:
[root@ansible-node1 ~]# vim a.yaml---
- hosts: webremote_user: roottasks:- name: create useruser:name: zhangsanpassword: "{{ 'aptech' | password_hash('sha512') }}"state: presenttags:- ccc...
(1)执行playbook,进行语法检查
[root@ansible-node1 ~]# ansible-playbook --syntax-check a.yaml playbook: a.yaml
(2)预测试
[root@ansible-node1 ~]# ansible-playbook -C a.yaml PLAY [web] *************************************************************************TASK [Gathering Facts] *************************************************************
ok: [192.168.10.102]TASK [create user] *****************************************************************
changed: [192.168.10.102]PLAY RECAP *************************************************************************
192.168.10.102 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
(3)列出主机
[root@ansible-node1 ~]# ansible-playbook --list-hosts a.yaml playbook: a.yamlplay #1 (web): web TAGS: []pattern: [u'web']hosts (1):192.168.10.102
(4)列出任务
[root@ansible-node1 ~]# ansible-playbook --list-tasks a.yaml playbook: a.yamlplay #1 (web): web TAGS: []tasks:create user TAGS: [ccc]
(5)列出标签
[root@ansible-node1 ~]# ansible-playbook --list-tags a.yaml playbook: a.yamlplay #1 (web): web TAGS: []TASK TAGS: [ccc]
(6)执行任务
[root@ansible-node1 ~]# ansible-playbook a.yaml PLAY [web] *************************************************************************TASK [Gathering Facts] *************************************************************
ok: [192.168.10.102]TASK [create user] *****************************************************************
changed: [192.168.10.102]PLAY RECAP *************************************************************************
192.168.10.102 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
1.Hosts 和Users 介绍
Playbook 的设计目的是为了让某个或某些主机以某个用户身份去执行完成相应的任务。其中用于指定要执行指定任务的主机用 hosts 定义,可以是一个也可以是由冒号分隔的多个主机组;用于指定被管理主机上执行任务的用户用 remote user 来定义,如下面示例中所示。
- hosts: webremote_user: zhangsan
remote user 也可定义指定用户通过 sudo 的方法在被管理主机上运行指令,甚至可以在使用sudo 时用 sudo user 指定 sudo 切换的用户。
[root@ansible-node1 ~]# vim b.yaml---
- hosts: webremote_user: zhangsantasks:- name: test connectionping:...
[root@ansible-node1 ~]# ansible-playbook -C b.yaml PLAY [web] *************************************************************************TASK [Gathering Facts] *************************************************************
ok: [192.168.10.102]TASK [create user] *****************************************************************
changed: [192.168.10.102]PLAY RECAP *************************************************************************
192.168.10.102 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@ansible-node1 ~]# ssh-copy-id zhangsan@192.168.10.102
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
zhangsan@192.168.10.102's password: Number of key(s) added: 1Now try logging into the machine, with: "ssh 'zhangsan@192.168.10.102'"
and check to make sure that only the key(s) you wanted were added.
[root@ansible-node1 ~]# ansible-playbook b.yaml PLAY [web] *************************************************************************TASK [Gathering Facts] *************************************************************
ok: [192.168.10.102]TASK [test connection] *************************************************************
ok: [192.168.10.102]PLAY RECAP *************************************************************************
192.168.10.102 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
2.任务列表和 action 介绍
“Play”的主体是任务列表(Tasks list)。任务列表中的任务按照次序逐个在 hosts 中指定的所有主机上执行,在顺序执行这些任务时,如果发生错误会将所有已执行任务回滚。因此,需要在更正Playbook 中的错误后重新执行这些任务。
Task 的任务是按照指定的参数去执行模块。每个 task 使用 name 输出 Playbook 的运行结果,一般输出内容为描述该任务执行的步骤。如果没有提供将输出 action 的运行结果。
定义 task 的格式可以用”action:module options”或“module:options”都可,其中后者可以实现向后兼容。如果 action 的内容过多,可在行首使用空白字符进行换行。
[root@ansible-node1 ~]# vim a.yaml ---
- hosts: webremote_user: roottasks:- name: create useruser:name: zhangsanpassword: "{{ 'aptech' | password_hash('sha512') }}"state: presenttags:- ccc- hosts: dbremote_user: roottasks:- name: copy file to webcopy: src=/etc/passwd dest=/opttags:- ddd...
[root@ansible-node1 ~]# ansible-playbook -C a.yaml PLAY [web] *************************************************************************TASK [Gathering Facts] *************************************************************
ok: [192.168.10.102]TASK [create user] *****************************************************************
changed: [192.168.10.102]PLAY [db] **************************************************************************TASK [Gathering Facts] *************************************************************
ok: [192.168.10.103]TASK [copy file to web] ************************************************************
changed: [192.168.10.103]PLAY RECAP *************************************************************************
192.168.10.102 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.10.103 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@ansible-node1 ~]# ansible-playbook a.yaml PLAY [web] *************************************************************************TASK [Gathering Facts] *************************************************************
ok: [192.168.10.102]TASK [create user] *****************************************************************
changed: [192.168.10.102]PLAY [db] **************************************************************************TASK [Gathering Facts] *************************************************************
ok: [192.168.10.103]TASK [copy file to web] ************************************************************
changed: [192.168.10.103]PLAY RECAP *************************************************************************
192.168.10.102 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.10.103 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
如果多次去执行修改的 Playbook 时,涉及到一些没有变化的代码,可以使用 tages 让用户选择跳过没有变化代码,只运行 Playbook中发生变化的部分代码。可以在Playbook中为某个或某些任务定义“标签”,在执行此Playbook 时通过ansible-playbook 命令的--tags 选项能实现仅运行指定的 tasks 而非所有的 tasks。
3.Handlers 介绍
Handlers 用于当关注的资源发生变化时所采取的操作。在 notify 中列出的操作便称为 handler,也就是 notify 中需要调用 handler 中定义的操作。 而 notify 这个动作用于在每个“play”的最后被触发,仅在所有的变化发生完成后一次性地执行指定操作。
示例:当拷贝模板文件为/etc/foo.conf 文件时,重新启动 memcached 和 apache 服务,如下所示。
简单示例如下所示。
(1)安装apache
[root@ansible-node1 ~]# mkdir conf
[root@ansible-node1 ~]# yum -y install httpd
[root@ansible-node1 ~]# cp /etc/httpd/conf/httpd.conf conf
[root@ansible-node1 ~]# vim conf/httpd.conf
Listen 8080//修改端口号
[root@ansible-node1 ~]# vim a.yaml - hosts: webremote_user: roottasks:- name: install httpd packageyum: name=httpd state=latest- name: install configuration file or httpdcopy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf- name: start httpd serviceservice: enabled=true name=httpd state=started
[root@ansible-node1 ~]# ansible-playbook a.yaml PLAY [web] *************************************************************************TASK [Gathering Facts] *************************************************************
ok: [192.168.10.102]TASK [install httpd package] *******************************************************
changed: [192.168.10.102]TASK [install configuration file or httpd] *****************************************
changed: [192.168.10.102]TASK [start httpd service] *********************************************************
changed: [192.168.10.102]PLAY RECAP *************************************************************************
192.168.10.102 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
(2)登录被管理主机 ansible-node2 进行查看执行结果。
[root@ansible-node2 ~]# rpm -qa httpd
httpd-2.4.6-99.el7.centos.1.x86_64
[root@ansible-node2 ~]# grep "Listen" /etc/httpd/conf/httpd.conf | grep -v "#"
Listen 8080
[root@ansible-node2 ~]# systemctl status httpd
(3)设置handlers
如果配置文件有改动,如:Apache 端口号改变,则需要定义 notify 和 handlers,关执行操作。
[root@ansible-node1 ~]# vim conf/httpd.conf
Listen 808
[root@ansible-node1 ~]# vim b.yaml ---
- hosts: webremote_user: roottasks:- name: change portcopy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.confnotify:- restart httpdhandlers:- name: restart httpdservice: name=httpd state=restarted...
[root@ansible-node1 ~]# ansible-playbook b.yaml PLAY [web] *************************************************************************TASK [Gathering Facts] *************************************************************
ok: [192.168.10.102]TASK [change port] *****************************************************************
ok: [192.168.10.102]PLAY RECAP *************************************************************************
192.168.10.102 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
注意:
node2 上要关闭 selinux,否则,同步配置会出错,
(4)登录被管理主机 ansible-node2 进行查看。
[root@ansible-node2 ~]# netstat -anpt | grep httpd
4.Templates 介绍
Jinia 是基于 Pvthon 的模板引擎。Template 类似 Jinia 的另一个重要组件,可以看作是一个编译过的模板文件。用来产生目标文本,传递 Python 的变量给模板去替换模板中的标记。
(1)创建模板文件
[root@ansible-node1 ~]# mkdir templates
[root@ansible-node1 ~]# cp conf/httpd.conf templates/httpd.conf.j2
[root@ansible-node1 ~]# vim templates/httpd.conf.j2
Listen {{ http_port }}
ServerName {{ ansible_fqdn }}
(2)为远程主机添加变量
[root@ansible-node1 ~]# vim /etc/ansible/hosts
[web]
192.168.10.102 http_port=8888
[db]
192.168.10.103
(3)编写playbook文件
[root@ansible-node1 ~]# vim apache.yaml- hosts: webremote_user: rootvars:- package: httpd- service: httpdtasks:- name: install httpdyum: name={{ package }} state=latest- name: install configuration file for httpdtemplate: src=/root/templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.confnotify:- restart httpd- name: start httpd serviceservice: enabled=true name={{ service }} state=startedhandlers:- name: restart httpdservice: name={{ service }} state=restarted
[root@ansible-node1 ~]# ansible-playbook apache.yaml PLAY [web] *************************************************************************TASK [Gathering Facts] *************************************************************
ok: [192.168.10.102]TASK [install httpd] ***************************************************************
ok: [192.168.10.102]TASK [install configuration file for httpd] ****************************************
changed: [192.168.10.102]TASK [start httpd service] *********************************************************
changed: [192.168.10.102]RUNNING HANDLER [restart httpd] ****************************************************
changed: [192.168.10.102]PLAY RECAP *************************************************************************
192.168.10.102 : ok=5 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
(4)登录被管理主机 ansible-node2,执行查看命令
[root@ansible-node2 ~]# grep -i listen /etc/httpd/conf/httpd.conf | grep -v "#"
Listen 8888
[root@ansible-node2 ~]# grep -i servername /etc/httpd/conf/httpd.conf | grep -v "#"
ServerName ansible-node2
三、Roles 介绍
1.什么是 Roles
Ansible 为了层次化、结构化地组织 Playbook,使用了角色(roles),可以根据层次结构自动装载变量文件、tasks 以及 handlers 等。只需要在 Playbook 中使用 include 指令便可使用 roles。简单来讲, roles 就是分别将变量、文件、任务、模块及处理器设置于单独的目录中,便捷地使用它们。
2.案例--利用 Roles 部署 mariadb
(1)被管理主机配置 yum 源
(2)配置数据库角色
[root@ansible-node1 ~]# cd /etc/ansible/
[root@ansible-node1 ansible]# ls
ansible.cfg hosts roles
[root@ansible-node1 ansible]# cd roles/
[root@ansible-node1 roles]# ls
[root@ansible-node1 roles]# mkdir mariadb
[root@ansible-node1 roles]# ls
mariadb
[root@ansible-node1 roles]# cd mariadb/
[root@ansible-node1 mariadb]# mkdir files
[root@ansible-node1 mariadb]# mkdir tasks
[root@ansible-node1 mariadb]# mkdir handlers
(3)编写主文件
[root@ansible-node1 tasks]# vim main.yaml ---
- name: install mariadbyum: name=mariadb-server state=present
- name:install MySQL-pythonyum: name=MySQL-python state=present
- name: bak config fileshell: "[ -e /etc/my.cnf ] && mv /etc/my.cnf /etc/my.cnf.bak"
- name: copy new config filecopy: src=my.cnf dest=/etc/my.cnf
- name: restart mariadbshell: systemctl restart mariadb
- name: init mysqlshell: mysql -u root -e "create database testdb;grant all on testdb.* to test@'%' identified by 'pwd123';flush privileges;"notify:- restart mariadb
...
(4)编写触发器文件
[root@ansible-node1 mariadb]# cd handlers/
[root@ansible-node1 handlers]# vim main.yaml---
- name: restart mariadbservice: name=mariadb state=restarted
...
(5)编写角色文件
[root@nodel tasks]# cd /etc/ansible/roles/mariadb/files
[root@node1 files]# ls
my.cnf ##将编辑好的 my.cnf 文件拷贝在此处
[root@ansible-node1 ansible]# vim mariadb.yaml---
- hosts: dbremote_user: rootroles:- mariadb
...
(6)测试角色文件
[root@ansible-node1 ansible]# ansible-playbook --syntax-check mariadb.yaml playbook: mariadb.yaml
(7)执行yml文件
[root@ansible-node1 ansible]# ansible-playbook mariadb.yaml PLAY [db] **************************************************************************TASK [Gathering Facts] *************************************************************
ok: [192.168.10.103]TASK [install mariadb] *************************************************************
changed: [192.168.10.103]TASK [mariadb : install MySQL-python] **********************************************
changed: [192.168.10.103]TASK [mariadb : bak config file] ***************************************************
changed: [192.168.10.103]TASK [mariadb : copy new config file] **********************************************
changed: [192.168.10.103]TASK [restart mariadb] *************************************************************
changed: [192.168.10.103]TASK [mariadb : init mysql] ********************************************************
changed: [192.168.10.103]RUNNING HANDLER [restart mariadb] **************************************************
changed: [192.168.10.103]PLAY RECAP *************************************************************************
192.168.10.103 : ok=8 changed=7 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
(8)检查远程服务器上数据库
查看数据库信息,看看有没有创建制定的数据库
四、利用 Ansible 管理数据库
1.用 ansible 查看数据库
[root@ansible-node1 ansible]# ansible db -m shell -a 'mysql -u root -e "show databases;"'
192.168.10.103 | CHANGED | rc=0 >>
Database
information_schema
mysql
performance_schema
test
testdb
2.创建账户并授权
[root@ansible-node1 ansible]# ansible db -m yum -a "name=MySQL-python state=present"
192.168.10.103 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "msg": "", "rc": 0, "results": ["MySQL-python-1.2.5-1.el7.x86_64 providing MySQL-python is already installed"]
}
[root@ansible-node1 ansible]# ansible db -m mysql_user -a "name==zhangsan password=pwd123 host=192.168.10.% priv=*.*:ALL"
[WARNING]: Module did not set no_log for update_password
192.168.10.103 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": true, "msg": "User added", "user": "=zhangsan"
}
[root@ansible-node1 ansible]# ansible db -m mysql_user -a "name=lisi password=pwd123 priv=*.*:ALL"
[WARNING]: Module did not set no_log for update_password
192.168.10.103 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": true, "msg": "User added", "user": "lisi"
}
注意:
张三能够远程登录,但李四不能
要想使用 mysql user 模块,需要在客户端安装MySQL-python,安装时注意大小写
3.为老用户授权(语法和创建用户并授权的语法是相同的)
[root@ansible-node1 ansible]# ansible db -m mysql_user -a "name=root password=pwd123 host=192.168.10.% priv=*.*:ALL"
[WARNING]: Module did not set no_log for update_password
192.168.10.103 | CHANGED => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": true, "msg": "User added", "user": "root"
}
相关文章:

Ansible PlayBook实践案例
一、PlayBook介绍 1.什么是playbook playbook 顾名思义,即剧本,现实生活中演员按照剧本表演,在 ansible 中,由被控计算机表演,进行安装,部署应用,提供对外的服务等,以及组织计算机处理各种各样…...

Tomcat后台弱口令部署war包
1.环境搭建 cd /vulhub/tomcat/tomcat8 docker-compose up -d 一键启动容器 2.访问靶场 点击Manager App tomcat8的默认用户名和密码都是tomcat进行登录 3.制作war包 先写一个js的一句话木马 然后压缩成zip压缩包 最后修改后缀名为war 4.在网站后台上传war文件 上传war文件…...

胤娲科技:DeepMind的FermiNet——带你穿越“薛定谔的早餐桌”
当AI遇上量子迷雾,FermiNet成了你的“量子导航仪” 想象一下,你早晨醒来,发现家里的厨房变成了薛定谔的实验室,你的咖啡杯和吐司同时处于“存在与不存在”的叠加态。 你伸手去拿,却不确定会不会摸到冰冷的空气或是热腾…...

迅为iTOP-STM32MP157开发板板载4G接口(选配)_千兆以太网_WIFI蓝牙模块_HDMI_CAN_RS485_LVDS接口等
迅为ITOP-STM32MP157是基于ST的STM32MP157芯片开发的一款开发平台。在STM32MP157开发平台上,我们也做了比较多的创新,其中重要的一点就是,iTOP-STM32MP157核心板电源管理采用ST全新配套研制的PMIC电源管理芯片STPMU1A。为整个系统的稳定运行提…...

Android Choreographer 监控应用 FPS
Choreographer 是 Android 提供的一个强大的工具类,用于协调动画、绘制和视图更新的时间。它的主要作用是协调应用的绘制过程,以确保流畅的用户体验。Choreographer 也可以帮助我们获取帧时间信息,从而为性能监测和优化提供重要的数据支持。 …...

关于 mybatis-plus-boot-starter 与 mybatis-spring-boot-starter 的错误
不是知道你是否 出现过这样的错误 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): 经过各种度娘,无非就是让你检查三种情况 情况一:mapper.xml没有按照传统的maven架构进行放置 情况二:mybatis的配置信…...

NLP 文本分类任务核心梳理
解决思路 分解为多个独立二分类任务将多标签分类转化为多分类问题更换 loss 直接由模型进行多标签分类 数据稀疏问题 标注更多数据,核心解决方案: 自己构造训练样本 数据增强,如使用 chatGPT 来构造数据更换模型 减少数据需求增加规则弥补…...

k8s中pod的创建过程和阶段状态
管理k8s集群 kubectl k8s中有两种用户 一种是登录的 一种是/sbin/nologin linux可以用密码登录,也可以用证书登录 k8s只能用证书登录 谁拿到这个证书,谁就可以管理集群 在k8s中,所有节点都被网络组件calico设置了路由和通信 所以pod的ip是可以…...

NSSCTF刷题篇1
js类型 [SWPUCTF 2022 新生赛]js_sign 这是一道js信息泄露的题目直接查看源码,有一个main.js文件点击之后,有一串数字和一段base64编码,解开base64编码得到这个编码为敲击码 解码在线网站:Tap Code - 许愿星 (wishingstarmoye.…...

[数据集][目标检测]棉花叶子病害检测数据集VOC+YOLO格式977张22类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):977 标注数量(xml文件个数):977 标注数量(txt文件个数):977 标注类别…...

产品经理面试整理-常见面试问题
以下是一些常见的产品经理面试问题及其解答思路。这些问题涵盖了产品管理的各个方面,包括战略、执行、数据分析、用户体验、跨团队合作等。在准备这些问题时,使用结构化的回答方式(如STAR法)能够帮助你更好地表达你的观点和经验。 1. 常见产品经理面试问题 1.1 你如何定义用…...

数据库(选择题)
基本概念 数据库(DB):长期存储在计算机内的、有组织的、可共享的数据集合。 数据库管理系统(DBMS):它是数据库的机构,是一个系统软件,负责数据库中的数据组织、数据操纵、数据维护…...

粒子向上持续瀑布动画效果(直接粘贴到记事本改html即可)
代码: 根据个人喜好修改即可 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>宽粒子向上…...

卷积神经网络(CNN):深度学习中的视觉奇迹
目录 一、什么是卷积神经网络? 二、CNN的核心组件 1. 卷积层(Convolutional Layer) 2. 激活函数(Activation Function) 3. 池化层(Pooling Layer) 4. 全连接层(Fully Connected…...

Vue:加载本地视频
目录 封装视频弹框调用视频组件 封装视频弹框 <template><el-dialog class"videoBox" :title"title" :visible.sync"visible" width"40%" :before-close"handleOnClose" :close-on-click-modal"false" …...

论文阅读:A Generalization of Transformer Networks to Graphs
论文阅读:A Generalization of Transformer Networks to Graphs 论文地址1 摘要2 贡献Graph TransformerOn Graph Sparsity(图稀疏)On Positional Encodings(位置编码)3 Graph Transformer Architecture(架…...

中国计量大学《2022年801+2022年819自动控制原理真题》 (完整版)
本文内容,全部选自自动化考研联盟的:《25届中国计量大学801819自控考研资料》的真题篇。后续会持续更新更多学校,更多年份的真题,记得关注哦~ 目录 2022年801真题 2022年819真题 Part1:2022年完整版真题 2022年801…...

创客匠人运营课堂|增强用户的参与度和忠诚度,这一个工具就能实现!
活动投票是通过营销活动来提升用户粘性及平台裂变效果的工具。可以让活动得到更好的传播,平台品牌得到更大的曝光。 使用场景 活动投票是一种互动营销手段,适用于各种活动场景,具有增强用户的参与度和忠诚度,提高活动的透明度和公…...

k8s 微服务 ingress-nginx 金丝雀发布
目录 一 什么是微服务 二 微服务的类型 三 ipvs模式 3.1 ipvs模式配置方式 四 微服务类型详解 4.1 clusterip 4.2 ClusterIP中的特殊模式headless 4.3 nodeport 4.4 loadbalancer 4.5 metalLB 4.6 externalname 五 Ingress-nginx 5.1 ingress-nginx功能 5.2 部署…...

Elasticsearch不停机切换(上云)方案
如何给飞行中的飞机换引擎? 背景 业务背景 略 技术背景 线下集群40个索引左右,总数据量不大,不到100G因为ES承担的业务鉴权业务,所以不能接受停机割接 还有就是ES中数据来自各个业务方,推送的时机不定,也没有完备的重推机制&…...

归纳一下Invoke,beginInvoke,还有InvokeRequire
1.在WinForms中的Invoke和BeginInvoke WinForms是一个单线程的UI框架。在多线程的环境下操作UI控件时。需要使用Invoke和BeginInvoke跨线程调起UI线程 这两的区别如下Invoke:同步调用,当前代码不在UI线程上执行时,会卡住当前线程࿰…...

Prompt最佳实践|指定输出的长度
在OpenAI的官方文档中已经提供了[Prompt Enginerring]的最佳实践,目的就是帮助用户更好的使用ChatGPT 编写优秀的提示词我一共总结了9个分类,本文讲解第6个分类:指定输出长度 提供更多的细节要求模型扮演角色使用分隔符指定任务步骤提供样例…...

离散制造 vs 流程制造:锚定精准制造未来,从装配线到化学反应,实时数据集成在制造业案例中的多维应用
使用 TapData,化繁为简,摆脱手动搭建、维护数据管道的诸多烦扰,轻量替代 OGG, Kettle 等同步工具,以及基于 Kafka 的 ETL 解决方案,「CDC 流处理 数据集成」组合拳,加速仓内数据流转,帮助企业…...

教你一招:在微信小程序中为用户上传的图片添加时间水印
在微信小程序开发过程中,我们常常需要在图片上添加水印,以保护版权或增加个性化元素。本文将为大家介绍如何在微信小程序中为图片添加时间水印,让你的小程序更具特色。 实现步骤: 1. 创建页面结构 在pages目录下创建一个名为upl…...

MySQL --基本查询(上)
文章目录 1.Create1.1单行数据全列插入1.2多行数据指定列插入1.3插入否则更新1.4替换 2.Retrieve2.1 select列2.1.1全列查询2.1.2指定列查询2.1.3查询字段为表达式2.1.4 为查询结果指定别名2.1.5结果去重 2.2where 条件2.2.1英语不及格的同学及英语成绩 ( < 60 )2.2.2语文成…...

mysql学习教程,从入门到精通,SQL 删除数据(DELETE 语句)(19)
1、SQL 删除数据(DELETE 语句) 在SQL中,TRUNCATE TABLE 语句用于删除表中的所有行,但不删除表本身。这个操作通常比使用 DELETE 语句删除所有行要快,因为它不记录每一行的删除操作到事务日志中,而是直接重…...

RoguelikeGenerator Pro - Procedural Level Generator
这是怎么一回事? Roguelike Generator Pro:简单与力量的结合。使用GameObjects、Tilemaps或自定义解决方案轻松制作3D/2D/2.5D关卡。享受内置功能,如碰撞处理、高度变化、基本控制器和子随机化器,所有这些都由Drunkard Wlak程序生成算法提供支持。 我该如何使用它? 简单:…...

反病毒技术和反病毒软件(网络安全小知识)
一、反病毒技术的难点 病毒变异与多态性:病毒开发者不断利用新技术和漏洞,创造出新的病毒变种和多态病毒。这些病毒能够自我变异,从而避开传统的基于特征码的检测方法,使得反病毒软件难以识别和清除。 未知病毒检测:在…...

位图与布隆过滤器
引例 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。 思路1:排序二分查找 思路2:哈希或红黑树 因为40亿个整数要占用16GB 102410241024Byte 约等于10亿Byte1GB 40亿*4Byte 16G…...

【题解】—— LeetCode一周小结38
🌟欢迎来到 我的博客 —— 探索技术的无限可能! 🌟博客的简介(文章目录) 【题解】—— 每日一道题目栏 上接:【题解】—— LeetCode一周小结37 16.公交站间的距离 题目链接:1184. 公交站间的距…...