ansible 常用用例

news2024/11/27 0:21:50

目录

一、说明

二、创建 ansible 环境

三、实验操作     

四、install_ansible.sh 脚本内容


一、说明

        该文档是日常经常使用的模板,通过该例子让更多的初学者了解ansible 剧本的写法,很多情况,可以按照该模版来套用即可。

        读者不需要下载或者复制全部内容,直接下载或者复制 install_ansible.sh 脚本文件即可,该脚本文件会自动安装ansible ,以及创建 ansible roles 结构和测试文件。

        自动生成用安装redis、nginx以及httpd为例子的 roles 文件。

  1.  通过 role 角色来执行不同的类型的剧本
  2. 剧本引用了自定义变量以及内置的 setup模块变量
  3. 剧本使用注册变量,输出部分debug返回值
  4. 使用COPY和template模块,更好比较两者区别
  5. 剧本 task 文件导入其他task文件的方法
  6. 剧本使用 触发器效果的功能 notify 和 handler
  7. 主机清单变量和剧本变量两种写法的区别
  8. template模块 injia2 常用语句写法,条件控制等

        ansible日常开发和使用,还会用到 when 判断等指令,可能还是根据不同的 task 使用不同的tags 标签,方便后续根据 tags 执行指定部分的内容 ,读者还可以 自行 比较 vars 和 vars_files的区别、以及多种include 的区别:如:include 、include_tasks 、include_roles等;要巧用模块帮助命令:ansible-doc

注意:执行 install_ansible.sh 脚本后,一定要记得修改当前目录生成的 hosts 文件内容:将ansible主机清单以及账号信息等内容修改成你自己的信息

二、创建 ansible 环境

        1.下载或者复制 install_ansible.sh 脚本 到你的测试环境,并执行改脚本:

# 执行 install_ansible.sh 脚本;
# 确保你的服务器要能正常访问公网

chmod a+x install_ansible.sh 
sh install_ansible.sh

         2. 执行完成 install_ansible.sh 后,你不但已完成安装 ansible,还完成了 测试环境构建;执行脚本后生成的环境结构如下:

         3. 执行完成 install_ansible.sh 脚本后,根据提示即可完成测试

三、实验操作     

  1、执行 测试命令

ansible-playbook -i hosts test.yaml -C
[root@192 test]# ansible-playbook -i hosts test.yaml -C

PLAY [first palybook] *******************************************************************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************************************************************************
ok: [192.168.51.140]

TASK [test : install apps] **************************************************************************************************************************************************
[DEPRECATION WARNING]: Invoking "yum" only once while using a loop via squash_actions is deprecated. Instead of using a loop to supply multiple items and specifying `name: 
"{{ item }}"`, please use `name: ['nginx', 'redis', 'httpd']` and remove the loop. This feature will be removed in version 2.11. Deprecation warnings can be disabled by 
setting deprecation_warnings=False in ansible.cfg.
changed: [192.168.51.140] => (item=[u'nginx', u'redis', u'httpd'])

TASK [test : copy nginx.conf] ***********************************************************************************************************************************************
changed: [192.168.51.140]

TASK [test : template for redis.conf] ***************************************************************************************************************************************
changed: [192.168.51.140]

TASK [test : template for httpd.con] ****************************************************************************************************************************************
changed: [192.168.51.140]

TASK [test : start apps] ****************************************************************************************************************************************************
changed: [192.168.51.140] => (item=nginx)
changed: [192.168.51.140] => (item=redis)
changed: [192.168.51.140] => (item=httpd)

TASK [test : 引用定义在主机清单的变量] **************************************************************************************************************************************************
ok: [192.168.51.140] => {
    "msg": "mytesthost.com"
}

TASK [test : 引用定义在vars目录文件的变量] **********************************************************************************************************************************************
ok: [192.168.51.140] => {
    "msg": "myhost1.com.cn"
}

TASK [test_ext 引用其他的tasks文件] ************************************************************************************************************************************************
included: /root/test/roles/test/tasks/mytest.yaml for 192.168.51.140

TASK [test : ping server for ext tasks] *************************************************************************************************************************************
ok: [192.168.51.140]

TASK [test : ping stdout ext task] ******************************************************************************************************************************************
ok: [192.168.51.140] => {
    "out": {
        "changed": false, 
        "failed": false, 
        "ping": "pong"
    }
}

RUNNING HANDLER [test : restart nginx] **************************************************************************************************************************************
changed: [192.168.51.140]

RUNNING HANDLER [test : restart redis] **************************************************************************************************************************************
changed: [192.168.51.140]

RUNNING HANDLER [test : restart httpd] **************************************************************************************************************************************
changed: [192.168.51.140]

PLAY RECAP ******************************************************************************************************************************************************************
192.168.51.140             : ok=14   changed=8    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[root@192 test]# 

    2. 执行 剧本

ansible-playbook -i hosts test.yaml
[root@192 test]# 
[root@192 test]# ansible-playbook -i hosts test.yaml 

PLAY [first palybook] *******************************************************************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************************************************************************
ok: [192.168.51.140]

TASK [test : install apps] **************************************************************************************************************************************************
[DEPRECATION WARNING]: Invoking "yum" only once while using a loop via squash_actions is deprecated. Instead of using a loop to supply multiple items and specifying `name: 
"{{ item }}"`, please use `name: ['nginx', 'redis', 'httpd']` and remove the loop. This feature will be removed in version 2.11. Deprecation warnings can be disabled by 
setting deprecation_warnings=False in ansible.cfg.
changed: [192.168.51.140] => (item=[u'nginx', u'redis', u'httpd'])

TASK [test : copy nginx.conf] ***********************************************************************************************************************************************
changed: [192.168.51.140]

TASK [test : template for redis.conf] ***************************************************************************************************************************************
changed: [192.168.51.140]

TASK [test : template for httpd.con] ****************************************************************************************************************************************
changed: [192.168.51.140]

TASK [test : start apps] ****************************************************************************************************************************************************
changed: [192.168.51.140] => (item=nginx)
changed: [192.168.51.140] => (item=redis)
changed: [192.168.51.140] => (item=httpd)

TASK [test : 引用定义在主机清单的变量] **************************************************************************************************************************************************
ok: [192.168.51.140] => {
    "msg": "mytesthost.com"
}

TASK [test : 引用定义在vars目录文件的变量] **********************************************************************************************************************************************
ok: [192.168.51.140] => {
    "msg": "myhost1.com.cn"
}

TASK [test_ext 引用其他的tasks文件] ************************************************************************************************************************************************
included: /root/test/roles/test/tasks/mytest.yaml for 192.168.51.140

TASK [test : ping server for ext tasks] *************************************************************************************************************************************
ok: [192.168.51.140]

TASK [test : ping stdout ext task] ******************************************************************************************************************************************
ok: [192.168.51.140] => {
    "out": {
        "changed": false, 
        "failed": false, 
        "ping": "pong"
    }
}

RUNNING HANDLER [test : restart nginx] **************************************************************************************************************************************
changed: [192.168.51.140]

RUNNING HANDLER [test : restart redis] **************************************************************************************************************************************
changed: [192.168.51.140]

RUNNING HANDLER [test : restart httpd] **************************************************************************************************************************************
changed: [192.168.51.140]

PLAY RECAP ******************************************************************************************************************************************************************
192.168.51.140             : ok=14   changed=8    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[root@192 test]#

  3. 查看剧本安装结果

  4. 修改redis端口测试 handler 触发器效果,redis端口变量是 redis_port

ansible-playbook -i hosts test.yaml -e redis_port=6380
[root@192 test]# 
[root@192 test]# ansible-playbook -i hosts test.yaml -e redis_port=6380

PLAY [first palybook] *******************************************************************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************************************************************************
ok: [192.168.51.140]

TASK [test : install apps] **************************************************************************************************************************************************
[DEPRECATION WARNING]: Invoking "yum" only once while using a loop via squash_actions is deprecated. Instead of using a loop to supply multiple items and specifying `name: 
"{{ item }}"`, please use `name: ['nginx', 'redis', 'httpd']` and remove the loop. This feature will be removed in version 2.11. Deprecation warnings can be disabled by 
setting deprecation_warnings=False in ansible.cfg.
ok: [192.168.51.140] => (item=[u'nginx', u'redis', u'httpd'])

TASK [test : copy nginx.conf] ***********************************************************************************************************************************************
ok: [192.168.51.140]

TASK [test : template for redis.conf] ***************************************************************************************************************************************
changed: [192.168.51.140]

TASK [test : template for httpd.con] ****************************************************************************************************************************************
ok: [192.168.51.140]

TASK [test : start apps] ****************************************************************************************************************************************************
ok: [192.168.51.140] => (item=nginx)
ok: [192.168.51.140] => (item=redis)
ok: [192.168.51.140] => (item=httpd)

TASK [test : 引用定义在主机清单的变量] **************************************************************************************************************************************************
ok: [192.168.51.140] => {
    "msg": "mytesthost.com"
}

TASK [test : 引用定义在vars目录文件的变量] **********************************************************************************************************************************************
ok: [192.168.51.140] => {
    "msg": "myhost1.com.cn"
}

TASK [test_ext 引用其他的tasks文件] ************************************************************************************************************************************************
included: /root/test/roles/test/tasks/mytest.yaml for 192.168.51.140

TASK [test : ping server for ext tasks] *************************************************************************************************************************************
ok: [192.168.51.140]

TASK [test : ping stdout ext task] ******************************************************************************************************************************************
ok: [192.168.51.140] => {
    "out": {
        "changed": false, 
        "failed": false, 
        "ping": "pong"
    }
}

RUNNING HANDLER [test : restart redis] **************************************************************************************************************************************
changed: [192.168.51.140]

PLAY RECAP ******************************************************************************************************************************************************************
192.168.51.140             : ok=12   changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[root@192 test]#

  5. 修改redis端口后的结果

四、install_ansible.sh 脚本内容

# 一键 安装 ansible; 一键构建 ansible 测试剧本环境

# cat install_ansible.sh

#!/bin/bash
# 一键安装 ansible
# creator: @tudou
# date 2023-05-14
# Centos 7

####################################################################################################
#
# 使用说明: 直接复制或者下载 install_ansible.sh 脚本即可,其他目录和内容会自动形成,无需额外理会
#
####################################################################################################

# 关闭 selinux 要不然更改 应用默认端口后,可能会启动失败,影响测试
setenforce 0
sed -i '/^SELINUX/c SELINUX=disabled' /etc/selinux/config

# 1、安装 ansible
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/repo/centos7_base.repo
mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup
wget -O /etc/yum.repos.d/epel.repo http://mirrors.cloud.tencent.com/repo/epel-7.repo
yum clean all
yum makecache

yum install -y ansible tree
 
echo "=============================================================================================="
echo "已成功安装 ansible"
echo ""
echo "=============================================================================================="
echo "开始构建 ansible 测试剧本环境..."
echo "=============================================================================================="

# 2、此项为环境说明项,执行 install_ansible.sh 脚本,会自动生成相关的 roles 目录和文件;
# 使用说明: 直接复制或者 install_ansible.sh 脚本即可,其他目录和内容会自动形成,无需额外理会
# ansible 测试剧本目录结构为:
# [root@192 test]# tree 
# .
# ├── hosts
# ├── install_ansible.sh
# ├── roles
# │   └── test
# │       ├── defaults
# │       ├── files
# │       │   └── nginx.conf
# │       ├── handlers
# │       │   └── main.yaml
# │       ├── meta
# │       ├── tasks
# │       │   ├── main.yaml
# │       │   └── mytest.yaml
# │       ├── templates
# │       │   ├── httpd.conf.j2
# │       │   └── redis.conf.j2
# │       └── vars
# │           └── main.yaml
# └── test.yaml
# 
# 9 directories, 10 files
# ansible 测试剧本目录结构为

# 3、创建 hosts 清单文件,你也可以直接修改ansible默认的 hosts 文件: /etc/ansible/hosts
cat > hosts << EOF
[test01]
# 相关主机账号密码请修改为你自己的真实信息,多个主机写多行
192.168.51.140 ansible_ssh_user=root ansible_ssh_port=22 ansible_ssh_pass="root"

[test01:vars]
# 主机清单组公共变量写法
myhost=mytesthost.com

[test02]
# 调用多个组的写法
[mytest:children]
test01
test02

EOF

# 4、创建剧本入口文件
cat > test.yaml << EOF
---
- hosts: test01
  name: first palybook
  gather_facts: true
  roles:
  - { role: test }

#- hosts: test02
#  name: secend palybook
#  roles:
#  - { role: test02 }
#  - { role: ext/test03 }

EOF

# 5、创建 roles 相关目录,空的目录,可有可无,但为了指导初学者,我列出了平常使用的目录
mkdir -p roles/test/{defaults,files,handlers,meta,tasks,templates,vars}

# defaults 目录默认变量等信息; meta 可以写依赖相关的信息

# 6、创建 task 文件; 我这里以 main.yaml 和 mytest.yaml 为例

# 6-1、在 tasks 目录,创建 task 文件: main.yaml
cat > roles/test/tasks/main.yaml << EOF
---
  - name: install apps
    yum: name={{ item }} state=present
    with_items:
     - nginx
     - redis
     - httpd

  - name: copy nginx.conf
    copy: src=files/nginx.conf dest=/etc/nginx/nginx.conf
    notify: restart nginx
  
  - name: template for redis.conf
    template: src=templates/redis.conf.j2 dest=/etc/redis.conf
    notify: restart redis

  - name: template for httpd.con
    template: src=templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
    notify: restart httpd

  - name: start apps
    service: name={{ item }}  state=started
    with_items:
     - nginx
     - redis
     - httpd

  # 应用自定义变量
  - name: "引用定义在主机清单的变量"
    debug: msg={{ myhost }}
  - name: "引用定义在vars目录文件的变量"
    debug: msg={{ myhost1 }}

  # 其他的tasks
  - name: test_ext 引用其他的tasks文件
    #include: mytest.yaml
    include_tasks: mytest.yaml
    #import_tasks: mytest.yaml

EOF


# 6-2、在 tasks 目录,创建 task 文件: mytest.yaml ; mytest.yaml 的作用是用来举例说明 task 文件引用更多的task的方法
cat > roles/test/tasks/mytest.yaml << EOF
---
- name: ping server for ext tasks
  ping:
  register: out
- name: ping stdout ext task
  debug: var=out

- name: cat hosts info for ext tasks
  shell: cat /etc/hosts
  register: out
- name: "hosts info ext task"
  debug: var=out.stdout_lines

EOF

# 7、在 handler 目录,创建处理文件: main.yaml; handler目录下的文件需要 notify 触发器触发才会执行
cat > roles/test/handlers/main.yaml << EOF
---
- name: restart nginx
  systemd: name=nginx state=restarted

- name: restart redis
  systemd: name=redis state=restarted

- name: restart httpd
  systemd: name=httpd state=restarted

EOF

# 8、在 vars 目录,创建自定义的变量文件: main.yaml
cat > roles/test/vars/main.yaml << EOF
myhost1: myhost1.com.cn
httpd_host: httpd.com.cn
redis_port: 6379
# redis_port: 6380

EOF

# 9、在files 目录,创建 nginx.conf配置文件
cat > roles/test/files/nginx.conf << EOF
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '\$remote_addr - \$remote_user [\$time_local] "\$request" '
                      '\$status \$body_bytes_sent "\$http_referer" '
                      '"\$http_user_agent" "\$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    include /etc/nginx/conf.d/*.conf;

    server {
        listen       [::]:80;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        error_page 404 /404.html;
        location = /404.html {
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }
}

EOF

# 10、在 templastes 目录,创建模版文件
# 10-1、在 templastes 目录,创建模版文件:redis.conf.j2
cat > roles/test/templates/redis.conf.j2 << EOF
# 绑定主机IP,多网卡多IP可能会失败
bind {{ ansible_default_ipv4.address }}

#port 6379

{% if redis_port is  defined %}
port {{ redis_port }}
{% endif %}

daemonize no

EOF

# 10-2、在 templastes 目录,创建模版文件:httpd.conf.j2
cat > roles/test/templates/httpd.conf.j2 << EOF
ServerRoot "/etc/httpd"
Listen 8080
Include conf.modules.d/*.conf
User apache
Group apache
ServerAdmin root@localhost
#ServerName www.example.com:80

#####################################################
# 添加用于 ansible template 部分
{% if httpd_host is defined %}
ServerName {{ httpd_host }}
{% endif %}
# 添加用于 ansible template 部分
#####################################################

<Directory />
    AllowOverride none
    Require all denied
</Directory>
DocumentRoot "/var/www/html"
<Directory "/var/www">
    AllowOverride None
    # Allow open access:
    Require all granted
</Directory>
<Directory "/var/www/html">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>
<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>
<Files ".ht*">
    Require all denied
</Files>
ErrorLog "logs/error_log"
LogLevel warn
<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
    <IfModule logio_module>
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>
    CustomLog "logs/access_log" combined
</IfModule>
<IfModule alias_module>
    ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
</IfModule>
<Directory "/var/www/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>
<IfModule mime_module>
    TypesConfig /etc/mime.types
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
    AddType text/html .shtml
    AddOutputFilter INCLUDES .shtml
</IfModule>
AddDefaultCharset UTF-8
<IfModule mime_magic_module>
    MIMEMagicFile conf/magic
</IfModule>
EnableSendfile on
IncludeOptional conf.d/*.conf

EOF


# 11、成功构建 ansible 测试剧本环境

echo "已成功构建 ansible 测试剧本环境..."
echo "=============================================================================================="
echo "请在当前目录执行以下命令测试: "
echo ""
echo "测试命令: ansible-playbook -i hosts test.yaml -C"
echo ""
echo "执行命令: ansible-playbook -i hosts test.yaml"
echo ""
echo "=============================================================================================="

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

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

相关文章

6.深入理解Mysql事务隔离级别与锁机制

MySQL性能调优 1. 概述2. 事务及其ACID属性2.1并发事务带来的问题2.2 事务隔离级别 3. 锁详解3.1 锁分类3.1.1 表锁3.1.2 行锁3.1.3 间隙锁(Gap Lock)3.1.4 临键锁(Next-key Locks)3.1.5 行锁分析3.1.6 查看INFORMATION_SCHEMA系统库锁相关数据表3.1.7 死锁3.1.8 锁优化建议 4.…

iOS - postgetAFNetworking

GET和POST HTTP定义了与服务器交互的不同方法&#xff0c;最基本的方法有4种&#xff0c;分别是GET&#xff0c;POST&#xff0c;PUT&#xff0c;DELETE。URL全称是资源描述符&#xff0c;我们可以这样认为&#xff1a;一个URL地址&#xff0c;它用于描述一个网络上的资源&…

OpenGL高级-实例化

知识点 假如你有一个有许多模型的场景&#xff0c;而这些模型的顶点数据都一样&#xff0c;只是进行了不同的世界空间的变换。想象一下&#xff0c;有一个场景中充满了草叶&#xff1a;每根草都是几个三角形组成的。你可能需要绘制很多的草叶&#xff0c;最终一次渲染循环中就肯…

每日一练 | 华为认证真题练习Day45

1、应用数据经过数据链路层处理后一定携带了MAC地址。 A. 对 B. 错 2、某网络工程师在输入命令行时提示如下信息&#xff1a; Error:Unrecognized command found at’^’position. 对于该提示信息说法正确的是&#xff1f; A. 输入命令不完整 B. 没有查找到关键字 C. 输…

LeetCode 1054 距离相等的条形码

LeetCode 1054 距离相等的条形码 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/distant-barcodes 博主Github&#xff1a;https://github.com/GDUT-Rp/LeetCode 题目&#xff1a; 在一个仓库里&#xff0c;有一排条…

二叉树总结

文章目录 树需要掌握的基本概念二叉树基本特点满二叉树性质 完全二叉树性质 二叉搜索树&#xff08;二叉排序树&#xff09;Binary Search Tree(BST)性质 平衡二叉树性质 红黑树五大性质 B树 二叉树的存储方式链式存储顺序存储 二叉树的遍历 树需要掌握的基本概念 1、节点、根…

Python+Requests+Pytest+YAML+Allure实现接口自动化

本项目实现接口自动化的技术选型&#xff1a;PythonRequestsPytestYAMLAllure &#xff0c;主要是针对之前开发的一个接口项目来进行学习&#xff0c;通过 PythonRequests 来发送和处理HTTP协议的请求接口&#xff0c;使用 Pytest 作为测试执行器&#xff0c;使用 YAML 来管理测…

如何成为Apache项目贡献者

要成为Apache Foundation的贡献者&#xff0c;您需要遵循以下步骤&#xff1a; 加入Apache社区&#xff1a;您需要加入Apache社区并成为一个活跃的成员。您可以通过订阅邮件列表、参加会议、参加社区活动等方式来加入社区。选择一个项目&#xff1a;您需要选择一个您感兴趣的A…

libevent高并发网络编程 - 03_bufferevent filter过滤器

文章目录 1. bufferevent_filter过滤器简介2. evbuffer2.1 evbuffer常用API2.2 evbuffer和bufferevent的区别 3. bufferevent filter过滤器常用API3.1 bufferevent_filter_new() 4 bufferevent filter 过滤器例子 1. bufferevent_filter过滤器简介 bufferevent filter是libeve…

探索LeetCode【0010】正则表达式匹配(未懂)

目录 0.1 题目0.2 补充示例1. 参考B站视频2. 官方答案的评论-可用3. chatGPT的思路和解法-可用 0.1 题目 题目链接&#xff1a;【0010】正则表达式匹配 给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 . 和 * 的正则表达式匹配。 . 匹配任意单个字符* 匹…

UG NX二次开发(C++)-建模-删除对象

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1、前言2、在UG NX中创建一些测试对象3、查询这些对象的继承关系3、基于C创建的方法3.1 头文件3.2 声明删除对象的方法3.3 定义删除对象的方法3.4 填写调用代码 4、…

Vue电商项目--开发Search模块

Search模块的静态组件 search模块开发&#xff1f; 1.先静态页面静态组件拆分出来 2.发请求&#xff08;API&#xff09; 3.vuex&#xff08;三连环&#xff09; 4.组件获取仓库数据&#xff0c;动态展示数据 拆分静态组件&#xff0c;之前搞过。现在就不搞了&#xff0c;…

STL之迭代器

文章目录 什么是迭代器&#xff1f;迭代器的作用&#xff1a;为什么要使用迭代器&#xff1f;vector容器中迭代器应该怎么使用迭代器失效插入元素后失效删除元素后失效 什么是迭代器&#xff1f; 迭代器是一种检查容器内元素并且遍历容器内匀速的数据类型 迭代器的作用&#…

微服务之服务容错

Informal Essay By English Share a sentence that I think is very reasonable, as long as you can know the underlying logic of anything, you can hold it without fear 参考书籍&#xff1a; “凤凰架构” 引言 在 Martin Fowler 与 James Lewis合写的文章《Micros…

从立项到发布仅三个月,开源技术问答社区 Answer 是如何诞生的?

在祁宁家里&#xff0c;有一套完整的赛车模拟器&#xff0c;他甚至还请人到国外代购了最新的 VR 设备。作为沉浸式赛车游戏发烧友&#xff0c;除了享受速度与激情带来的愉悦感&#xff0c;祁宁在玩的过程中更多的是思考如何将技术能力进行产品化的问题。 Answer.dev 就是将技术…

【计网】第四章 网络层

文章目录 4.1-1 网络层概述4.1-2 SDN 的基本概念一、路由器功能&#xff1a;转发&#xff0c;路由选择二、数据平面三、控制平面介绍&#xff08;1&#xff09;传统方法/每路由器法&#xff08;2&#xff09;SDN 方法&#xff1a;Software-Defined Networking 四、控制平面中的…

一文掌握DTC

1. 前言 从单片机STM32开始转到汽车电子已经有一年时间了&#xff0c;到如今为止&#xff0c;很少写文章了&#xff0c;原因很简单&#xff0c;肚子里面没有墨水&#xff0c;就不给大家献丑了。而现在写在这篇文章&#xff0c;属实也是有了一定的了解。所以还不是很了解这个方…

从一到无穷大 #9 Firestore:开发者友好的Serverless NoSQL Database

引言 简单浏览了下ICDE 2023 industry-and-applications-track 部分的文章&#xff0c;其中我感兴趣的文章有三篇&#xff0c;分别为&#xff1a; Accelerating Cloud-Native Databases with Distributed PMem StoresBackward-Sort for Time Series in Apache IoTDBFirestore…

10年测开经验面试35K公司后,吐血整理出高频面试题和答案!

一&#xff1a;前言 在当今竞争激烈的职场环境中&#xff0c;拥有丰富的测试开发经验已成为众多企业青睐的重要条件之一。而在面试过程中&#xff0c;高频面试题更是能够考察应聘者的实际能力和知识水平。本文作者具备10年的测试开发经验&#xff0c;并通过面试获得了35K公司的…

VMWare16和Ubuntu20.04虚拟机安装记录

VMWare网盘链接&#xff1a;https://pan.baidu.com/s/1zZvtwnH9N47_k3pAy2dZCg 提取码&#xff1a;1234 Ubuntu下载网址&#xff1a;Ubuntu Release 推荐20.04&#xff0c;网上的教程也比较多 列举两个我参考的&#xff0c;其实都大差不差。 保姆级教程|VMware安装Ubuntu20…