RHCEansible 任务模块

文件操作模块

file模块 ansible-doc file -s

path 参数 :必须参数,用于指定要操作的文件或目录,在之前版本的 ansible 中,使用 dest 参数或者 name 参数指定要操作的文件或目录,为了兼容之前的版本,使用 dest name 也可以。
state 参数 Path=“ 路径 ” state= touch|directory|link|hard|absent
此参数非常灵活,此参数对应的值需要根据情况设定,比如,当我们需要在远程主机中创建一个目录的时候,我们需要使用 path 参数指定对应的目录路径,假设,我想要在远程主机上创 /testdir/a/b 目录,那么我则需要设置 path=/testdir/a/b ,但是,我们无法从 "/testdir/a/b" 这个 路径看出 b 是一个文件还是一个目录, ansible 也同样无法单单从一个字符串就知道你要创建文件还 是目录,所以,我们需要通过 state 参数进行说明
src 参数 :当 state 设置为 link 或者 hard 时,表示我们想要创建一个软链或者硬链,所以,我们必须指明软链或硬链链接的哪个文件,通过 src 参数即可指定链接源。
force 参数 : state=link 的时候,可配合此参数强制创建链接文件,当 force=yes 时,表示强制创 建链接文件,不过强制创建链接文件分为两种情况,情况一:当你要创建的链接文件指向的源文件 并不存在时,使用此参数,可以先强制创建出链接文件。情况二:当你要创建链接文件的目录中已 经存在与链接文件同名的文件时,将 force 设置为 yes ,回将同名文件覆盖为链接文件,相当于删除
在远程主机上执行脚本
[root@centos7 ~]# ansible test -m script -a "test.sh chdir=/tmp"
172.20.21.120 | SUCCESS => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 172.20.21.120 closed.\r\n",
"stdout": "/tmp\r\n",
"stdout_lines": [
"/tmp"
]
}
[root@centos7 ~]# ansible test -m raw -a "pwd"
172.20.21.120 | SUCCESS | rc=0 >>
/root
Shared connection to 172.20.21.120 closed. 同名文件,创建链接文件。情况三:当你要创建链接文件的目录中已经存在与链接文件同名的文
件,并且链接文件指向的源文件也不存在,这时会强制替换同名文件为链接文件。
owner 参数 :用于指定被操作文件的属主,属主对应的用户必须在远程主机中存在,否则会报错。
group 参数 :用于指定被操作文件的属组,属组对应的组必须在远程主机中存在,否则会报错。
mode 参数 :用于指定被操作文件的权限,比如,如果想要将文件权限设置为 "rw-r-x---" ,则可以使用 mode=650 进行设置,或者使用 mode=0650 ,效果也是相同的,如果你想要设置特殊权限, 比如为二进制文件设置 suid ,则可以使用 mode=4700 ,很方便吧。
recurse 参数 :当要操作的文件为目录,将 recurse 设置为 yes ,可以递归的修改目录中文件的属性。 -R
创建文件
[root@server ~]# ansible  web  -m  file  -a  'path=/file.txt  owner=redhat  mode=0000 setype=default_t  state=touch'

创建软连接

删除链接

copy模块 

src 参数 :用于指定需要 copy 的文件或目录
dest 参数 :用于指定文件将被拷贝到远程主机的哪个目录中, dest 为必须参数
content 参数 :当不使用 src 指定拷贝的文件时,可以使用 content 直接指定文件内容, src
content 两个参数必有其一,否则会报错。
force 参数 : 当远程主机的目标路径中已经存在同名文件,并且与 ansible 主机中的文件内容不同时,是否强制覆盖,可选值有 yes no ,默认值为 yes ,表示覆盖,如果设置为 no ,则不会执行覆 盖拷贝操作,远程主机中的文件保持不变。
backup 参数 : 当远程主机的目标路径中已经存在同名文件,并且与 ansible 主机中的文件内容不同时,是否对远程主机的文件进行备份,可选值有 yes no ,当设置为 yes 时,会先备份远程主机中的 文件,然后再将 ansible 主机中的文件拷贝到远程主机。
owner 参数 : 指定文件拷贝到远程主机后的属主,但是远程主机上必须有对应的用户,否则会报错。
group 参数 : 指定文件拷贝到远程主机后的属组,但是远程主机上必须有对应的组,否则会报错。
mode 参数 : 指定文件拷贝到远程主机后的权限,如果你想将权限设置为 "rw-r--r--" ,则可以使用mode=0644 表示,如果你想要在 user 对应的权限位上添加执行权限,则可以使用 mode=u+x 示。

复制文件

fetch 模块---拉取远程主机的文件

dest 目标地址
src
flat yes 不按照 src 的目录来创建目录, flat no 就在当前路径创建和 src 一样的目录路径

synchronize 模块---同步文件

src :源文件
dest: 目标文件
archive : 是否采用归档模式同步 , 保证源文件和目标文件属性一致
rsync_opts : 使用 rsync 参数
--exclude=*.log : 此处为忽略 .log 结尾的文件 , 必须和 rsync_opts 使用例 (rsync_opts=--
exclude=.txt)
delete: 删除不存在的文件,默认 no
mode : pull ---   拉  push --- 推
[root@master ~]# ansible all -m yum -a 'name=rsync state=present' 如果没有 rsync 先安装

 

 将/p1目录和目录文件同步到/p2(-avz --- 打包操作)

将p1目录中文件数据同步到p2且删除p2源文件(注意/p1 和 /p1/的区别)

控制端(server)目录下文件向受控端(node2)目录下文件保持一致

blockinfile模块---插入"一段文本"

path 参数 :必须参数,指定要操作的文件。
[root@master ~]# ansible webservers -m fetch -a 'src=/etc/hosts dest=/opt'
[root@master ~]# ll /opt/
总用量 0
drwxr-xr-x. 3 root root 17 3 3 21:25 node1.kongd.com
drwxr-xr-x. 3 root root 17 3 3 21:25 node2.kongd.com
drwxr-xr-x. 3 root root 17 3 3 21:25 node3.kongd.com
[root@master ~]# ansible node3.kongd.com -m fetch -a 'src=/etc/hosts
dest=/opt/hosts flat=yes'
[root@master ~]# ansible node1.kongd.com -m synchronize -a 'src=/etc/hosts
dest=/tmp mode=pull'
注意: mode 默认为 push ,要拉取到主控节点,需要配置 mode pull
[root@master ~]# ansible node1.kongd.com -m synchronize -a "src=/tmp/ dest=/mnt
archive=yes delete=yes rsync_opts=--excloud=*.txt "
block 参数 :此参数用于指定我们想要操作的那 " 一段文本 " ,此参数有一个别名叫 "content" ,使用content block 的作用是相同的。
marker 参数 :假如我们想要在指定文件中插入一段文本, ansible 会自动为这段文本添加两个标记,一个开始标记,一个结束标记,默认情况下,开始标记为 # BEGIN ANSIBLE MANAGED BLOCK ,结束标记为 # END ANSIBLE MANAGED BLOCK ,我们可以使用 marker 参数自定义 " " ,比如, marker=#{mark}test ,这样设置以后,开始标记变成了 # BEGIN test ,结束标记变成 # END test ,没错, {mark} 会自动被替换成开始标记和结束标记中的 BEGIN END ,我们也可以 插入很多段文本,为不同的段落添加不同的标记,下次通过对应的标记即可找到对应的段落。
state 参数 : state 参数有两个可选值, present absent ,默认情况下,我们会将指定的一段文本 " 插入 " 到文件中,如果对应的文件中已经存在对应标记的文本,默认会更新对应段落,在执行插 入操作或更新操作时, state 的值为 present ,默认值就是 present ,如果对应的文件中已经存在对 应标记的文本并且将 state 的值设置为 absent ,则表示从文件中删除对应标记的段落。
insertafter 参数 :在插入一段文本时,默认会在文件的末尾插入文本,如果你想要将文本插入在某一行的后面,可以使用此参数指定对应的行,也可以使用正则表达式 (python 正则 ) ,表示将文本 插入在符合正则表达式的行的后面,如果有多行文本都能够匹配对应的正则表达式,则以最后一个 满足正则的行为准,此参数的值还可以设置为 EOF ,表示将文本插入到文档末尾。
insertbefore 参数 :在插入一段文本时,默认会在文件的末尾插入文本,如果你想要将文本插入在某一行的前面,可以使用此参数指定对应的行,也可以使用正则表达式 (python 正则 ) ,表示将文 本插入在符合正则表达式的行的前面,如果有多行文本都能够匹配对应的正则表达式,则以最后一 个满足正则的行为准,此参数的值还可以设置为 BOF ,表示将文本插入到文档开头。
backup 参数 :是否在修改文件之前对文件进行备份。
create 参数 :当要操作的文件并不存在时,是否创建对应的文件。
1. /etc/rc.d/rc.local 文件复制到 /testdir 目录中,以做测试假如,我们想要在 test70 主机中
/testdir/rc.local 文件尾部插入如下两行
systemctl start mariadb
systemctl start httpd
#ansible test70 -m blockinfile -a 'path=/testdir/rc.local block="systemctl start
mariadb\nsystemctl start httpd"'
#BEGIN ANSIBLE MANAGED BLOCK
systemctl start mariadb
systemctl start httpd
\# END ANSIBLE MANAGED BLOCK

2. 我们也可以自定义标记,但是自定义的标记仍然要 " 成对出现 " ,需要有开始标记和结束标记

#ansible test70 -m blockinfile -a 'path=/testdir/rc.local block="systemctl start
mariadb\nsystemctl start httpd" marker="#{mark} serivce to start" '
#BEGIN serivce to start
systemctl start mariadb
systemctl start httpd
#END serivce to start
3. 当文本块标记已存在,但再次编辑内容会覆盖原标记中的内容
#ansible test70 -m blockinfile -a 'path=/testdir/rc.local block="systemctl start
mariadb" marker="#{mark} serivce to start" '
文本块的内容被更新为如下文本。
#BEGIN serivce to start
systemctl start mariadb
#END serivce to start
4. 删除对应标记文本块
当文本块为空时删除对应标记文本块
#ansible test70 -m blockinfile -a 'path=/testdir/rc.local block="" marker="#
{mark} serivce to start" '
#ansible test70 -m blockinfile -a 'path=/testdir/rc.local marker="#{mark}
serivce to start" state=absent'

5. 将文本块插入到文档的开头,可以使用 insertbefore 参数,将其值设置为 BOF BOF 表示 Begin Of File
ansible test70 -m blockinfile -a 'path=/testdir/rc.local block="####blockinfile
test####" marker="#{mark} test" insertbefore=BOF'

6. 如果使用如下命令,表示将文本块插入到文档的结尾,与默认操作相同,将 insertafter 参数设置为 EOF表示 End Of File
#ansible test70 -m blockinfile -a 'path=/testdir/rc.local block="####blockinfile
test####" marker="#{mark} test" insertafter=EOF'

7. 使用如下命令表示使用正则表达式匹配行,将文本块插入到 " #!/bin/bash 开头的行 " 之后
ansible test70 -m blockinfile -a 'path=/testdir/rc.local block="####blockinfile
test####" marker="#{mark} test reg" insertafter="^#!/bin/bash" '

8. 使用 backup 参数,可以在操作修改文件之前,对文件进行备份,备份的文件会在原文件名的基础上添加时间戳
ansible test70 -m blockinfile -a 'path=/testdir/rc.local marker="#{mark} test"
state=absent backup=yes'

9. 使用 create 参数,如果指定的文件不存在,则创建它,示例如下
ansible test70 -m blockinfile -a 'path=/testdir/test block="test" marker="#{mark}
test" create=yes'

先创建文件

 在文档尾部插入hellowd,插入成功标识为自定义的"test msg"

 lineinfile模块---确保"某一行文本"存在于指定的文件中

path 参数 :必须参数,指定要操作的文件。
line 参数 : 使用此参数指定文本内容。
regexp 参数 :使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些 行都会被删除。
state 参数 :当想要删除对应的文本时,需要将 state 参数的值设置为 absent absent 为缺席之意,表示删除, state 的默认值为 present
backrefs 参数 :默认情况下,当根据正则替换文本时,即使 regexp 参数中的正则存在分组,在 line 参数中也不能对正则中的分组进行引用,除非将 backrefs 参数的值设置为 yes backrefs=yes 表示 开启后向引用,这样, line 参数中就能对 regexp 参数中的分组进行后向引用了。 backrefs=yes 开启 后向引用功能。
另一个作用,使用正则表达式替换对应行时,如果正则没有匹配到任何的行,那么 line 对应的内容会被插入到文本的末尾,不过,如果使用了 backrefs=yes ,情况就不一样了,当使用正则表达式替 换对应行,那么当正则没有匹配到任何的行时,则不会对文件进行任何操作,相当于保持原文件不
insertafter 参数 :借助 insertafter 参数可以将文本插入到 指定的行 之后, insertafter 参数的值可以设置为 EOF 或者正则表达式, EOF End Of File 之意,表示插入到文档的末尾,默认情况下 insertafter 的值为 EOF ,如果将 insertafter 的值设置为正则表达式,表示将文本插入到匹配到正则 的行之后,如果正则没有匹配到任何行,则插入到文件末尾,当使用 backrefs 参数时,此参数会被 忽略。
insertbefore 参数 :借助 insertbefore 参数可以将文本插入到 指定的行 之前, insertbefore 参数的值可以设置为 BOF 或者正则表达式, BOF Begin Of File 之意,表示插入到文档的开头,如果将 insertbefore 的值设置为正则表达式,表示将文本插入到匹配到正则的行之前,如果正则没有匹配 到任何行,则插入到文件末尾,当使用 backrefs 参数时,此参数会被忽略。
backup 参数 :是否在修改文件之前对文件进行备份。
create 参数 :当要操作的文件并不存在时,是否创建对应的文件。

 

若文件存在则在file1插入1111,不存在则创建文件插入

unarchive解包解压缩

copy 1 、将 ansible 主机上的压缩包传到远程主机后解压缩至特定目录,设置 copy=yes
            2、将远程主机上的某个压缩包解压缩到指定路径下,设置copy=no
remote_src :和 copy 功能一样且互斥, yes 表示在远程主机,不在 ansible 主机, no 表示文件在ansible 主机上
src :源路径,可以是 ansible 主机上的路径,也可以是远程主机上的路径,如果是远程主机上的路 径,则需要设置 copy=no
dest :远程主机上的目标路径
mode :设置解压缩后的文件权限
#ansible all -m unarchive -a 'src=/data/foo.tgz dest=/var/lib/foo'
#ansible all -m unarchive -a 'src=/tmp/foo.zip dest=/data copy=no mode=0777'
src= 受控主机压缩文件 dest= 控制主机文件路径
#ansible all -m unarchive -a 'src=https://example.com/example.zip dest=/data
copy=no'

计划任务

cron模块 

backup :对远程主机上的原任务计划内容修改之前做备份
cron_file :如果指定该选项,则用该文件替换远程主机上的 cron.d 目录下的用户的任务计划
day :日( 1-31 /2,……
hour :小时( 0-23 /2 ……
minute :分钟( 0-59 /2 ……
month :月( 1-12 /2 ……
weekday :周( 0-7 * ……
job :要执行的任务,依赖于 state=present
name :该任务的描述
special_time :指定什么时候执行,参数: reboot,yearly (每年), annually, (每年相当于
yearly monthly,weekly,daily,hourly
state :确认该任务计划是创建还是删除
user :以哪个用户的身份执行

用户管理

user模块

name= :用户名
uid :用户的 uid
group :所属组,即私有组
groups :附加组。
state :状态。
remove yes no
password

 group模块

name 参数:必须参数,用于指定要操作的组名称。
state 参数:用于指定组的状态 , 两个值可选 ,present,absent, 默认为 present, 设置为 absent 表示删除
组。
gid 参数:用于指定组的 gid
system 参数:系统组。

 示例︰创建一个系统组rhce

[root@master ~]# ansible webservers -m group -a 'name=rhce system=yes'

软件包管理

yum_repository(在配置yum前先挂载mount)

name 参数:必须参数,用于指定要操作的唯一的仓库 ID ,也就是 ”.repo” 配置文件中每个仓库对应的 中括号 内的仓库 ID
baseurl 参数:此参数用于设置 yum 仓库的 baseurl
description 参数:此参数用于设置仓库的注释信息,也就是 ”.repo” 配置文件中每个仓库对应的 ”name 字段 对应的内容。
file 参数:此参数用于设置仓库的配置文件名称,即设置 ”.repo” 配置文件的文件名前缀,在不使用此参数的情况下,默认以 name 参数的仓库 ID 作为 ”.repo” 配置文件的文件名前缀,同一个 ”.repo” 配置文件中 可以存在多个 yum 源。
enabled 参数:此参数用于设置是否激活对应的 yum 源,此参数默认值为 yes ,表示启用对应的yum 源,设置为 no 表示不启用对应的 yum 源。
gpgcheck 参数:此参数用于设置是否开启 rpm 包验证功能,默认值为 no ,表示不启用包验证,设置为 yes 表示开启包验证功能。
gpgkey 参数:当 gpgcheck 参数设置为 yes 时,需要使用此参数指定验证包所需的公钥。 state参数:默认值为 present ,当值设置为 absent 时,表示删除对应的 yum 源。
示例:注意环境默认的 yum http://content.example.com/rhel8.0/x86_64/dvd/AppStream
// webservers 的主机配置 yum 源,设置 ID AppStream

 yum/dnf模块

name 参数:必须参数,用于指定需要管理的软件包,比如 nginx
state 参数:用于指定软件包的状态 ,默认值为。 present ,表示确保软件包已经安装,除了。present ,其他可用值有 installed latest absent removed ,其中 installed present 等效, latest 表示安装 yum 中最新的版本, absent removed 等效,表示删除对应的软件包。
disable_gpg_check 参数:用于禁用对 rpm 包的公钥 gpg 验证。默认值为 no ,表示不禁用验证,设置为 yes 表示禁用验证,即不验证包,直接安装。在对应的 yum 源没有开启 gpg 验证的情况 下,需要将此参数的值设置为 yes ,否则会报错而无法进行安装。
enablerepo 参数:用于指定安装软件包时临时启用的 yum 源。假如你想要从 A 源中安装软件,但是你不确定 A 源是否启用了,你可以在安装软件包时将此参数的值设置为 yes ,即使 A 源的设置是未 启用,也可以在安装软件包时临时启用 A 源。
disablerepo 参数:用于指定安装软件包时临时禁用的 yum 源。某些场景下需要此参数,比如,当多个 yum 源中同时存在要安装的软件包时,你可以使用此参数临时禁用某个源,这样设置后,在 安装软件包时则不会从对应的源中选择安装包。
enablerepo 参数和 disablerepo 参数可以同时使用。

案例

1.挂载本地光盘到/mnt

2.配置yum源仓库文件通过多种方式实现

仓库1 :

Name: RH294_Base

Description: RH294 base software

Base urt: file:///mnt/BaseOS

不需要验证钦件包 GPG 签名

启用此软件仓库

仓库 2:

Name: RH294_Stream

Description : RH294 stream software

Base url:file:///mnt/AppStream

不需要验证软件包 GPG 签名

3.配置成功后安装http软件包(多种方法实现)

1.[root@server ~]# ansible node1 -m mount -a 'src=/dev/sr0 path=/mnt fstype=iso9660 state=present'

2.第一种方法:yum_repository

[root@server ~]# ansible node1 -m yum_repository -a 'name=RH294_Base description="RH294 base software" baseurl="file:///mnt/BaseOS" gpgcheck=no'

[root@server ~]# ansible node1 -m yum_repository -a 'name=RH294_Stream description="RH294 stream software" baseurl="file:///mnt/AppStream" gpgcheck=no'

第二种方法:copy---控制端主机先编辑配置文件然后发送到受控主机

# vim  base.repo

......

......

......

# ansible node1,node2 -m copy -a 'src=./base.repo dest=/etc/yum.repos.d/ force=yes backup=yes'

第三种方法:synchronize同步

# ansible node1,node2 -m synchronize -a 'src=./base.repo dest=/etc/yum.repos.d/ mode=push'

第四种方法:通过copy编辑文件

# ansible node1,node2 -m file -a 'path=/etc/yum.repos.d/base.repo state=touch' --- 使用copy编辑前,文件一定要存在,所以要先创建

# ansible node1,node2 -m copy -a 'dest=/etc/yum.repos.d/base.repo content= "[baseos]\nname=base\nbaseurl=........\n[appstream]\n.........." '

第五种方法:blockinfile插入信息

# ansible node1,node2 -m blockinfile -a 'path=etc/yum.repos.d/base.repo block="[baseos]\nname=base\nbaseurl=........\n[appstream]\n.........." marker="#{mark} yum con" insertbefore=BOF state=present '

第六种方法:lineinfile确保"某一行文本"存在于指定的文件中

# ansible node1,node2 -m lineinfile -a 'path=etc/yum.repos.d/base.repo block="[baseos]\nname=base\nbaseurl=........\n[appstream]\n.........." marker="#{mark} yum con" insertbefore=BOF state=present '

3.[root@server ~]# ansible node1 -m yum -a 'name=httpd disable_gpg_check=yes'

 Service/systemd模块

name 参数:此参数用于指定需要操作的服务名称,比如 nginx
state 参数:此参数用于指定服务的状态,比如,我们想要启动远程主机中的 nginx ,则可以将state 的值设置为 started ;如果想要停止远程主机中的服务,则可以将 state 的值设置为
stopped 。此参数的可用值有 started stopped restarted reloaded
enabled 参数:此参数用于指定是否将服务设置为开机 启动项,设置为 yes 表示将对应服务设置为 开机启动,设置为 no 表示不会开机启动
arguments: 给命令提供一些选项
ansible all -m service -a "name=network state=restarted args=eth0"
runlevel : 运行等级
sleep: 如果运行看 restarted stop and start 之间沉睡几秒中
pattern :定义一个模式,如果通过 status 指令来查看服务的状态时,没有响应,就会通过 ps 指令在进程中根据该模式进行查找,如果匹配到,则认为该服务依然在运行

 防火墙

firewalld 模块

State 指防火墙策略 enable disable present absent
service 指定服务
immediate 立即启用
port 端口 port=80/tcp
permanent 永久生效

selinux模块

功能:管理远端主机的 SELINUX 防火墙;
参数
state Selinux 模式: enforcing permissive disabled
policy targeted

配置网络

nmcli使用模块

 Hostname模块管理主机名(永久生效)

 上传下载文件

get_url 模块 --- 检验文件

sha256sum :下载完成后进行 sha256 check
timeout :下载超时时间,默认 10s
url :下载的 URL
url_password url_username :主要用于需要用户名密码进行验证的情况
owner
指定属主
group
指定属组

 uri模块 curl http://localhost -k -u tom: --- 获取网页信息

url= 指明请求的 url 的路径,如: http://10.1.32.68/test.jpg
user= 如果请求的 url 需要认证,则认证的用户名是什么
password= 如果请求的 url 需要认证,则认证的密码是什么
method= 指明请求的方法,如 GET POST…
body= 指明报文中实体部分的内容,一般是 POST 方法或 PUT 方法时用到HEADER_ 自定义请求报文中的添加的首部
return_content: 是否将返回主体作为字典中的 "content" 值返回
validate_certs: 如果 ,则不会验证 ssl 证书。这应该只设置为 使用个人控制的网站使用自签名证书。
Force_basic_auth:

根据初始请求强制发送基本身份验证标头。 Uri 模块使用的库仅在 webservice 401 状态响应初始请求
时发送身份验证信息。由于一些基本的认证服务没有正确地发送 401 ,登录将失败
url: http://......
validate_certs: no
force_basic_auth: yes
user=redhat
password=web_pass
return_content: yes 返回 content ,默认不显示
status_code: 200 正确状态值 200
[ root@server ~ ] # ansible localhost -m uri -a 'url=http://localhost return_content=yes status_code=404' --- status_code指预判断的结果为404,也可以写200,如果结果和预判断的不一样则会显示红色错误结果,但是并不是语法错误,不影响

磁盘管理

mount模块

fstype :必选项,挂载文件的类型
path :必选项,挂载点
opts :传递给 mount 命令的参数
src :必选项,要挂载的文件系统
state :必选项 present :只处理 fstab 中的配置 absent
        挂载点mounted
        unmounted:卸载
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值