自动化工具ansible部署和实践

1 介绍和部署

1.1 介绍

  1. ansible的功能
    我爱你在当今的IT自动化领域,Ansible无疑是一个无法被忽视的重要角色。其便利性和高效性受到了广大开发者和系统管理员的一致好评,成为了配置管理和应用部署的首选工具。然而,对于一些初学者来说,Ansible的概念和架构可能会显得有些复杂和难以理解。因此,我打算通过一系列深入解析Ansible的博文,帮助大家更好地理解和使用这一工具。基于ssh协议实现远程管理,可以实现多种批量管理操作.

  • 批量系统配置

  • 批量软件部署

  • 批量文件拷贝

  • 批量运行命令

2.ansible的角色
  • 管理端:不需要启动任何服务,默认服务端不需要任何的配置

  • 受控端:基于ssh免秘钥,没有客户端软件需要安装

3.ansible命令

        Ansible 命令是一种强大的自动化工具,它允许系统管理员和开发者在多台机器上自动执行任务。其中,Ad-Hot模式是一个概念性的名称,它与编写Ansible playbook的概念相似,类似于直接在命令行输入shell命令与编写shell scripts之间的关联。
具体而言,Ansible命令由以下三个主要部分组成:

  1. 1. Ansible 匹配的资产主机:这是你希望在其上执行任务的目标机器或一组机器。
  2. 2. 使用的模块 -m:这是你希望执行的具体动作或任务,Ansible提供了许多预定义的模块以供选择。
  3. 3. 模块的参数 -a:这允许你为特定模块传递参数,以便进一步定制其行为。

Ad-Hoc 命令的基本格式如下:

ansible [pattern] -m [module] -a '[module arguments]' [options]

其中:

  • [pattern]:用来匹配目标主机或主机组的模式。

  • -m [module]:指定要使用的模块。

  • -a '[module arguments]':指定模块的参数。

  • [options]:其他可选参数。
     

详细解释一些常用的选项:

  • -a 'Arguments', --args='Arguments'

    指定模块的参数。

  • -m NAME, --module-name=NAME

    指定要执行的模块名。默认使用 command 模块,所以如果只是执行单一命令,可以省略 -m 参数。

  • -u Username, --user=Username

    指定执行远程命令的用户,默认使用当前用户。

  • -U, --sudo-user=SUDO_User

    sudo 到哪个用户,默认为 root。

  • -k, --ask-pass

    提示输入 SSH 密码,而不是假设基于密钥的验证。

  • -K, --ask-sudo-pass

    提示输入 sudo 密码。

  • -s, --sudo

    使用 sudo 运行命令。

  • -S, --su

    使用 su 命令运行命令。

  • -f NUM, --forks=NUM

    指定并行任务数,默认为 5。

  • --private-key=PRIVATE_KEY_FILE

    指定私钥文件的路径,用于 SSH 连接验证。

  • -v, --verbose

    输出详细信息。

  • all

    针对 hosts 文件中定义的所有主机执行命令。

  • -M MODULE_PATH, --module-path=MODULE_PATH

    指定模块的搜索路径。

  • -o, --one-line

    压缩输出,尝试将输出信息压缩到一行中显示。

  • -B SECONDS, --background=SECONDS

    在后台运行命令,并指定超时时间。

  • -P NUM, --poll=NUM

    在后台模式下,每隔多少秒检查一次作业状态。

  • -T SECONDS, --timeout=SECONDS

    设置命令执行的超时时间。

  • -c CONNECTION, --connection=CONNECTION

    指定连接类型,如 paramiko (SSH)、sshlocal

  • --tags=TAGS

    只执行指定标签的任务。

  • --list-hosts

    只打印将执行 playbook 的主机列表,并不真正执行 playbook。

  • --list-tasks

    列出 playbook 中所有将被执行的任务。

  • -C, --check

    只测试命令会改变什么内容,而不会真正执行。

  • --syntax-check

    检查 playbook 的语法,但不执行。

  • -l SUBSET, --limit=SUBSET

    进一步限制所选主机或主机组。

  • --skip-tags=SKIP_TAGS

    跳过标签匹配的任务。

  • -e EXTRA_VARS, --extra-vars=EXTRA_VARS

    设置额外的变量。

1.2 ansible软件安装部署

  1. 环境规划

主机名IP地址用途
master0110.0.0.61管理段
backup10.0.0.41受控端
nfs0110.0.0.31受控端
web0110.0.0.7受控端
  1. 免秘钥配置
    生成秘钥对

ssh-keygen -t dsa

分发秘钥

sh-copy-id -i /root/.ssh/id_dsa.pub 172.16.1.7
sh-copy-id -i /root/.ssh/id_dsa.pub 172.16.1.31
sh-copy-id -i /root/.ssh/id_dsa.pub 172.16.1.41

免交互批量分发秘钥参考我的批量免秘钥分发脚本
3) 口令登录方式配置[备选]
如果企业限制不允许使用ssh免秘钥方式,也可以使用在ansible的主机配置中,制定远程主机用户名和密码的方式

[root@xxxx ~]# vim /etc/ansible/hosts
[noah]
172.16.1.7
172.16.1.31 ansible_user=root ansible_password=123456
172.16.1.41

要先按装了ansibl软件,才会有该配置文件

  1. 安装ansible
    软件安装

yum install -y ansible

若受控主机有启用selinux,会影响ansible链接,在不能禁用的情况下,客户机可以安装以下程序

yum install -y libselinux-python
  • 主机列表创建

cp /etc/ansible/hosts{,.bak}
cat >/etc/ansible/hosts <<"EOF"
[noah]
172.16.1.7
172.16.1.31
172.16.1.41
EOF

1.3 用法说明

  1. 语法

ansible 主机信息  -m 模块名称 -a "相关模块参数""

主机信息:远程主机IP地址,主机组名称,all代表所有主机
-m:指定使用哪个模块
-a:模块中的参数和功能

  ping模块

[root@xxxx ~]# ansible all -m ping
172.16.1.41 | SUCCESS => {
"changed": false, 
"ping": "pong"
}
172.16.1.7 | SUCCESS => {
"changed": false, 
"ping": "pong"
}
172.16.1.31 | SUCCESS => {
"changed": false, 
"ping": "pong"
}

        ping模块没有参数,不用跟-e
2) 返回颜色
ansible会根据返回结果的类型不同,显示不同的颜色

  • 绿色:查看远程主机信息,不会对远程主机系统做任何修改

  • 红色:执行操作出现异常错误

  • 黄色:对远程主机系统进行修改操作

  • 粉色:警告或者忠告信息

其它示例

        以 root 用户身份对所有主机执行 df -h 命令:

ansible all -m command -a "df -h" --become --become-user root

        使用 yum 模块安装 nginx,并提示输入密码:

ansible webservers -m yum -a "name=nginx state=present" -k

        以 john 用户身份对 appservers 主机组执行 uptime 命令,并限制并发数为 5:

ansible appservers -m command -a "uptime" -u john -f 5

        重启 testhosts 组的所有机器,每次重启 10 台:

ansible testhosts -a "/sbin/reboot" -f 10

        使用额外的变量执行 playbook:

ansible-playbook update.yml --extra-vars "hosts=vipers user=admin"

        只对这个两个 IP 执行任务:

ansible [pattern] -m [module] -a '[module arguments]' --limit=192.168.0.10,192.168.0.11

ansible常用命令解释

ansible-doc

# ansible-doc -h Usage: ansible-doc [options] [module...]

该指令用于查看模块信息,常用参数有两个-l 和 -s ,具体如下:

//列出所有已安装的模块 # ansible-doc -l //查看具体某模块的用法,这里如查看command模块 # ansible-doc -s command

ansible-galaxy

# ansible-galaxy -h Usage: ansible-galaxy [init|info|install|list|remove] [--help] [options] ...

ansible-galaxy指令用于方便的从https://galaxy.ansible.com/ 站点下载第三方扩展模块,我们可以形象的理解其类似于centos下的yum、python下的pip

ansible-playbook

通过读取playbook 文件后,执行相应的动作,

ansible-pull

该指令使用需要谈到ansible的另一种模式---pull 模式,这和我们平常经常用的push模式刚好相反,其适用于以下场景:你有数量巨大的机器需要配置,即使使用非常高的线程还是要花费很多时间;

ansible-vault

ansible-vault主要应用于配置文件中含有敏感信息,又不希望他能被人看到,vault可以帮你加密/解密这个配置文件,属高级用法。主要对于playbooks里比如涉及到配置密码或其他变量时,可以通过该指令加密,这样我们通过cat看到的会是一个密码串类的文件,编辑的时候需要输入事先设定的密码才能打开。这种playbook文件在执行时,需要加上 –ask-vault-pass参数,同样需要输入密码后才能正常执行。具体该部分可以参看官网

2 命令类常用模块

ansible模块列表
https://docs.ansible.com/ansible/latest/modules/modules_by_category.html

2.1 command[命令模块]

  1. 官方链接:
    http://docs.ansible.com/ansible/latest/modules/command_module.html
    说明:该模块与shell模块类似,但不能识别特殊符号

  2. 常用参数:

free_form	[必须]表示执行command模块时,必须要有linux合法命令信息,如ls
chdir		在执行某个命令前,先切换目录
creates		判断一个文件是否存在,如果已经存在了,后面的命令就不会执行
removes		判断一个文件是否存在,如果不存在,后面的命令就不会执行
  1. 举例

  • chdir参数

[root@xxxx ~]# ansible 172.16.1.31 -m command -a "chdir=/tmp/ pwd"
172.16.1.31 | SUCCESS | rc=0 >>
/tmp
  • creates参数

[root@xxxx ~]# ansible 172.16.1.41 -m command -a "creates=/etc/rsyncd.conf hostname"
172.16.1.41 | SUCCESS | rc=0 >>
skipped, since /etc/rsyncd.conf exists
[root@xxxx ~]# ansible 172.16.1.41 -m command -a "creates=/etc/rsyncd.123456 hostname"
172.16.1.41 | SUCCESS | rc=0 >>
backup
  • removes参数

[root@xxxx ~]# ansible 172.16.1.41 -m command -a "removes=/etc/rsyncd.conf hostname"
172.16.1.41 | SUCCESS | rc=0 >>
backup
[root@xxxx ~]# ansible 172.16.1.41 -m command -a "removes=/etc/rsyncd.1212213123 hostname"
172.16.1.41 | SUCCESS | rc=0 >>
skipped, since /etc/rsyncd.1212213123 does not exist

2.2 shell[万能模块]

  1. 官方链接
    https://docs.ansible.com/ansible/latest/modules/shell_module.html#shell-module
    说明:shell模块可以满足command模块所有功能,并且可以支持识别特殊字符信息 < > | ;

  2. 常用参数

free_form	[必须]表示执行command模块时,必须要有linux合法命令信息,如ls
chdir		在执行莫个命令前,先切换目录
creates		判断一个文件是否存在,如果已经存在了,后面的命令就不会执行
removes		判断一个文件是否存在,如果不存在,后面的命令就不会执行
  1. 举例

[root@xxxx ~]# ansible 172.16.1.41 -m shell -a "hostname;pwd"
172.16.1.41 | SUCCESS | rc=0 >>
backup
/root

可以使用该名模,执行所有linux的命令,所以叫万能模块

2.3 script[脚本模块]

  1. 官方连接
    https://docs.ansible.com/ansible/latest/modules/script_module.html#script-module

  2. 常用参数

free_form	[必须]表示执行command模块时,必须要有linux合法命令信息,如ls
chdir		在执行莫个命令前,先切换目录
creates		判断一个文件是否存在,如果已经存在了,后面的命令就不会执行
removes		判断一个文件是否存在,如果不存在,后面的命令就不会执行
  1. 举例

  • 先查看脚本

[root@xxxx ~]# cat /server/scripts/mk.sh
#!/bin/sh
mkdir -p /root/abc/def
touch  /root/abc/123.txt
ls -lh /root/abc/*
  • 在调用这个脚本远程执行

[root@xxxx ~]# ansible 172.16.1.7 -m script -a "/server/scripts/mk.sh"
172.16.1.7 | SUCCESS => {
"changed": true, 
"rc": 0, 
"stderr": "Shared connection to 172.16.1.7 closed.\r\n", 
"stdout": "-rw-r--r-- 1 root root    0 6月  18 17:05 /root/abc/123.txt\r\n\r\n/root/abc/def:\r\n总用量 0\r\n", 
"stdout_lines": [
"-rw-r--r-- 1 root root    0 6月  18 17:05 /root/abc/123.txt", 
"", 
"/root/abc/def:", 
"总用量 0"
]
}

3 文件类常用模块

3.1 copy[复制模块]

  1. 官方链接:
    https://docs.ansible.com/ansible/latest/modules/copy_module.html#copy-module

  2. 常用参数

backup	对数据信息进行备份
src		定义要推送数据信息
dest	[必须]定义将数据推送到远程主机什么目录中
owner	设置复制后的文件属主权限
group	设置复制后的文件属组权限
mode	设置复制后的文件权限(600 755)
  1. 举例

  • backup参数

ansible 172.16.1.41 -m copy -a "src=/tmp/01.txt dest=/tmp/ backup=yes"
  • src,dest参数

ansible 172.16.1.41 -m copy -a "src=/tmp/01.txt dest=/tmp/"

3.2 file[文件操作模块]

  1. 官方链接
    https://docs.ansible.com/ansible/latest/modules/file_module.html#file-module

  2. 常见参数

src		定义要推送数据信息
dest	[必须]定义将数据推送到远程主机什么目录中
owner	设置文件属主权限
group	设置文件属组权限
mode	设置文件权限(600 755)
state	用于指定创建目录或文件
  1. 举例

  • 权限参数

ansible 172.16.1.7 -m file -a "dest=/tmp/01.txt owner=oldboy group=oldboy mode=600"
  • state创建文件

ansible 172.16.1.41 -m file -a "dest=/tmp/02.txt state=touch"
  • state创建目录

ansible 172.16.1.41 -m file -a "dest=/tmp/01dir state=directory"

4 包管理.系统服务管理.定时任务模块

4.1 yum[包管理模块]

  1. 官方链接
    https://docs.ansible.com/ansible/latest/modules/yum_module.html#yum-module

  2. 常用参数

name	[必须]执行要安装软件的名称,以及软件的版本
state	installed安装  absent(卸载)
list	指定软件名称,查看软件是否可以安装,以及是否安装过
  1. 举例

ansible 172.16.1.41 -m yum -a "name=iftop state=installed"
ansible 172.16.1.41 -m yum -a "name=iftop state=absent"
ansible 172.16.1.41 -m yum -a "list=iftop"

4.2 service[系统服务管理模块]

  1. 官方链接
    https://docs.ansible.com/ansible/latest/modules/service_module.html#service-module

  2. 常用参数

name	[必须]指定要管理的服务名称(管理的服务一定在chkconfig中可以看到)
state	stopped started restarted reloaded
enabled	yes表示服务开机自启动 no表示服务开机不要自动启动
  1. 举例

ansible 172.16.1.41 -m service -a "name=crond state=started enabled=yes"

4.3 cron[定时任务模块]

  1. 官方链接
    https://docs.ansible.com/ansible/latest/modules/cron_module.html#cron-module

  2. 常用参数

minute	分,写法同系统定时任务,如[0-59] [*] [*/n]   
hour	时,写法同上
day		日,写法同上
month	月,写法同上
weekday	周,写法同上
job		执行命令,如job='/bin/sh /server/scripts/test.sh &>/dev/null'
  1. 举例

  • 添加定时任务

ansible 172.16.1.41 -m cron -a "minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null'"
ansible 172.16.1.41 -m cron -a "name=oldboy02 minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null'"
  • 删除定时任务

ansible 172.16.1.41 -m cron -a "name=oldboy02 minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null' state=absent"
ansible 172.16.1.41 -m cron -a "name=oldboy01 state=absent"
  • 注释定时任务

ansible 172.16.1.41 -m cron -a "name=oldboy01 minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null' disabled=yes"a
ansible 172.16.1.41 -m cron -a "name=oldboy01 job='/bin/sh /server/scripts/test.sh &>/dev/n

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

洞察:OpenAI 全球宕机,企业应该如何应对 LLM 的不稳定性?

北京时间12月12日上午&#xff0c;OpenAI证实其聊天机器人ChatGPT正经历全球范围的宕机&#xff0c;ChatGPT、Sora及API受到影响。 OpenAI 更新事故报告称&#xff0c;已查明宕机原因&#xff0c;正努力以最快速度恢复正常服务&#xff0c;并对宕机表示歉意。 此次 OpenAI 故障…

STM32F407ZGT6-UCOSIII笔记2:UCOSIII任务创建实验-Printf 函数卡住 UCOSIII 系统问题解决

今日简单编写熟悉一下UCOSIII系统的任务创建代码&#xff0c;理解一下OS系统&#xff1a; 并发现以及解决了 Printf 函数卡住 UCOSIII 系统问题解决 文章提供测试代码讲解、完整工程下载、测试效果图 目录 文件结构解释&#xff1a; 任务函数文件&#xff1a; 目前各个文件任…

CUDA从入门到精通(三)——CUDA编程示例

CUDA 编程简介 CUDA&#xff08;Compute Unified Device Architecture&#xff09;是由 NVIDIA 提供的一种并行计算平台和编程模型。它允许开发者利用 NVIDIA GPU 的并行计算能力&#xff0c;编写可以在 GPU 上高效运行的代码&#xff0c;从而加速计算密集型任务。 CUDA 通过…

【十进制整数转换为其他进制数——短除形式的贪心算法】

之前写过一篇用贪心算法计算十进制转换二进制的方法&#xff0c;详见&#xff1a;用贪心算法计算十进制数转二进制数&#xff08;整数部分&#xff09;_短除法求二进制-CSDN博客 经过一段时间的研究&#xff0c;本人又发现两个规律&#xff1a; 1、不仅仅十进制整数转二进制可…

舵机SG90详解

舵机&#xff0c;也叫伺服电机&#xff0c;在嵌入式开发中&#xff0c;舵机作为一种常见的运动控制组件&#xff0c;具有广泛的应用。其中&#xff0c;SG90 舵机以其高效、稳定的性能特点&#xff0c;成为了许多工程师和爱好者的首选&#xff0c;无论是航模、云台、机器人、智能…

如何为IntelliJ IDEA配置JVM参数

在使用IntelliJ IDEA进行Java开发时&#xff0c;合理配置JVM参数对于优化项目性能和资源管理至关重要。IntelliJ IDEA提供了两种方便的方式来设置JVM参数&#xff0c;以确保你的应用程序能够在最佳状态下运行。本文将详细介绍这两种方法&#xff1a;通过工具栏编辑配置和通过服…

跌倒数据集,5345张图片, 使用yolo,coco json,voc xml格式进行标注,平均识别率99.5%以上

跌倒数据集&#xff0c;5345张图片&#xff0c; 使用yolo&#xff0c;coco json&#xff0c;voc xml格式进行标注&#xff0c;平均识别率99.5%以上 &#xff0c;可用于某些场景下识别人是否跌倒或摔倒并进行告警。 数据集分割 训练组99&#xff05; 5313图片 有效集0&am…

nods.js之nrm安装及使用

nods.js之nrm安装及使用 一、简介二、安装 nrm与使用三、报错解决 一、简介 nrm 是 Node.js 的一个工具&#xff0c;用于管理和切换 npm 源&#xff08;Registry&#xff09;。它使得在不同的 npm 镜像源之间切换变得非常容易&#xff0c;尤其对于那些经常因为网络问题或速度原…

selenium自动化测试基础知识

目录 一、概念知识 (一)三大核心组件 (二)Selenium 自动化测试的工作原理 (三)Selenium 支持的操作 (四)Selenium 自动化测试的优点 (五)Selenium 自动化测试的缺点 (六)Selenium 自动化测试的应用场景 总结 二、实操例子 使用前提--安装步骤 注意事项 (一)浏览器的…

Cisco Packet Tarcer配置计网实验笔记

文章目录 概要整体架构流程网络设备互连基础拓扑图拓扑说明配置步骤 RIP/OSPF混合路由拓扑图拓扑说明配置步骤 BGP协议拓扑图拓扑说明配置步骤 ACL访问控制拓扑图拓扑说明配置步骤 HSRP冗余网关拓扑图拓扑说明配置步骤 小结 概要 一些环境配置笔记 整体架构流程 网络设备互连…

RNN LSTM Seq2Seq Attention

非端到端&#xff1a; data -》 cleaning -》 feature Engining &#xff08;70%-80%工作 设计特征&#xff09;-》 分类器 -》预测 端到端 End-to-End&#xff1a; data -》 cleaning -》Deep learning&#xff08;表示学习&#xff0c;从数据中学习特征&#xff09; -》…

【AI日记】24.12.17 kaggle 比赛 2-6 | 把做饭看成一种游戏 | 咖喱牛肉

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 工作 参加&#xff1a;kaggle 比赛 Regression with an Insurance Dataset时间&#xff1a;9 小时睡得好很重要 读书 书名&#xff1a;富兰克林自传时间&#xff1a;0.5 小时阅读原因&#xff1a;100 美元纸…

电脑为什么会提示“msvcr120.dll缺失”?“找不到msvcr120.dll文件”要怎么解决?

电脑故障排查指南&#xff1a;揭秘“msvcr120.dll缺失”的真相与解决方案 在软件开发与日常维护的广阔天地里&#xff0c;遇到系统报错或文件缺失的情况可谓家常便饭。今天&#xff0c;我将带领大家深入探讨一个常见的系统提示——“msvcr120.dll缺失”&#xff0c;并揭秘其背…

Kotlin复习

一、Kotlin类型 1.整数 2.浮点 显示转换&#xff1a; 所有数字类型都支持转换为其他类型&#xff0c;但是转换前会检测长度。 toByte(): Byte toShort(): Short toInt(): Int toLong(): Long toFloat(): Float toDouble(): Double 不同进制的数字表示方法&#xff08;为了提高…

【BUG】记一次context canceled的报错

文章目录 案例分析gorm源码解读gin context 生命周期context什么时候cancel的什么时候context会被动cancel掉呢&#xff1f; 野生协程如何处理 案例分析 报错信息 {"L":"ERROR","T":"2024-12-17T11:11:33.0050800","file"…

召回系统介绍

一、以Lucene为例介绍召回系统 1、倒排检索 Lucene的倒排索引由 Term Index -> TermDictionary -> Posting List 三层组成&#xff0c;倒排检索实际上就是通过分词Term查询到倒排拉链&#xff0c;然后对所有拉链进行合并。 Term-> Posting List&#xff0c;可以直接…

Ubuntu22.04系统下MVS运行海康威视工业相机

之前的开发环境是Ubuntu16.04&#xff0c;最近因项目需求换到了Ubuntu22.04系统&#xff0c;安装了ROS2-humble&#xff0c;重新记录下开发过程。 Ubuntu16.04系统可参考&#xff1a; VMware虚拟机中Ubuntu16.04系统下通过MVS运行海康威视工业相机 Linux环境中对海康威视工业相…

慧知开源充电桩平台 - OCPP充电桩协议越南充电平台:多语种支持、多元支付、本地化策略

越南充电新体验&#xff1a;多语种支持&#xff0c;便捷支付&#xff01; 助力充电桩运营本土化落地&#xff0c;为越南市场提供定制化解决方案 随着全球电动汽车市场的迅猛发展&#xff0c;越南作为东南亚新兴的汽车市场&#xff0c;对电动汽车充电基础设施的需求也在急剧增…

基于Clinical BERT的医疗知识图谱自动化构建方法,双层对比框架

基于Clinical BERT的医疗知识图谱自动化构建方法&#xff0c;双层对比框架 论文大纲理解1. 确认目标2. 目标-手段分析3. 实现步骤4. 金手指分析 全流程核心模式核心模式提取压缩后的系统描述核心创新点 数据分析第一步&#xff1a;数据收集第二步&#xff1a;规律挖掘第三步&am…

华为ensp--BGP路径选择-Preferred Value

学习新思想&#xff0c;争做新青年。今天学习的是BGP路径选择-Preferred Value 实验目的 理解BGP路由信息首选值&#xff08;Preferred Value&#xff09;的作用 掌握修改Preferred Value属性的方法 掌握通过修改Preferred Value属性来实现流量分担的方法 实验拓扑 实验要求…