(4)、借助于插件完成记录日志邮件等功能;
(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务
4. ansible的工作机制
Ansible 在管理节点将 Ansible 模块通过 SSH 协议推送到被管理端执行,执行完之后自动删除,可以使用 SVN 等来管理自定义模块及编排
由图可以看出Ansible的组成由一下模块组成:
Ansible: ansible的核心模块
Host Inventory:主机清单,也就是被管理的主机列表
Playbooks:ansible的剧本,可想象为将多个任务放置在一起,一块执行
Core Modules:ansible的核心模块
Custom Modules:自定义模块
Connection Plugins:连接插件,用于与被管控主机之间基于SSH建立连接关系
Plugins:其他插件,包括记录日志等
1. 设置EPEL仓库
Ansible仓库默认不在yum仓库中,因此我们需要使用下面的命令启用epel仓库
[root@itlaoxin162 ~]# yum install epel-release -y
2. 使用yum安装Ansible
[root@itlaoxin162 ~]# yum install ansible
3. 查看ansible的版本
[root@itlaoxin162 ~]# ansible --version
ansible 2.9.18
ansible的命令参数
anisble命令语法: ansible [-i 主机文件] [-f 批次] [组名] [-m 模块名称] [-a 模块参数]
| 参数 | 功能 |
| — | — |
| -v | 详细模式,如果执行成功,输出详细结果 |
| -i | 指定host文件路径,默认在/etc/ansible/hosts |
| -f,-forks=NUM | NUM默认是整数5,指定fork开启同步进程的个数 |
| -m | 指定使用的module名称,默认command模块 |
| -a | 指定模块的参数 |
| -k | 提示输入SSH密码,而不是使用基于ssh密钥认证 |
| -sudo | 指定使用sudo获取root权限 |
| -K | 提示输入sudo密码 |
| -u | 指定移动端的执行用户 |
| -C | 测试命令执行会改变什么内容,不会真正的去执行 |
ansible-doc 详细参数
[root@itlaoxin162 ~]# ansible-doc -l
列出所有模块列表
指定查看某个模块的参数
ansible-doc -s 模块名字
[root@itlaoxin162 ~]# ansible-doc -s onyx_ospf
- name: Manage OSPF protocol on Mellanox ONYX network devices
onyx_ospf:
interfaces: # List of interfaces and areas. Required if `state=present’.
ospf: # (required) OSPF instance number 1-65535
router_id: # OSPF router ID. Required if `state=present’.
state: # OSPF state.
[root@itlaoxin162 ~]# ansible-doc -s service
- name: Manage services
service:
arguments: # Additional arguments provided on the command line.
enabled: # Whether the service should start on boot. *At least one of
state and enabled are
required.*
name: # (required) Name of the service.
pattern: # If the service does not respond to the status command,
name a substring to look
for as would be found in
the output of the `ps’
command as a stand-in for a
status result. If the
string is found, the
service will be assumed to
be started.
runlevel: # For OpenRC init scripts (e.g. Gentoo) only. The runlevel
that this service belongs
to.
sleep: # If the service is being `restarted’ then sleep this many
seconds between the stop
1. 基于端口,用户,密码定义主机清单
格式:
ansible基于ssh连接-i (inventory)参数后指定的远程主机时,也可以写端口,用户,密码。
如:
ansible_ssh_port: 指定ssh端口 ansible_ssh_user:指定 ssh 用户 ansible_ssh_pass: 指定 ssh 用户登录是认证密码(明文密码不安全) ansible_sudo_pass: 指明 sudo 时候的密码
添加的内容如下:
[root@itlaoxin162 ~]# grep -v ^# /etc/ansible/hosts |grep -v ^$
[web-servers]
192.168.1.163 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=12345678
[root@itlaoxin16
直接添加到文件文末就可以;
测试主机的连通性
[root@itlaoxin162 ~]# ansible -i /etc/ansible/hosts web-servers -m ping
[WARNING]: Invalid characters were found in group names but not replaced, us
see details
192.168.1.163 | SUCCESS => {
“ansible_facts”: {
“discovered_interpreter_python”: “/usr/bin/python”
},
“changed”: false,
“ping”: “pong”
}
查看组下所有的IP:
[root@itlaoxin162 ~]# ansible all --list
[WARNING]: Invalid characters were found in group names but not replaced, use
-vvvv to see details
hosts (1):
192.168.1.163
[root@itlaoxin162 ~]#
2. 基于ssh密钥来访问定义主机清单
设置密钥
[root@itlaoxin162 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:CWdEZJbtzH4+ypeXe80jPnBr9UX/0yChZtX5DCjKckg root@itlaoxin162
The key’s randomart image is:
±–[RSA 2048]----+
| o*o |
| +. . |
| . o+ o . |
| E+ .= + + .|
| . oSo + . =.|
| o + =.o…=|
| o o oooo+*|
| . ==ooB|
| ooo++oo|
±—[SHA256]-----+
[root@itlaoxin162 ~]#
拷贝密钥并测试
[root@itlaoxin162 ~]# ssh-copy-id root@192.168.1.163
/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
root@192.168.1.163’s password:
Number of key(s) added: 1
Now try logging into the machine, with: “ssh ‘root@192.168.1.163’”
and check to make sure that only the key(s) you wanted were added.
登陆测试:
[root@itlaoxin162 ~]# ssh 192.168.1.163
Last login: Wed Apr 21 08:13:14 2021 from 192.168.1.162
71服务器也发送密钥
[root@itlaoxin162 ~]# ssh-copy-id root@192.168.1.71
修改hosts
vim /etc/ansible/hosts
查看配置文件中刚刚修改的内容
[root@itlaoxin162 ~]# grep -v “^#” /etc/ansible/hosts |grep -v “^$”
[web-servers]
192.168.1.163
192.168.1.71
ansible远程执行命令测试
ping模块 主要用来检测网络的连通性
command模块,执行shell命令
使用ping检查‘web-servers’或者ansible节点的连通性。
[root@itlaoxin162 ~]# ansible -i /etc/ansible/hosts ‘web-servers’ -m ping
[WARNING]: Invalid characters were found in group names but not replaced, use
-vvvv to see details
192.168.1.163 | SUCCESS => {
“ansible_facts”: {
“discovered_interpreter_python”: “/usr/bin/python”
},
“changed”: false,
“ping”: “pong”
}
192.168.1.71 | SUCCESS => {
“ansible_facts”: {
“discovered_interpreter_python”: “/usr/bin/python”
},
“changed”: false,
“ping”: “pong”
}
[root@itlaoxin162 ~]#
这条命令我们也可以不指定hosts,效果是一样的,我们只要指定组即可
[root@itlaoxin162 ~]# ansible ‘web-servers’ -m ping
[WARNING]: Invalid characters were found in group names but not replaced, use
-vvvv to see details
192.168.1.71 | SUCCESS => {
“ansible_facts”: {
“discovered_interpreter_python”: “/usr/bin/python”
},
“changed”: false,
“ping”: “pong”
}
192.168.1.163 | SUCCESS => {
“ansible_facts”: {
“discovered_interpreter_python”: “/usr/bin/python”
},
“changed”: false,
“ping”: “pong”
}
[root@itlaoxin162 ~]#
有时候我们为了方便阅读也把主机组名写在最后面
web-servers 这个组名,放在最后面
[root@itlaoxin162 ~]# ansible -m command -a “uptime” ‘web-servers’
[WARNING]: Invalid characters were found in group names but not replaced, use
-vvvv to see details
192.168.1.71 | CHANGED | rc=0 >>
08:37:28 up 11 min, 3 users, load average: 0.02, 0.15, 0.17
192.168.1.163 | CHANGED | rc=0 >>
08:37:28 up 1:58, 5 users, load average: 0.00, 0.01, 0.05
[root@itlaoxin162 ~]#
案例1: 检查节点的内存情况
[root@itlaoxin162 ~]# ansible -m command -a "free -m " ‘web-servers’
[WARNING]: Invalid characters were found in group names but not replaced, use
-vvvv to see details
192.168.1.71 | CHANGED | rc=0 >>
total used free shared buff/cache available
Mem: 3770 826 2283 15 661 2709
Swap: 2047 0 2047
192.168.1.163 | CHANGED | rc=0 >>
total used free shared buff/cache available
Mem: 3770 892 1076 38 1802 2588
Swap: 2047 0 2047
[root@itlaoxin162 ~]#
案例2:给节点增加用户
[root@itlaoxin162 ~]# ansible -m command -a “useradd itoldxin” ‘web-servers’
[WARNING]: Invalid characters were found in group names but not replaced, use
-vvvv to see details
192.168.1.71 | CHANGED | rc=0 >>
192.168.1.163 | CHANGED | rc=0 >>
[root@itlaoxin162 ~]#
查看是否创建用户成功
[root@itlaoxin162 ~]# ansible -m command -a “id itoldxin” ‘web-servers’
[WARNING]: Invalid characters were found in group names but not replaced, use
-vvvv to see details
192.168.1.71 | CHANGED | rc=0 >>
uid=1001(itoldxin) gid=1001(itoldxin) 组=1001(itoldxin)
192.168.1.163 | CHANGED | rc=0 >>
uid=1001(itoldxin) gid=1001(itoldxin) 组=1001(itoldxin)
[root@itlaoxin162 ~]#
1. ansible的常用模块
1) ansible的3个远程模块的区别
-
command : ansible的默认模块,不指定-m参数的时候,使用的就是command模块; 常见的命令都可以使用,但命令的执行不是通过shell来执行的,所以< > | and & z这些操作都不可以,不支持管道,没法批量执行命令
-
shell模块: 使用shell模块的时候默认是通过/bin/sh来执行的,所以在终端输入的各种命令都可以使用
-
scripts模块
使用scripts模块可以在本地写一个脚本,在远程服务器上执行
案例1:使用shell模块的案例
[root@itlaoxin162 ~]# ansible -i /etc/ansible/hosts web-servers -m shell -a “source ~/.bash_profile && df -h|head -n 1”
[WARNING]: Invalid characters were found in group names but not replaced, use
-vvvv to see details
192.168.1.71 | CHANGED | rc=0 >>
文件系统 容量 已用 可用 已用% 挂载点
192.168.1.163 | CHANGED | rc=0 >>
文件系统 容量 已用 可用 已用% 挂载点
[root@itlaoxin162 ~]#
注意: shell也可以把一个脚本copy到远程端然后再执行,但这样的话就需要调用两次ansible,所以script的出现就解决了这个问题;
案例2:使用script 模块
先写一个脚本:
[root@itlaoxin162 ~]# cat !$
cat /etc/ansible/test.sh
#!/bin/bash
date
hostname
echo “大家好,我是互联网老辛,脚本执行成功”
[root@itlaoxin162 ~]#
执行查看结果:
[root@itlaoxin162 ~]# ansible -i /etc/ansible/hosts web-servers -m script -a “/etc/ansible/test.sh”
[WARNING]: Invalid characters were found in group names but not replaced, use
-vvvv to see details
192.168.1.71 | CHANGED => {
“changed”: true,
“rc”: 0,
“stderr”: “Shared connection to 192.168.1.71 closed.\r\n”,
“stderr_lines”: [
“Shared connection to 192.168.1.71 closed.”
],
“stdout”: “2021年 04月 21日 星期三 08:59:33 CST\r\nk8s-master\r\n大家好,我是互联网老辛,脚本执行成功\r\n”,
“stdout_lines”: [
“2021年 04月 21日 星期三 08:59:33 CST”,
“k8s-master”,
“大家好,我是互联网老辛,脚本执行成功”
]
}
192.168.1.163 | CHANGED => {
“changed”: true,
“rc”: 0,
“stderr”: “Shared connection to 192.168.1.163 closed.\r\n”,
“stderr_lines”: [
“Shared connection to 192.168.1.163 closed.”
],
“stdout”: “2021年 04月 21日 星期三 08:59:33 CST\r\nitlaoxin-163\r\n大家好,我是互联网老辛,脚本执行成功\r\n”,
“stdout_lines”: [
“2021年 04月 21日 星期三 08:59:33 CST”,
“itlaoxin-163”,
“大家好,我是互联网老辛,脚本执行成功”
]
}
[root@itlaoxin162 ~]#
可以看到已经执行成功
2) copy模块的使用
copy模块:实现主控端向目标主机拷贝文件,类似scp功能
案例1: 把ansible主机的/etc/hosts 拷贝到主机组机器中的/root/下
[root@itlaoxin162 ~]# ansible -i /etc/ansible/hosts web-servers -m copy -a “src=/etc/hosts dest=/root owner=root group=root mode=0777”
[WARNING]: Invalid characters were found in group names but not replaced, use
-vvvv to see details
192.168.1.71 | CHANGED => {
“ansible_facts”: {
“discovered_interpreter_python”: “/usr/bin/python”
},
“changed”: true,
“checksum”: “700a03c76a37e929d448b3be6419f4289d9314e6”,
“dest”: “/root/hosts”,
“gid”: 0,
“group”: “root”,
“md5sum”: “138004edd9d16f2818e20842fc1f273d”,
“mode”: “0777”,
“owner”: “root”,
“secontext”: “system_u:object_r:admin_home_t:s0”,
“size”: 183,
“src”: “/root/.ansible/tmp/ansible-tmp-1618966980.44-20046-203314294949142/source”,
“state”: “file”,
“uid”: 0
}
192.168.1.163 | CHANGED => {
“ansible_facts”: {
“discovered_interpreter_python”: “/usr/bin/python”
},
“changed”: true,
“checksum”: “700a03c76a37e929d448b3be6419f4289d9314e6”,
“dest”: “/root/hosts”,
“gid”: 0,
“group”: “root”,
“md5sum”: “138004edd9d16f2818e20842fc1f273d”,
“mode”: “0777”,
“owner”: “root”,
“secontext”: “system_u:object_r:admin_home_t:s0”,
“size”: 183,
“src”: “/root/.ansible/tmp/ansible-tmp-1618966980.45-20045-254958397204815/source”,
“state”: “file”,
“uid”: 0
}
[root@itlaoxin162 ~]#
查看是否执行成功:
[root@itlaoxin162 ~]# ansible -m command -a “ls /root/hosts” ‘web-servers’
[WARNING]: Invalid characters were found in group names but not replaced, use
-vvvv to see details
192.168.1.71 | CHANGED | rc=0 >>
/root/hosts
192.168.1.163 | CHANGED | rc=0 >>
/root/hosts
[root@itlaoxin162 ~]#
注意: command 不能使用ll命令,但可以使用ls -l的命令
[root@itlaoxin162 ~]# ansible -m command -a “ls -l /root/hosts” ‘web-servers’
[WARNING]: Invalid characters were found in group names but not replaced, use
-vvvv to see details
192.168.1.71 | CHANGED | rc=0 >>
-rwxrwxrwx. 1 root root 183 4月 21 09:03 /root/hosts
192.168.1.163 | CHANGED | rc=0 >>
-rwxrwxrwx. 1 root root 183 4月 21 09:03 /root/hosts
[root@itlaoxin162 ~]#
3. file模块
案例5 给文件设置权限
[root@itlaoxin162 ~]# ansible -i /etc/ansible/hosts web-servers -m file -a “path=/root/hosts mode=0755”
[WARNING]: Invalid characters were found in group names but not replaced, use
-vvvv to see details
192.168.1.71 | CHANGED => {
“ansible_facts”: {
“discovered_interpreter_python”: “/usr/bin/python”
},
“changed”: true,
“gid”: 0,
“group”: “root”,
“mode”: “0755”,
“owner”: “root”,
“path”: “/root/hosts”,
“secontext”: “system_u:object_r:admin_home_t:s0”,
“size”: 183,
“state”: “file”,
“uid”: 0
}
192.168.1.163 | CHANGED => {
“ansible_facts”: {
“discovered_interpreter_python”: “/usr/bin/python”
},
“changed”: true,
“gid”: 0,
“group”: “root”,
“mode”: “0755”,
“owner”: “root”,
“path”: “/root/hosts”,
“secontext”: “system_u:object_r:admin_home_t:s0”,
“size”: 183,
“state”: “file”,
“uid”: 0
}
[root@itlaoxin162 ~]#
查看权限:
[root@itlaoxin162 ~]# ansible -m command -a “ls -l /root/hosts” ‘web-servers’
[WARNING]: Invalid characters were found in group names but not replaced, use
-vvvv to see details
192.168.1.71 | CHANGED | rc=0 >>
-rwxr-xr-x. 1 root root 183 4月 21 09:03 /root/hosts
192.168.1.163 | CHANGED | rc=0 >>
-rwxr-xr-x. 1 root root 183 4月 21 09:03 /root/hosts
[root@itlaoxin162 ~]#
4. stat模块获取远程文件信息
案例6 获取文件信息
[root@itlaoxin162 ~]# ansible -i /etc/ansible/hosts web-servers -m stat -a “path=/root/hosts”
[WARNING]: Invalid characters were found in group names but not replaced, use
-vvvv to see details
192.168.1.71 | SUCCESS => {
“ansible_facts”: {
“discovered_interpreter_python”: “/usr/bin/python”
},
“changed”: false,
“stat”: {
“atime”: 1618966982.400622,
“attr_flags”: “”,
“attributes”: [],
“block_size”: 4096,
“blocks”: 8,
“charset”: “us-ascii”,
“checksum”: “700a03c76a37e929d448b3be6419f4289d9314e6”,
“ctime”: 1618967480.9315438,
“dev”: 64768,
“device_type”: 0,
“executable”: true,
“exists”: true,
“gid”: 0,
“gr_name”: “root”,
“inode”: 78337,
“isblk”: false,
“ischr”: false,
“isdir”: false,
“isfifo”: false,
“isgid”: false,
“islnk”: false,
“isreg”: true,
“issock”: false,
“isuid”: false,
“mimetype”: “text/plain”,
“mode”: “0755”,
“mtime”: 1618966981.7806218,
“nlink”: 1,
“path”: “/root/hosts”,
“pw_name”: “root”,
“readable”: true,
“rgrp”: true,
“roth”: true,
“rusr”: true,
“size”: 183,
“uid”: 0,
“version”: “693378940”,
“wgrp”: false,
“woth”: false,
“writeable”: true,
“wusr”: true,
“xgrp”: true,
“xoth”: true,
“xusr”: true
}
}
192.168.1.163 | SUCCESS => {
“ansible_facts”: {
“discovered_interpreter_python”: “/usr/bin/python”
},
“changed”: false,
“stat”: {
“atime”: 1618966982.6472814,
“attr_flags”: “”,
“attributes”: [],
“block_size”: 4096,
“blocks”: 8,
“charset”: “us-ascii”,
“checksum”: “700a03c76a37e929d448b3be6419f4289d9314e6”,
“ctime”: 1618967481.0644567,
“dev”: 64768,
“device_type”: 0,
“executable”: true,
“exists”: true,
“gid”: 0,
“gr_name”: “root”,
“inode”: 33662547,
“isblk”: false,
“ischr”: false,
“isdir”: false,
“isfifo”: false,
“isgid”: false,
“islnk”: false,
“isreg”: true,
“issock”: false,
“isuid”: false,
“mimetype”: “text/plain”,
“mode”: “0755”,
“mtime”: 1618966982.176287,
“nlink”: 1,
“path”: “/root/hosts”,
“pw_name”: “root”,
“readable”: true,
“rgrp”: true,
“roth”: true,
“rusr”: true,
“size”: 183,
“uid”: 0,
“version”: “1103139934”,
“wgrp”: false,
“woth”: false,
“writeable”: true,
“wusr”: true,
“xgrp”: true,
“xoth”: true,
“xusr”: true
}
}
5. get_url 模块
实现远程主机下载指定的url地址,支持sha256sum文件校验
案例7
ansible -i /etc/ansible/hosts web-servers -m get_url -a “url=https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm dest=/tmp/ mode=0440 force=yes”
注:url=https://xxx 的等号=前后不能有空格
扩展:查看force=yes的作用
6. yum模块
yum模块linux平台软件包管理。
yum模块可以提供的status状态: latest ,present,installed #这三个代表安装;removed, absent #这两个是卸载
案例8 使用yum模块安装httpd
ansible -i /etc/ansible/hosts web-servers -m yum -a “name=httpd state=latest”
7. cron模块远程管理主机crontab配置
案例9: 增加每30分钟执行 echo"我是互联网老辛"
ansible -i /etc/ansible/hosts web-servers -m cron -a “name=‘list dir’ minute=’*/30’ job=‘echo 我是互联网老辛”’”
8. service 远程管理主机系统服务模块
service模块常用参数:
(1)、name参数:此参数用于指定需要操作的服务名称,比如 nginx,httpd。
(2)、state参数:此参数用于指定服务的状态
比如,我们想要启动远程主机中的httpd,则可以将 state 的值设置为 started;
如果想要停止远程主机中的服务,则可以将 state 的值设置为 stopped。
此参数的可用值有 started、stopped、restarted(重启)、reloaded。
enabled参数:此参数用于指定是否将服务设置为开机 启动项,设置为 yes 表示将对应服务设置为开机启动,设置为 no 表示不会开机启动。
注:想使用service模块启动服务,被启动的服务,必须可以使用service 命令启动或关闭
案例10 使用service模块重启httpd
[root@itlaoxin162 ~]# ansible -i /etc/ansible/hosts web-servers -m service -a “name=httpd state=restarted”
9. user模块 管理远程主机的用户
案例11: 使用user模块创建一个用户itlaoxin
[root@itlaoxin162 ~]# ansible -i /etc/ansible/hosts web-servers -m user -a “name=itlaoxin state=present”
[WARNING]: Invalid characters were found in group names but not replaced, use
-vvvv to see details
192.168.1.71 | CHANGED => {
“ansible_facts”: {
“discovered_interpreter_python”: “/usr/bin/python”
},
“changed”: true,
“comment”: “”,
“create_home”: true,
“group”: 1002,
“home”: “/home/itlaoxin”,
“name”: “itlaoxin”,
“shell”: “/bin/bash”,
“state”: “present”,
“system”: false,
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)
块重启httpd
[root@itlaoxin162 ~]# ansible -i /etc/ansible/hosts web-servers -m service -a “name=httpd state=restarted”
9. user模块 管理远程主机的用户
案例11: 使用user模块创建一个用户itlaoxin
[root@itlaoxin162 ~]# ansible -i /etc/ansible/hosts web-servers -m user -a “name=itlaoxin state=present”
[WARNING]: Invalid characters were found in group names but not replaced, use
-vvvv to see details
192.168.1.71 | CHANGED => {
“ansible_facts”: {
“discovered_interpreter_python”: “/usr/bin/python”
},
“changed”: true,
“comment”: “”,
“create_home”: true,
“group”: 1002,
“home”: “/home/itlaoxin”,
“name”: “itlaoxin”,
“shell”: “/bin/bash”,
“state”: “present”,
“system”: false,
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-f44k0caa-1713211887024)]
[外链图片转存中…(img-oAaZyCS7-1713211887024)]
[外链图片转存中…(img-Zvh9BT6K-1713211887025)]
[外链图片转存中…(img-Bfg8FRJI-1713211887025)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)
![img](https://i-blog.csdnimg.cn/blog_migrate/c1445cd0f2769761f46dad6280e9eaa6.jpeg)