运维自动化之Ansible

news2025/7/21 10:31:45

一:Ansible的概述

  1. ansible的简介

Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具。它用Python写成,类似于saltstack和Puppet,但是有一个不同和优点是我们不需要在节点中安装任何客户端。它使用SSH来和节点进行通信。Ansible基于 Python paramiko 开发,分布式,无需客户端,轻量级,配置语法使用 YMAL 及 Jinja2模板语言,更强的远程命令执行操作。

  1. ansible的特点

  1. 部署简单,没有客户端,只需在主控端部署Ansible环境,被控端无需做任何操作;

  1. 模块化:调用特定的模块,完成特定任务

  1. 默认使用SSH协议对设备进行管理;

  1. 主从集中化管理;

  1. 通过Playbooks来定制强大的配置、状态管理;

  1. 具有幂等性:一个操作在一个主机上执行一遍和执行N遍的结果是一样的;

  1. ansible的工作机制

上图可以看到的内容的详细说明:

4. ansible执行过程

1. 加载自己的配置文件 默认/etc/ansible/ansible.cfg 2. 加载自己对应的模块文件,如command 3. 通过ansible将模块或命令生成对应的临时py文件, 并将该文件传输至远程服务器的对应执行用户 $HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件 4. 给文件+x执行 5. 执行并返回结果 6. 删除临时py文件,sleep 0退出 执行状态: 绿色:执行成功并且不需要做改变的操作 黄色:执行成功并且对目标主机做变更 红色:执行失败

二:Ansible的安装

  1. 设置Epel仓库

yum -y install epel-release
  1. yum安装(推荐)

yum -y install ansible

三:Ansible的使用

  1. 基于端口,用户,密码定义主机清单

格式:

ansible基于ssh连接-i (inventory)参数后指定的远程主机时,也可以写端口,用户,密码。

如:

ansible_ssh_port: 指定ssh端口 ansible_ssh_user:指定 ssh 用户 ansible_ssh_pass: 指定 ssh 用户登录是认证密码(明文密码不安全) ansible_sudo_pass: 指明 sudo 时候的密码。

[root@ansible ~]# cat /etc/ansible/hosts | tail -10
#192.168.150.140
192.168.150.146 ansible_ssh_port=22  ansible_ssh_user=root ansible_ssh_pass=201104
192.168.150.147 ansible_ssh_port=22  ansible_ssh_user=root ansible_ssh_pass=201104

1.1 测试主机的连通性

[root@ansible ~]# ansible nginx-servers -m ping
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
192.168.150.146 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
192.168.150.147 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

2. Ansible常见模块

2.1 command模块

command:在远程主机执行命令,默认模块,可忽略-m选项。此命令不支持 $VARNAME < > | ; & 等 需要用shell模块实现。

[root@ansible ~]# ansible nginx-servers -m command -a 'ls -l /root/'
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
192.168.150.146 | CHANGED | rc=0 >>
总用量 2216
-rw-------. 1 root root    1612 9月  19 00:23 anaconda-ks.cfg
-rw-r--r--  1 root root     237 10月 12 18:39 iptables
drwxr-xr-x  6 1000 1000    4096 2月  11 11:49 mwget_0.1.0.orig
-rw-r--r--  1 root root 2252800 8月  18 2011 mwget_0.1.0.orig.tar
-rw-------. 1 root root    1577 9月  19 00:23 original-ks.cfg
-rw-r--r--  1 root root       0 2月  11 13:51 Python-3.9.0.tar.xz.mg!
192.168.150.147 | CHANGED | rc=0 >>
总用量 12
-rw-------. 1 root root 1612 9月  19 00:23 anaconda-ks.cfg
-rw-r--r--. 1 root root  194 9月  19 02:11 flask-web.py
-rw-------. 1 root root 1577 9月  19 00:23 original-ks.cfg
drwxr-xr-x  5 root root   74 2月  13 10:08 student

Shell命令是通过/bin/sh进行执行的,command命令没有shell的环境变量,因此不 支持特殊符号或变量的操作。

2.2 shell模块

Shell:和command相似,用shell执行命令 shell模块支持一些特殊符号,重定向符号、变量等的操作

[root@ansible ~]# ansible 192.168.150.147 -m shell -a "echo 'hello' > /root/hello.txt"                                                                                [WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
192.168.150.147 | CHANGED | rc=0 >>

[root@ansible ~]# ansible 192.168.150.147 -m shell -a "cat /root/hello.txt"
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
192.168.150.147 | CHANGED | rc=0 >>
hello

2.3 script模块

script:在远程机器执行本地脚本

# 执行本地的文件,管控机的文件

[root@ansible shnodes]# ansible 192.168.150.147 -m script -a "/shnodes/hostname.sh"
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
192.168.150.147 | CHANGED => {
    "changed": true,
    "rc": 0,
    "stderr": "Shared connection to 192.168.150.147 closed.\r\n",
    "stderr_lines": [
        "Shared connection to 192.168.150.147 closed."
    ],
    "stdout": "web02\r\n",
    "stdout_lines": [
        "web02"
    ]
}

# 判断被控 机上的文件是否存在,如果不存在,就执行,如果存在,就跳过

[root@ansible shnodes]# ansible 192.168.150.147 -m script -a "creates=/shnodes/hostname.sh /shnodes/hostname.sh"
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
192.168.150.147 | CHANGED => {
    "changed": true,
    "rc": 0,
    "stderr": "Shared connection to 192.168.150.147 closed.\r\n",
    "stderr_lines": [
        "Shared connection to 192.168.150.147 closed."
    ],
    "stdout": "web02\r\n",
    "stdout_lines": [
        "web02"
    ]
}
[root@ansible shnodes]# ansible 192.168.150.147 -m script -a "creates=/shnodes/hostname.sh /shnodes/hostname.sh"
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
192.168.150.147 | SKIPPED

2.4 copy模块

copy:从ansible服务器主控端复制文件到远程文件

src:源文件(指定拷贝文件的本地路径)

dest:指定目标路径

mode:设置权限

backup:备份源文件

content:代替src( 指定本机文件内容,生成目标主机文件 )

[root@ansible shnodes]# ansible 192.168.150.147 -m copy -a "src=/shnodes/check_info.sh dest=/root/check_info.sh"
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
192.168.150.147 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "checksum": "a01d6403071c03324e337d13c78bbf100b51121e",
    "dest": "/root/check_info.sh",
    "gid": 0,
    "group": "root",
    "md5sum": "243a07e14a34c96b67b3f08f72525103",
    "mode": "0644",
    "owner": "root",
    "size": 32,
    "src": "/root/.ansible/tmp/ansible-tmp-1678169016.12-1894-210559415440731/source",
    "state": "file",
    "uid": 0
}
[root@ansible shnodes]# ansible 192.168.150.147 -a 'ls -l /root/'
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
192.168.150.147 | CHANGED | rc=0 >>
总用量 20
-rw-------. 1 root root 1612 9月  19 00:23 anaconda-ks.cfg
-rw-r--r--  1 root root   32 3月   7 14:03 check_info.sh
-rw-r--r--. 1 root root  194 9月  19 02:11 flask-web.py
-rw-r--r--  1 root root    6 3月   7 13:40 hello.txt
-rw-------. 1 root root 1577 9月  19 00:23 original-ks.cfg
drwxr-xr-x  5 root root   74 2月  13 10:08 student
[root@ansible shnodes]# ansible 192.168.150.147 -m copy -a "content='hello' dest=/root/test.txt"
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
192.168.150.147 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "checksum": "aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d",
    "dest": "/root/test.txt",
    "gid": 0,
    "group": "root",
    "md5sum": "5d41402abc4b2a76b9719d911017c592",
    "mode": "0644",
    "owner": "root",
    "size": 5,
    "src": "/root/.ansible/tmp/ansible-tmp-1678169174.79-2000-266122844071777/source",
    "state": "file",
    "uid": 0
}
[root@ansible shnodes]# ansible 192.168.150.147 -a 'cat /root/test.txt'
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
192.168.150.147 | CHANGED | rc=0 >>
hello

2.5 fetch模块

fetch:从远程主机提取文件至主控端,copy相反,目前不支持目录,可以先打包,再 提取文件

[root@ansible shnodes]# ansible 192.168.150.147 -m fetch -a "src=/root/hello.txt dest=/root/hello.txt"
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
192.168.150.147 | CHANGED => {
    "changed": true,
    "checksum": "f572d396fae9206628714fb2ce00f72e94f2258f",
    "dest": "/root/hello.txt/192.168.150.147/root/hello.txt",
    "md5sum": "b1946ac92492d2347c6235b4d2611184",
    "remote_checksum": "f572d396fae9206628714fb2ce00f72e94f2258f",
    "remote_md5sum": null
}
总用量 4
-rw-------. 1 root root 1568 9月  11 09:22 anaconda-ks.cfg
drwxr-xr-x  3 root root   29 3月   7 14:15 hello.txt

2.6 file模块

File:设置文件属性

path: 要管理的文件路径 (强制添加) recurse: 递归,文件夹要用递归 src: 创建硬链接,软链接时,指定源目标,配合'state=link' 'state=hard' 设置软链接, 硬链接

state: 状态 absent 缺席,删除

[root@ansible ~]# ansible 192.168.150.147 -m file -a "path=/root/file.txt state=touch"
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
192.168.150.147 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "dest": "/root/file.txt",
    "gid": 0,
    "group": "root",
    "mode": "0644",
    "owner": "root",
    "size": 0,
    "state": "file",
    "uid": 0
}
[root@ansible ~]# ansible 192.168.150.147 -a 'cat /root/file.txt'
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
192.168.150.147 | CHANGED | rc=0 >>

2.7 archive模块

Archive:打包压缩,将远程主机目录打包 path: 指定路径 dest: 指定目标文件 format: 指定打包格式 owner: 指定所属者 mode: 设置权限

[root@ansible ~]# ansible 192.168.150.147 -m archive -a 'path=/shnodes/ dest=/shnodes/shnodes.tar.bz2 '
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
192.168.150.147 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "archived": [
        "/shnodes/hostname.sh",
        "/shnodes/shnodes.tar.bz2"
    ],
    "arcroot": "/shnodes/",
    "changed": true,
    "dest": "/shnodes/shnodes.tar.bz2",
    "expanded_exclude_paths": [],
    "expanded_paths": [
        "/shnodes/"
    ],
    "gid": 0,
    "group": "root",
    "missing": [],
    "mode": "0644",
    "owner": "root",
    "size": 169,
    "state": "file",
    "uid": 0
}
[root@ansible ~]# ansible 192.168.150.147 -a 'ls -l /shnodes'
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
192.168.150.147 | CHANGED | rc=0 >>
总用量 8
-rw-r--r-- 1 root root  30 3月   7 13:49 hostname.sh
-rw-r--r-- 1 root root 169 3月   7 14:24 shnodes.tar.bz2

2.8 unarchive模块

unarchive:解包解压缩,有两种用法: 1、将ansible主机上的压缩包传到远程主机后解压缩至特定目录,设置copy=yes. 2、将远程主机上的某个压缩包解压缩到指定路径下,设置copy=no

[root@ansible ~]# ll
总用量 8
-rw-------. 1 root root 1568 9月  11 09:22 anaconda-ks.cfg
drwxr-xr-x  3 root root   29 3月   7 14:15 hello.txt
-rw-r--r--  1 root root  191 3月   7 14:30 hello.txt.tar
[root@ansible ~]# ansible 192.168.150.147 -m unarchive -a 'src=/root/hello.txt.tar dest=/shnodes/ '
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
192.168.150.147 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "dest": "/shnodes/",
    "extract_results": {
        "cmd": [
            "/usr/bin/gtar",
            "--extract",
            "-C",
            "/shnodes/",
            "-z",
            "-f",
            "/root/.ansible/tmp/ansible-tmp-1678170637.95-2424-226980750356851/source"
        ],
        "err": "",
        "out": "",
        "rc": 0
    },
    "gid": 0,
    "group": "root",
    "handler": "TgzArchive",
    "mode": "0755",
    "owner": "root",
    "size": 65,
    "src": "/root/.ansible/tmp/ansible-tmp-1678170637.95-2424-226980750356851/source",
    "state": "directory",
    "uid": 0
}
[root@ansible ~]# ansible 192.168.150.147 -a 'ls -l /shnodes'
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
192.168.150.147 | CHANGED | rc=0 >>
总用量 8
drwxr-xr-x 3 root root  29 3月   7 14:15 hello.txt
-rw-r--r-- 1 root root  30 3月   7 13:49 hostname.sh
-rw-r--r-- 1 root root 169 3月   7 14:24 shnodes.tar.bz2

2.9 cron模块

cron模块主要用于添加、删除、更新操作系统的crontab任务计划

[root@ansible ~]# ansible 192.168.150.147 -m cron -a "minute=*/1 job='/usr/bin/date > /root/date.txt' name=date"
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
192.168.150.147 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": true,
    "envs": [],
    "jobs": [
        "date"
    ]
}
[root@ansible ~]# ansible 192.168.150.147 -a 'crontab -l'
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
192.168.150.147 | CHANGED | rc=0 >>
#Ansible: date
*/1 * * * * /usr/bin/date > /root/date.txt

2.10 yum模块

Yum:管理包

#enablerepo启用某个源

#name:要进行操作的软件包的名字,也可以传递一个url或者一个本地的rpm包的路 径

State定义软件包状态

-present:安装(installed也可以)

-absent:删除(removed)

-latest:安装最新的

ansible 192.168.150.147 -m yum -a 'list=httpd' 查看程序列表
ansible 192.168.150.147 -m yum -a 'name=httpd state=present' 安装
ansible 192.168.150.147 -m yum -a 'name=httpd state=absent' 删除

3.11 systemd模块

systemd模块用于控制远程主机的systemd服务,说白了,就是Linux下的systemd 命令。需要远程主机支持systemd。

ansible 192.168.150.147 -m systemd -a "name=httpd state=started" #启动服务 ansible 192.168.150.147 -m systemd -a "name=httpd state=stopped" #停止服务 ansible 192.168.150.147 -m systemd -a "name=httpd state=restarted" #重启服务 ansible 192.168.150.147 -m systemd -a "name=httpd state=reloaded"#重新加载

3. Ansible之playbook

3.1 playbook介绍

playbook 剧本是由一个或多个"play”组成的列表 play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定义好 的角色。Task实际是调用ansible的一个module,将多个play组织在一个playbook 中,即可以让它们联合起来,按事先编排的机制执行预定义的动作。用户通过 ansible命令直接调用yml语言写好的playbook,playbook由多条play组成,每条play 都有一个任务(task)相对应的操作,然后调用模块modules,应用在主机清单上,通过 ssh远程连接,从而控制远程主机或者网络设备。

Playbook 文件是采用YAML语言编写的

3.2 playbook核心元素

  1. Hosts 执行的远程主机列表

  1. Tasks 任务集

  1. Variables 内置变量或自定义变量在playbook中调用

  1. Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件

  1. Handlers 和 notify 结合使用,由特定条件触发的操作,满足条件方才执行,否 则不执行

  1. tags 标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible具 有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实 没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过 tags跳过此些代码片断

3.3 yml样例

[root@ansible ansible]# cat check_nginx.yml
---
- hosts: test
  remote_user: root

  tasks:

   # - name: copy nginx file
  #    copy: src=/etc/yum.repos.d/nginx.repo dest=/etc/yum.repos.d

 #   - name: yum clean all
 #     shell: yum clean all

#    - name: yum makecache
#      shell: yum makecache

#    - name: install nginx
#      yum: name=nginx state=present

 #   - name: copy file
  #    copy: src=/etc/nginx/conf.d/default.conf dest=/etc/nginx/conf.d/default.conf
   #   notify: restart nginx
    #  tags: config

#    - name: start nginx
#      systemd: name=nginx state=started

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

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

相关文章

【C++】Clang-Format:代码自动格式化(看这一篇就够了)

文章目录Clang-format格式化C代码1.引言&安装1.1引言1.2 安装2. 配置字解释2.1 language 编程语言2.2 BaseOnStyle 基础风格2.3 AccessModifierOffset 访问性修饰符偏移2.4 AlignAfterOpenBracket 开括号后的对齐2.5 AlignArrayOfStructures 对齐结构体数组2.6 AlignConsec…

中电金信Gien享汇・大数据专题|金融行业数据架构及模型演进

本期嘉宾 陈子刚 中电金信商业分析事业部华南区总经理 毕业于复旦大学&#xff0c;硕士研究生&#xff1b;拥有16年以上金融行业商业智能领域从业经验&#xff1b;曾就职于中国工商银行、Teradata、东亚银行&#xff0c;服务于平安银行、广发银行、招商银行、广东农信、招商…

IT项目经理的自我修养手册(续)

上一节从工作职责和如何提升IT项目经理的个人能力讲述了作为一个职业项目经理的自我修养&#xff0c; 入口地址&#xff1a; IT项目经理的自我修养手册 本节将会从计划、组织、领导、控制这四个方面&#xff0c;系统的介绍作为职业项目经理的工作职责和工作范围。 一、计划 …

Springboot怎么实现WebSocket通信(一)

文章示例环境配置信息jdk版本:1.8开发工具&#xff1a;Intellij iDEA 2020.1springboot:2.3.9.RELEASE什么是WebSocket?WebSocket&#xff0c;是HTML5下一种新的协议&#xff0c;支持web浏览器和服务器端之间双向全双工通信 &#xff0c;基于TCP协议实现。WebSocket主要特性1、…

console使用方法介绍

console是在写前端Javascript时经常会使用到&#xff0c;我平时使用最多的是console.log&#xff0c;相比大多数人也是如此吧&#xff01; 下面一起来看一下强大的console吧&#xff01; 01函数&#xff08;属性&#xff09; 包含如下函数 / 属性&#xff1a;memory、assert、c…

2023年最新最全 VSCode 插件推荐

Visual Studio Code 是由微软开发的一款免费的、针对于编写现代Web和云应用的跨平台源代码编辑器。它包含了一个丰富的插件市场&#xff0c;提供了很多实用的插件。下面就来分享 2023 年前端必备的 VS Code 插件&#xff01; 前端框架 ES7 React/Redux/React-Native snippets …

洗地机哪个牌子比较好?家用洗地机推荐

洗地机是可以做到扫地的同时把地也拖了&#xff0c;可以做到高效清洁&#xff0c;减轻家务负担。还具有杀菌功能&#xff0c;不用担心拖完地之后地面还有细菌滋生啦&#xff0c;洗地机可以做到即洗即干&#xff0c;无需等待拖完地之后还潮湿不能走路&#xff0c;尤其对于木地板…

简述下 React 的事件代理机制?

React 并不会把所有的处理函数直接绑定在真实的节点上。而是把所有的事件绑定到结构的最外层&#xff0c;使用一个统一的事件监听器&#xff0c;这个事件监听器上维持了一个映射来保存所有组件内部的事件监听和处理函数。 当组件挂载或卸载时&#xff0c;只是在这个统一的事件…

LIN资料整理(一):LIN入门简介

目录 一、LIN是什么 1、LIN简介 2、LIN的适用场景 3、LIN协议版本 4、LIN的主从机节点、主从机任务与LIN总线特点 一、LIN是什么 1、LIN简介 LIN 是Local Interconnect Network 的缩写&#xff0c;是基于UART/SCI(Universal Asynchronous Receiver-Transmitter / Serial…

2023级社科院与杜兰大学金融管理硕士还有少量名额,期待与你共谱人生新篇章

我们都是平凡人&#xff0c;过着平凡的生活&#xff0c;但若能有所热爱有所坚持&#xff0c;便会发出自己的光芒。就像我们在社科院与杜兰大学金融管理硕士项目读研&#xff0c;通过更加系统的学习&#xff0c;不仅丰富了我们的知识&#xff0c;还提升了我们的思维&#xff0c;…

NB-IOT宣传这么多年,这次总算用好了吧

一、方案概述随着实体经济快速发展&#xff0c;石化、港口、货场、工地等区域规模日益扩大&#xff0c;厂区面积广阔、环境复杂、作业人员和车辆众多&#xff0c;如无法实时掌握工作人员状态及外来人员位置、外来车辆情况等问题&#xff0c;将存在非常大的安全隐患。今天小编介…

ChatGPT在工业领域的用法

在工业数字化时代&#xff0c;我们需要怎么样的ChatGPT&#xff1f; 近日&#xff0c;ChatGPT热度高居不下&#xff0c;强大的人机交互能力令人咋舌&#xff0c;在国内更是掀起一股讨论热潮。一时间&#xff0c;这场由ChatGPT引起的科技飓风&#xff0c;使得全球最顶尖科技力量…

notepad++学习小技巧

不要小瞧了notepadd 这个可是我们的cv好帮手。。。 实战1背景&#xff0c;我找一个同事要表结构 结果他给我了一个xml。顿时一懵&#xff0c;我也不知道为啥好像是从前端扣下来的。 建表我只需要 columnName, displayName当作是comment&#xff0c; dataTypeNamecolumnType借鉴…

【计算机视觉】Visual grounding系列

文章目录一、任务简介二、Visual grounding常用数据集与评估指标2.1 常用数据集2.2 评估指标三、Visual grounding主流做法一、任务简介 Visual grounding涉及计算机视觉和自然语言处理两个模态。 简要来说&#xff0c;输入是图片&#xff08;image&#xff09;和对应的物体描…

市场营销书籍推荐:《经理人参阅:市场营销》

要学好市场营销有什么好方法&#xff1f;答案是看书&#xff01;比起碎片化地去阅读一些文章或看一些相关视频&#xff0c;读书来得更实在些。倘若能静下心来好好读上一本系统性的市场营销书籍&#xff0c;学好营销管理将不会再是一件难事。然而&#xff0c;问题的关键是&#…

大模型分布式系统

背景&#xff1a;模型越来越大&#xff0c;训练复杂度越来越高&#xff0c;需要训练的时间也是越来越长。那么我们该如何在现有的硬件基础上对模型做训练呢。模型规模的扩大&#xff0c;对硬件&#xff08;算力、内存&#xff09;的发展提出要求。然而&#xff0c;因为 内存墙 …

2023年襄阳中级工程师职称评审通知出来了哟

襄阳市职称改革工作领导小组办公室关于做好2022年度襄阳市非公企业工程系列中级任职资格评审工作的通知 各县&#xff08;市、区&#xff09;人力资源和社会保障局&#xff08;职改办&#xff09;&#xff1a; 根据市职改办《关于做好2022年度全市职称评审工作的通知》&#x…

IT女神节(致敬中国IT界永远的女神严蔚敏-数据结构)

我们都知道程序数据结构算法。相信很多人都学过严蔚敏的数据结构的课程。作为一个码农&#xff0c;在这不管是3.7女神节&#xff0c;还是3.8妇女节。我觉得都有必要向这些教育界的老前辈致敬。今天我就梳理梳理&#xff0c;最经典的数据结构教材。 严蔚敏介绍&#xff08;来自…

HTML学习笔记入门到精通day01

零、 复习昨日 见代码 一、二阶段介绍 第一阶段 java基本语法 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aY95CV7t-1678153713499)(D:\前锋学习笔记\笔记\image-20230307094126248.png)] 二、HTML 2.1 HTML概念 ​ 网页&#xff0c;是网站中的一…

MS python学习(7)

Managing Keys - dotenv Managing keys usage of .env module 项目地址&#xff1a;https://github.com/theskumar/python-dotenv Reads the key,value pair from .env and adds them to environment variable. 将key明文&#xff08;hard code&#xff09;形式写在script里…