自动化运维工具-Ansible实战指南(1),面试字节跳动Linux运维研发岗

dest  #被链接到的路径,只应用于state=link的情况

state  #状态,有以下选项:

directory:如果目录不存在,就创建目录

file:即使文件不存在,也不会被创建

link:创建软链接

hard:创建硬链接

touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间

absent:删除目录、文件或者取消链接文件

创建文件夹

[root@ansible ~]# ansible wsr -m file -a ‘path=/data/2339 state=directory’

192.168.100.20 | CHANGED => {

“ansible_facts”: {

“discovered_interpreter_python”: “/usr/bin/python”

},

“changed”: true,

“gid”: 0,

“group”: “root”,

“mode”: “0755”,

“owner”: “root”,

“path”: “/data/2339”,

“size”: 6,

“state”: “directory”,

“uid”: 0

}

192.168.100.10 | CHANGED => {

“ansible_facts”: {

“discovered_interpreter_python”: “/usr/bin/python”

},

“changed”: true,

“gid”: 0,

“group”: “root”,

“mode”: “0755”,

“owner”: “root”,

“path”: “/data/2339”,

“size”: 6,

“state”: “directory”,

“uid”: 0

}

创建链接文件

[root@ansible ~]# ansible wsr -m file -a ‘path=/data/2340 src=2339 state=link’

192.168.100.10 | CHANGED => {

“ansible_facts”: {

“discovered_interpreter_python”: “/usr/bin/python”

},

“changed”: true,

“dest”: “/data/2340”,

“gid”: 0,

“group”: “root”,

“mode”: “0777”,

“owner”: “root”,

“size”: 4,

“src”: “2339”,

“state”: “link”,

“uid”: 0

}

192.168.100.20 | CHANGED => {

“ansible_facts”: {

“discovered_interpreter_python”: “/usr/bin/python”

},

“changed”: true,

“dest”: “/data/2340”,

“gid”: 0,

“group”: “root”,

“mode”: “0777”,

“owner”: “root”,

“size”: 4,

“src”: “2339”,

“state”: “link”,

“uid”: 0

}

测试

[root@ansible ~]# ansible wsr -a ‘ls -l /data’

192.168.100.20 | CHANGED | rc=0 >>

total 32

-rw-rw-rw- 1 root root 13 Jul 10 11:32 2021710

-rw-r–r-- 1 root root 0 Jul 10 11:31 2021710.11427.2021-07-10@11:32:39~

drwxr-xr-x 2 root root 6 Jul 10 11:40 2339

lrwxrwxrwx 1 root root 4 Jul 10 11:42 2340 -> 2339

-rw-rw-rw- 1 root root 21 Jul 10 11:20 a.sh

-rw-r–r-- 1 root root 0 Jul 3 23:14 file1

-rw-r–r-- 1 root root 0 Jul 3 23:14 file2

-rw-r–r-- 1 root root 0 Jul 3 23:14 file3

-rw-r–r-- 1 root root 63 Jul 4 11:51 for1.conf

-rw-r–r-- 1 root root 267 Jul 4 12:06 for2.conf

-rw-r–r-- 1 root root 171 Jul 5 04:05 for3.conf

-rw-r–r-- 1 apache root 11753 Jul 10 03:21 httpd.conf

192.168.100.10 | CHANGED | rc=0 >>

total 32

-rw-rw-rw- 1 root root 13 Jul 10 11:32 2021710

-rw-r–r-- 1 root root 0 Jul 10 11:31 2021710.11493.2021-07-10@11:32:39~

drwxr-xr-x 2 root root 6 Jul 10 11:40 2339

lrwxrwxrwx 1 root root 4 Jul 10 11:42 2340 -> 2339

-rw-rw-rw- 1 root root 21 Jul 10 11:20 a.sh

-rw-r–r-- 1 root root 0 Jul 3 23:14 file1

-rw-r–r-- 1 root root 0 Jul 3 23:14 file2

-rw-r–r-- 1 root root 0 Jul 3 23:14 file3

-rw-r–r-- 1 root root 63 Jul 4 11:51 for1.conf

-rw-r–r-- 1 root root 267 Jul 4 12:06 for2.conf

-rw-r–r-- 1 root root 171 Jul 5 04:05 for3.conf

-rw-r–r-- 1 apache root 11753 Jul 10 03:21 httpd.conf

删除文件

只需把state改为absent即可

[root@ansible ~]# ansible wsr -m file -a ‘path=/data/2339 state=absent’

7 cron模块


**该模块适用于管理cron计划任务的。

其使用的语法跟我们的crontab文件中的语法一致**

  • day= #日应该运行的工作( 1-31, *, */2, )

  • hour= # 小时 ( 0-23, *, */2, )

  • minute= #分钟( 0-59, *, */2, )

  • month= # 月( 1-12, *, /2, )

  • weekday= # 周 ( 0-6 for Sunday-Saturday, )

  • job= #指明运行的命令是什么

  • name= #定时任务描述

  • reboot # 任务在重启时运行,不建议使用,建议使用special_time

  • special_time

#特殊的时间范围,参数:reboot(重启时),annually(每年),monthly(每月),weekly(每周),daily(每天),hourly(每小时)

  • state #指定状态,present表示添加定时任务,也是默认设置,absent表示删除定时任务

  • user # 以哪个用户的身份执行

[root@ansible ~]# ansible wsr -m cron -a ‘name=“echo words” minute=*/5 job=“echo hello world”’

192.168.100.10 | CHANGED => {

“ansible_facts”: {

“discovered_interpreter_python”: “/usr/bin/python”

},

“changed”: true,

“envs”: [],

“jobs”: [

“warningcron”,

“None”,

“echo words”

]

}

192.168.100.20 | CHANGED => {

“ansible_facts”: {

“discovered_interpreter_python”: “/usr/bin/python”

},

“changed”: true,

“envs”: [],

“jobs”: [

“warningcron”,

“None”,

“echo words”

]

}

测试结果

[root@ansible ~]# ansible wsr -a ‘crontab -l’

192.168.100.10 | CHANGED | rc=0 >>

#Ansible: warningcron

#* * * * 1,3,5 /usr/bin/wall FBI warning

#Ansible: None

#* * * * * /usr/bin/wall FBI warning

#Ansible: echo words

*/5 * * * * echo hello world

192.168.100.20 | CHANGED | rc=0 >>

#Ansible: warningcron

#* * * * 1,3,5 /usr/bin/wall FBI warning

#Ansible: None

#* * * * * /usr/bin/wall FBI warning

#Ansible: echo words

*/5 * * * * echo hello world

mission completely!!!

8 user模块


该模块主要是用来管理账户的

  • comment  # 用户的描述信息

  • createhome  # 是否创建家目录

  • force  # 在使用state=absent时, 行为与userdel –force一致.

  • group  # 指定基本组

  • groups  # 指定附加组,如果指定为(groups=)表示删除所有组

  • home  # 指定用户家目录

  • move_home  # 如果设置为home=时, 试图将用户主目录移动到指定的目录

  • name  # 指定用户名

  • non_unique  # 该选项允许改变非唯一的用户ID值

  • password  # 指定用户密码

  • remove  # 在使用state=absent时, 行为是与userdel –remove一致

  • shell  # 指定默认shell

  • state  # 设置帐号状态,不指定为创建,指定值为absent表示删除

  • system  # 当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户

  • uid  # 指定用户的uid

添加一个用户并指定 uid

[root@ansible ~]# ansible wsr -m user -a ‘name=zs uid=66666’

192.168.100.10 | CHANGED => {

“ansible_facts”: {

“discovered_interpreter_python”: “/usr/bin/python”

},

“changed”: true,

“comment”: “”,

“create_home”: true,

“group”: 1005,

“home”: “/home/zs”,

“name”: “zs”,

“shell”: “/bin/bash”,

“state”: “present”,

“system”: false,

“uid”: 66666

}

192.168.100.20 | CHANGED => {

“ansible_facts”: {

“discovered_interpreter_python”: “/usr/bin/python”

},

“changed”: true,

“comment”: “”,

“create_home”: true,

“group”: 1005,

“home”: “/home/zs”,

“name”: “zs”,

“shell”: “/bin/bash”,

“state”: “present”,

“system”: false,

“uid”: 66666

}

[root@ansible ~]# ansible wsr -m shell -a ‘getent passwd|grep zs’

192.168.100.10 | CHANGED | rc=0 >>

zs❌66666:1005::/home/zs:/bin/bash

192.168.100.20 | CHANGED | rc=0 >>

zs❌66666:1005::/home/zs:/bin/bash

删除用户

指定状态为absent即可

[root@ansible ~]# ansible wsr -m user -a ‘name=zs uid=66666 state=absent’

192.168.100.10 | CHANGED => {

“ansible_facts”: {

“discovered_interpreter_python”: “/usr/bin/python”

},

“changed”: true,

“force”: false,

“name”: “zs”,

“remove”: false,

“state”: “absent”

}

192.168.100.20 | CHANGED => {

“ansible_facts”: {

“discovered_interpreter_python”: “/usr/bin/python”

},

“changed”: true,

“force”: false,

“name”: “zs”,

“remove”: false,

“state”: “absent”

}

[root@ansible ~]# ansible wsr -m shell -a ‘getent passwd|grep zs’

192.168.100.10 | FAILED | rc=1 >>

non-zero return code

192.168.100.20 | FAILED | rc=1 >>

non-zero return code

9 group模块


该模块主要用于添加或删除组。

常用的选项如下:

  • gid=  #设置组的GID号

  • name=  #指定组的名称

  • state=  #指定组的状态,默认为创建,设置值为absent为删除

  • system=  #设置值为yes,表示创建为系统组

建立组并指定gid

[root@ansible ~]# ansible wsr -m group -a ‘name=ls gid=888888’

192.168.100.20 | CHANGED => {

“ansible_facts”: {

“discovered_interpreter_python”: “/usr/bin/python”

},

“changed”: true,

“gid”: 888888,

“name”: “ls”,

“state”: “present”,

“system”: false

}

192.168.100.10 | CHANGED => {

“ansible_facts”: {

“discovered_interpreter_python”: “/usr/bin/python”

},

“changed”: true,

“gid”: 888888,

“name”: “ls”,

“state”: “present”,

“system”: false

}

[root@ansible ~]# ansible wsr -m shell -a ‘cat /etc/group |grep 888888’

192.168.100.10 | CHANGED | rc=0 >>

ls❌888888:

192.168.100.20 | CHANGED | rc=0 >>

ls❌888888:

删除组

指定state为absent即可删除

[root@ansible ~]# ansible wsr -m group -a ‘name=ls state=absent’

192.168.100.20 | CHANGED => {

“ansible_facts”: {

“discovered_interpreter_python”: “/usr/bin/python”

},

“changed”: true,

“name”: “ls”,

“state”: “absent”

}

192.168.100.10 | CHANGED => {

“ansible_facts”: {

“discovered_interpreter_python”: “/usr/bin/python”

},

“changed”: true,

“name”: “ls”,

“state”: “absent”

}

10 script模块


该模块用于将本机的脚本在被管理端的机器上运行。

[root@ansible tmp]# cat df.sh

#!/bin/bash

date >> /tmp/disk_total.log

df -lh >> /tmp/disk_total.log

[root@ansible tmp]# ansible wsr -m script -a ‘/tmp/df.sh’

192.168.100.10 | CHANGED => {

“changed”: true,

“rc”: 0,

“stderr”: “Shared connection to 192.168.100.10 closed.\r\n”,

“stderr_lines”: [

“Shared connection to 192.168.100.10 closed.”

],

“stdout”: “”,

“stdout_lines”: []

}

192.168.100.20 | CHANGED => {

“changed”: true,

“rc”: 0,

“stderr”: “Shared connection to 192.168.100.20 closed.\r\n”,

“stderr_lines”: [

“Shared connection to 192.168.100.20 closed.”

],

“stdout”: “”,

“stdout_lines”: []

}

测试

[root@ansible tmp]# ansible wsr -a ‘cat /tmp/disk_total.log’

192.168.100.10 | CHANGED | rc=0 >>

Sat Jul 10 21:24:51 EDT 2021

Filesystem Size Used Avail Use% Mounted on

devtmpfs 475M 0 475M 0% /dev

tmpfs 487M 0 487M 0% /dev/shm

tmpfs 487M 7.6M 479M 2% /run

tmpfs 487M 0 487M 0% /sys/fs/cgroup

/dev/mapper/centos-root 8.0G 1.5G 6.6G 18% /

/dev/sr0 4.4G 4.4G 0 100% /mnt/centos

/dev/sda1 1014M 136M 879M 14% /boot

tmpfs 98M 0 98M 0% /run/user/0

192.168.100.20 | CHANGED | rc=0 >>

Sat Jul 10 21:24:51 EDT 2021

Filesystem Size Used Avail Use% Mounted on

devtmpfs 475M 0 475M 0% /dev

tmpfs 487M 0 487M 0% /dev/shm

tmpfs 487M 7.6M 479M 2% /run

tmpfs 487M 0 487M 0% /sys/fs/cgroup

/dev/mapper/centos-root 8.0G 1.5G 6.6G 18% /

/dev/sr0 4.4G 4.4G 0 100% /mnt/centos

/dev/sda1 1014M 136M 879M 14% /boot

tmpfs 98M 0 98M 0% /run/user/0

11 setup模块


通过调用facts(facts就是变量,内建变量)组件来收集主机信息,如vcpu个数,内存大小等…

可以使用filter来查看指定信息,调用后返回很多对应主机的信息,在后面的操作中可以根据不同的信息来做不同的操作

如redhat系列用yum安装,而debian系列用apt来安装软件。

[root@ansible tmp]# ansible wsr -m setup -a ‘filter=cpu

192.168.100.20 | SUCCESS => {

“ansible_facts”: {

“ansible_processor_vcpus”: 2,

“discovered_interpreter_python”: “/usr/bin/python”

},

“changed”: false

}

192.168.100.10 | SUCCESS => {

“ansible_facts”: {

“ansible_processor_vcpus”: 2,

“discovered_interpreter_python”: “/usr/bin/python”

},

“changed”: false

}

12 service 模块


该模块用于服务程序的管理。

其主要选项如下:

  • arguments #命令行提供额外的参数

  • enabled #设置开机启动。

  • name= #服务名称

  • runlevel #开机启动的级别,一般不用指定。

  • sleep #在重启服务的过程中,是否等待。如在服务关闭以后等待2秒再启动。(定义在剧本中。)

  • state #有四种状态,分别为:started—>启动服务, stopped—>停止服务,

  • restarted—>重启服务, reloaded—>重载配置

[root@ansible tmp]# ansible wsr -m service -a ‘name=httpd state=restarted enabled=true’

192.168.100.20 | CHANGED => {

“ansible_facts”: {

“discovered_interpreter_python”: “/usr/bin/python”

},

“changed”: true,

“enabled”: true,

“name”: “httpd”,

“state”: “started”,

“status”: {

“ActiveEnterTimestampMonotonic”: “0”,

“ActiveExitTimestampMonotonic”: “0”,

“ActiveState”: “inactive”,

“After”: “basic.target remote-fs.target system.slice systemd-journald.socket network.target tmp.mount nss-lookup.target -.mount”,

“AllowIsolate”: “no”,

“AmbientCapabilities”: “0”,

“AssertResult”: “no”,

“AssertTimestampMonotonic”: “0”,

“Before”: “shutdown.target”,

“BlockIOAccounting”: “no”,

“BlockIOWeight”: “18446744073709551615”,

“CPUAccounting”: “no”,

“CPUQuotaPerSecUSec”: “infinity”,

“CPUSchedulingPolicy”: “0”,

“CPUSchedulingPriority”: “0”,

“CPUSchedulingResetOnFork”: “no”,

“CPUShares”: “18446744073709551615”,

“CanIsolate”: “no”,

“CanReload”: “yes”,

“CanStart”: “yes”,

“CanStop”: “yes”,

“CapabilityBoundingSet”: “18446744073709551615”,

“ConditionResult”: “no”,

“ConditionTimestampMonotonic”: “0”,

“Conflicts”: “shutdown.target”,

“ControlPID”: “0”,

“DefaultDependencies”: “yes”,

“Delegate”: “no”,

“Description”: “The Apache HTTP Server”,

“DevicePolicy”: “auto”,

“Documentation”: “man:httpd(8) man:apachectl(8)”,

“EnvironmentFile”: “/etc/sysconfig/httpd (ignore_errors=no)”,

“ExecMainCode”: “0”,

“ExecMainExitTimestampMonotonic”: “0”,

“ExecMainPID”: “0”,

“ExecMainStartTimestampMonotonic”: “0”,

“ExecMainStatus”: “0”,

“ExecReload”: “{ path=/usr/sbin/httpd ; argv[]=/usr/sbin/httpd $OPTIONS -k graceful ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }”,

“ExecStart”: “{ path=/usr/sbin/httpd ; argv[]=/usr/sbin/httpd $OPTIONS -DFOREGROUND ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }”,

“ExecStop”: “{ path=/bin/kill ; argv[]=/bin/kill -WINCH ${MAINPID} ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }”,

“FailureAction”: “none”,

“FileDescriptorStoreMax”: “0”,

“FragmentPath”: “/usr/lib/systemd/system/httpd.service”,

“GuessMainPID”: “yes”,

“IOScheduling”: “0”,

“Id”: “httpd.service”,

“IgnoreOnIsolate”: “no”,

“IgnoreOnSnapshot”: “no”,

“IgnoreSIGPIPE”: “yes”,

“InactiveEnterTimestampMonotonic”: “0”,

“InactiveExitTimestampMonotonic”: “0”,

“JobTimeoutAction”: “none”,

“JobTimeoutUSec”: “0”,

“KillMode”: “control-group”,

“KillSignal”: “18”,

“LimitAS”: “18446744073709551615”,

“LimitCORE”: “18446744073709551615”,

“LimitCPU”: “18446744073709551615”,

“LimitDATA”: “18446744073709551615”,

“LimitFSIZE”: “18446744073709551615”,

“LimitLOCKS”: “18446744073709551615”,

“LimitMEMLOCK”: “65536”,

“LimitMSGQUEUE”: “819200”,

“LimitNICE”: “0”,

“LimitNOFILE”: “4096”,

“LimitNPROC”: “3795”,

“LimitRSS”: “18446744073709551615”,

“LimitRTPRIO”: “0”,

“LimitRTTIME”: “18446744073709551615”,

“LimitSIGPENDING”: “3795”,

“LimitSTACK”: “18446744073709551615”,

“LoadState”: “loaded”,

“MainPID”: “0”,

“MemoryAccounting”: “no”,

“MemoryCurrent”: “18446744073709551615”,

“MemoryLimit”: “18446744073709551615”,

“MountFlags”: “0”,

“Names”: “httpd.service”,

“NeedDaemonReload”: “no”,

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Linux运维工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)
img

为了做好运维面试路上的助攻手,特整理了上百道 【运维技术栈面试题集锦】 ,让你面试不慌心不跳,高薪offer怀里抱!

这次整理的面试题,小到shell、MySQL,大到K8s等云原生技术栈,不仅适合运维新人入行面试需要,还适用于想提升进阶跳槽加薪的运维朋友。

本份面试集锦涵盖了

  • 174 道运维工程师面试题
  • 128道k8s面试题
  • 108道shell脚本面试题
  • 200道Linux面试题
  • 51道docker面试题
  • 35道Jenkis面试题
  • 78道MongoDB面试题
  • 17道ansible面试题
  • 60道dubbo面试题
  • 53道kafka面试
  • 18道mysql面试题
  • 40道nginx面试题
  • 77道redis面试题
  • 28道zookeeper

总计 1000+ 道面试题, 内容 又全含金量又高

  • 174道运维工程师面试题

1、什么是运维?

2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?

3、现在给你三百台服务器,你怎么对他们进行管理?

4、简述raid0 raid1raid5二种工作模式的工作原理及特点

5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?

6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?

7、Tomcat和Resin有什么区别,工作中你怎么选择?

8、什么是中间件?什么是jdk?

9、讲述一下Tomcat8005、8009、8080三个端口的含义?

10、什么叫CDN?

11、什么叫网站灰度发布?

12、简述DNS进行域名解析的过程?

13、RabbitMQ是什么东西?

14、讲一下Keepalived的工作原理?

15、讲述一下LVS三种模式的工作过程?

16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?

17、如何重置mysql root密码?

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

【运维技术栈面试题集锦】 ,让你面试不慌心不跳,高薪offer怀里抱!

这次整理的面试题,小到shell、MySQL,大到K8s等云原生技术栈,不仅适合运维新人入行面试需要,还适用于想提升进阶跳槽加薪的运维朋友。

[外链图片转存中…(img-KetXMxvm-1712646569229)]

本份面试集锦涵盖了

  • 174 道运维工程师面试题
  • 128道k8s面试题
  • 108道shell脚本面试题
  • 200道Linux面试题
  • 51道docker面试题
  • 35道Jenkis面试题
  • 78道MongoDB面试题
  • 17道ansible面试题
  • 60道dubbo面试题
  • 53道kafka面试
  • 18道mysql面试题
  • 40道nginx面试题
  • 77道redis面试题
  • 28道zookeeper

总计 1000+ 道面试题, 内容 又全含金量又高

  • 174道运维工程师面试题

1、什么是运维?

2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?

3、现在给你三百台服务器,你怎么对他们进行管理?

4、简述raid0 raid1raid5二种工作模式的工作原理及特点

5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?

6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?

7、Tomcat和Resin有什么区别,工作中你怎么选择?

8、什么是中间件?什么是jdk?

9、讲述一下Tomcat8005、8009、8080三个端口的含义?

10、什么叫CDN?

11、什么叫网站灰度发布?

12、简述DNS进行域名解析的过程?

13、RabbitMQ是什么东西?

14、讲一下Keepalived的工作原理?

15、讲述一下LVS三种模式的工作过程?

16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?

17、如何重置mysql root密码?

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-7CR8xS44-1712646569230)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值