如何建立多Master的saltstack master配置环境

king 的BLOG
用户名:king
文章数:14
评论数:20
访问量:24669
注册日期:
阅读量:5863
阅读量:12276
阅读量:417716
阅读量:1105487
51CTO推荐博文
&&&&最近,和暴雪中国区带技术的一个人聊了不少,他们在测试salt,不过目前用的是puppet,服务器数量也快要1000多台。那为什么他们会去考虑测试salt、另谋他法呢,肯定是有salt一定优势的。&&&&其实我对puppet的名声早已经耳濡目染了1年多了,虽然还没去研究过。。。。也知道有同类开源产品saltstack的存在。不过,puppet是由ruby写的,saltstack则是由python编写的,综合下来就选择了研究salt。&&&&国内的博客真是各种抄袭、各种搬啊。。。真找不到几篇有用的文档和资料。还是老样子,官网+qq群共享的资料,双管齐下吧。(还好salt初体验给我的感觉没rabbitmq那么痛苦....看了将近2天的官方英文文档,差不多对salt的工作模式有了个初步的了解)不多说,直接先进入我们今天的主题,salt安装篇:一)ubuntu 安装增加仓库sudo&add-apt-repository&ppa:saltstack/salt& & 如果提示:add-apt-repository:&command&not&found?& & 就输入:sudo&apt-get&install&python-software-properties注意:自ubuntu12.10(Raring Ringtail),add-apt-repository可以在software-properies-common包中找到,并且也是base install的一部分。2. 更新apt-get&&&&增加好仓库后,我们需要更新包管理数据库。sudo&apt-get&update3. aptget安装salt-master,salt-minion,salt-syndicsudo&apt-get&install&salt-master&&&&&&&#必须sudo&apt-get&install&salt-minion&&&&&&&#必须sudo&apt-get&install&salt-syndic&&&&&&&#分布式二)centos安装安装epel源#&cd&/usr/local/src/&
#&wget&/fedora-epel/6/x86_64/epel-release-6-8.noarch.rpm
#&rpm&-ivh&epel-release-6-8.noarch.rpm2. &安装python-jinjia2#&wget&http://apt.sw.be/redhat/el6/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
#&rpm&-Uvh&rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm3. &安装依赖包#&yum&install&python-jinja24. &安装saltstack-master,saltstack-minion#&yum&-y&install&salt-master&enablerepr=epel-testing#&yum&-y&install&salt-minion&enablerepr=epel-testing三)配置minion端尽管在/etc/salt/minion配置文件中,你会看到许多配置选项,但是如果单单只要启动master还是很简单的。默认地,salt-minion会去默认的连接"salt"的DNS名,如果minion能去成功连接,那么没有其他配置需要更改;否则,我们需要手动指定一个master的ip地址。-&#master:&salt
+&master:&10.0.0.1&&&&&&&&&&&&&&&&&&&&&&&&&&&#注:冒号后面需要有个空格,否则会报错。这和salt专门的语言有关,一般是master的ip
+&id:&salt-minion1.org&&&&&&&&&&&&&&&&&&&&&&&#同样需要注意冒号后面的空格,不过这不是必须的,代表这台服务器的别名2. &master端& & &salt-master默认是监听在端口以及全部网段。我们需要在/etc/salt/master中指定特定的ip。&&&&-&#interface:&0.0.0.0
&&&&+&interface:&10.0.0.1&&&&&&&&&&&&&&&&&&&&&&&&&#同样要注意空格问题,这里的ip通常是master自己的内网或外网ip3. 启动saltservice&salt-master&start
service&salt-minion&start4. 如何troubleshooting&&&&最简单的troubleshooting方法就是在启动对应的deamon后,设置log level,代码如下:salt-master&--log-level=debug5. Key Managerment[root@&salt]#&salt-key&-L
Accepted&Keys:
Unaccepted&Keys:
192.168.139.128-centos
192.168.139.130-ubuntu
Rejected&Keys:&&&&你可以看到,新增的2台minion端的key。但是,是unaccepted的,我们需要接受相关keys(其实也可以在/etc/salt/master里面设置auto_accept的,这要看你们自己的情况了~)&salt-key&-A&&&&现在,我们再观察一下:[root@&salt]#&salt-key&-L
Accepted&Keys:
192.168.139.128-centos
192.168.139.130-ubuntu
Unaccepted&Keys:
Rejected&Keys:6. 发送命令测试&&&&这里,我们可以用一个最简单的内建指令test.ping[root@&salt]#&salt&'*'&test.ping
192.168.139.128-centos:
192.168.139.130-ubuntu:
&&&&True四) iptables&&&&salt的iptables只需要在master做策略就行了,不同的OS可能添加方式有所不同。&&&&这里有个master端的例子(需要格外注意loopback那条):&#&Allow&Minions&from&these&networks
-I&INPUT&-s&10.1.2.0/24&-p&tcp&-m&multiport&--dports&&-j&ACCEPT
-I&INPUT&-s&10.1.3.0/24&-p&tcp&-m&multiport&--dports&&-j&ACCEPT
#&Allow&Salt&to&communicate&with&Master&on&the&loopback&interface
-A&INPUT&-i&lo&-p&tcp&-m&multiport&--dports&&-j&ACCEPT
#&Reject&everything&else
-A&INPUT&-p&tcp&-m&multiport&--dports&&-j&REJECT& & 注意:如果是ubuntu的话,我们需要到/etc/ufw/applications.d/salt.ufw里加一条:&&&&ufw&allow&salt&&&&接下来我们可以用nc,来检测下联通性了。(如果没有,那就yum install nc一下)&&&&[root@&~]#&nc&-v&-z&192.168.139.131&4505
Connection&to&192.168.139.131&4505&port&[tcp/*]&succeeded!
[root@&~]#&nc&-v&-z&192.168.139.131&4506
Connection&to&192.168.139.131&4506&port&[tcp/*]&succeeded!&&&&到这里基础的安装篇已经完成了,之后是WebUI的整合以及简单的httpd自动化yum配置安装、源码安装等。之后更新不会很快,因为我也要着手要学python...salt最有魅力的那块,莫过于sls了。本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)万越天 的BLOG
用户名:万越天
文章数:31
评论数:14
访问量:6325
注册日期:
阅读量:5863
阅读量:12276
阅读量:417716
阅读量:1105487
51CTO推荐博文
1、准备基础环境[root@linux-node1&base]#&vim&/etc/salt/master
file_roots:
&&&&-&/srv/salt/base
&&&&-&/srv/salt/test
&&&&-&/srv/salt/prod#注:top.sls必须放在base环境下(即/srv/salt/base目录下)[root@linux-node1&base]#&/etc/init.d/salt-master&restart
#重启Master配置生效[root@linux-node1&base]#&mkdir&/srv/salt/{base,test,prod}&-p
#创建目录[root@linux-node1&base]#&cd&/srv/salt/
[root@linux-node1&base]#&mv&apache.sls&top.sls&base/[root@linux-node1&base]#&cd&/srv/salt/base/
[root@linux-node1&base]#&mkdir&files
[root@linux-node1&base]#&cp&/etc/resolv.conf&/srv/salt/base/files/2、两种执行方法1)直接执行[root@linux-node1&base]#salt&'*'&state.sls&dns2)通过top.sls执行高级状态[root@linux-node1&base]#&vim&/srv/salt/base/top.sls
&&&&-&dns[root@linux-node1&base]#&salt&'*'&state.highstate本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)查看:1427|回复:5
Saltstack安装记录
&&在网上看人家安装saltstack总是那么简单,寂寞难耐的我也跟着凑了一下热闹,然后就试着安装,结果。。。。。。不说了,看文档吧,我系统环境是centos6.x/rhel6.x
&&首先,安装epel源
&&rpm -uvh epel-release-6-8.noarch.rpm
Epel源安装上去了,然后直接装下salt-master试试吧!
直接报了一个路径错误,然后修改一下epel源的路径
将epel源中的baseurl取消注释,然后把mirrorlist给注释掉
然后再次安装,注意安装过程需要联网的
(34.28 KB)
提示少了连个依赖包。
因为epel源把python-jinja2这个包给移除了,所以需要换一个源
rpm -Uvh rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
然后再次安装python-jinja2
(34.28 KB)
再次报错,提示依赖python-babel包
因为源里边没有,所以我这边是找了个rpm包安装上去的
rpm -Uvh python-babel-0.9.4-5.1.el6.noarch.rpm
然后在安装python-jinja2
yum -y install python-jinja2
然后等待安装完毕
安装完毕之后,再次安装salt salt-master
yum -y install salt salt-master
然后等待安装完毕就行了!
然后启动服务吧少年
(16.45 KB)
服务器主控端这一段装salt-master
受控端安装salt-minion
然后启动服务,开启批量管理吧! 嘎嘎
在这里我第一次安装的时候提示少了另外一个包,
yum -y install m2crypto
第二次我安装的时候并不是新环境,所以没有少这个包!
图片插入错了,哎呀,搞反了
(40.17 KB)
(34.28 KB)
(16.45 KB)
我一条yum就成了,你为何搞了辣么多?
Good Good study,Day Day up!!!
引用:原帖由 yfshare 于
22:15 发表
我一条yum就成了,你为何搞了辣么多?
我怎么知道,我是centos6.4的,估计跟系统版本有问题吧,我也感觉特别无语
引用:原帖由 yfshare 于
22:15 发表
我一条yum就成了,你为何搞了辣么多?
看官网的也是一条就成了,谁知道自己以用就成这样了
引用:原帖由 斗月 于
10:14 发表
看官网的也是一条就成了,谁知道自己以用就成这样了
Good Good study,Day Day up!!!SaltStack 入门到精通第二篇:Salt-master配置文件详解 - Linux服务器 - 次元立方网 - 电脑知识与技术互动交流平台
SaltStack 入门到精通第二篇:Salt-master配置文件详解
转自(coocla):http://blog.coocla.org/301.html
原本想要重新翻译salt-master的配置文件,但发现作者的这篇博文说得非常好,也挺清楚,所以有关salt-mater的配置,喜欢的朋友可以参考上面的博文
-----------------------------------------------------------------------------------------------------------------------------
#主配置 /etc/salt/master
默认值:0.0.0.0(所有的网络地址接口)
绑定到本地的某个网络地址接口
interface:&192.168.0.1
publish_port
默认值:4505
设置master与minion的认证通信端口
publish_port:&4505
默认值:root
运行salt进程的用户&
user:&root
max_open_files
默认值:100000
每一个minion连接到master,至少要使用一个文件描述符,如果足够多的minion连接到master上,你将会从控制台上看到salt-master crashes:
Too many open files (tcp_listener.cpp:335)
Aborted (core dumped)
默认值这个值取决于ulimit -Hn的值,即系统的对打开文件描述符的硬限制
如果你希望重新设置改值或者取消设置,记住这个值不能超过硬限制,提高硬限制取决于你的操作系统或分配,一个好的方法是internet找到对应操作系统的硬限制设置,比如这样搜索:
raise max open files hard limit debian&
max_open_files:&100000
worker_threads
启动用来接收或应答minion的线程数。如果你有很多minion,而且minion延迟你的应答,你可以适度的提高该值.
在点对点的系统环境中使用时,该值不要被设置为3以下,但是可以将其设置为1
worker_threads:&5
默认值:4506
这个端口是master用来发送命令或者接收minions的命令执行返回信息&
ret_port:&4506
默认值:/var/run/salt-master.pid
指定master的pid文件位置&
pidfile:&/var/run/salt-master.pid
指定该目录为salt运行的根目录,改变它可以使salt从另外一个目录开始运行,好比chroot&
root_dir:&/
默认值:/etc/salt/pki
这个目录是用来存放pki认证秘钥&
pki_dir:&/etc/salt/pki
默认值:/var/cache/salt
这个目录是用来存放缓存信息,特别是salt工作执行的命令信息&
cachedir:&/var/cache/salt
默认值:24
设置保持老的工作信息的过期时间,单位小时
默认值:True
设置master维护的工作缓存,这是一个很好的功能,当你的Minons超过5000台时,他将很好的承担这个大的架构,关闭这个选项,之前的工作执行以及工作系统将无法被利用,一般不推荐关掉改选项,开启改选项将会是很明智的,他将使master获得更快的IO系统
ext_job_cache
对所有的minions使用指定的默认值returner,当使用了这个参数来指定一个returner并且配置正确,minions将会一直将返回的数据返回到returner,这也会默认值禁用master的本地缓存&
ext_job_cache:&redis
minion_data_cache
默认值:True
minion data cache是关于minion信息存储在master上的参数,这些信息主要是pillar 和 grains数据.这些数据被缓存在cachedir定义的目录下的minion目录下以minion名为名的目录下并且预先确定哪些minions将从执行回复&
minion_cache_dir:&True
enforce_mine_cache
默认值:False
默认情况下当关闭了minion_data_cache,mine将会停止工作,因为mine是基于缓存数据,通过启用这个选项,我们将会显示的开启对于mine系统的缓存功能&
enforce_mine_cache:&False
默认值:/tmp/salt-unix
指定unix socket主进程通信的socket创建路径
master的安全配置
默认值:False
open_mode是一个危险的安全特性,当master遇到pki认证系统,秘钥混淆和身份验证失效时,打开open_mode,master将会接受所有的身份验证。这将会清理掉pki秘钥接受的minions。通常情况下open_mode不应该被打开,它只适用于短时间内清理pki keys,若要打开它,可将值调整为True
open_mode:&False
auto_accept
默认值:False
开启auto_accept。这个设置将会使master自动接受所有发送公钥的minions
auto_accept:&False
autosign_file
默认值:/etc/salt/autosign.conf
如果autosign_file的值被指定,那么autosign_file将会通过该输入允许所有的匹配项,首先会搜索字符串进行匹配,然后通过正则表达式进行匹配。这是不安全的
autosign_file:&/etc/salt/autosign.conf
client_acl
默认值:{}
开启对系统上非root的系统用户在master上执行特殊的模块,这些模块名可以使用正则表达式进行表示
client_acl:
&&&&&&&&-&test.ping
&&&&&&&&-&pkg.*
client_acl_blacklist
默认值:{}
黑名单用户或模块
这个例子表示所有非sudo用户以及root都无法通过cmd这个模块执行命令,默认情况改配置是完全禁用的
client_acl_blacklist:
&&&&users:
&&&&&&&&-&root
&&&&&&&&-&'^(?!sudo_).*$'&&&&#&all&non&sudo&users
&&&&modules:
&&&&&&&&-&cmd
external_auth
默认值:{}
salt的认证模块采用外部的认证系统用来做认证和验证用户在salt系统中的访问区域
external_auth:
&&&&&&&&fred:
&&&&&&&&&&&&-&test.*
token_expire
默认:43200
新令牌生成的时间间隔,单位秒,默认是12小时
token_expire:&43200
默认值:False
允许minions推送文件到master上,这个选项默认是禁用的,出于安全考虑
file_recv:&False
#######################
master模块管理
runner_dirs
默认值:[] 设置搜索runner模块的额外路径
runner_dirs:&[]
cython_enable
默认值:False
设置为true来开启对cython模块的编译
cython_enable:&False
master状态系统设置
state_verbose
默认:False
state_verbose允许从minions返回更多详细的信息,通常清空下只返回失败或者已经更改,但是将state_verbose设置为True,将会返回所有的状态检查
state_verbose:&True
state_output
默认值:full
state_output的设置将会改变信息输出的格式,当被设置为&full&时,将全部的输出一行一行的显示输出;当被设置为&terse&时,将会被缩短为一行进行输出;当被设置为&mixed&时,输出样式将会是简洁的,除非状态失败,这种情况下将会全部输出;当被设置为&change&时,输出将会完全输出除非状态没有改变
state_output:&full
默认值:top.sls
状态系统使用一个入口文件告诉minions在什么环境下使用什么模块,这个状态入口文件被定义在基础环境的相对根路径下
state_top:&top.sls
external_nodes
默认值:None
这个外部节点参数允许salt来收集一些数据,通常被放置在一个入口文件或外部节点控制器.外部节点的选择是可执行的,将会返回ENC数据,记住如果两者都启用的话salt会将外部节点和入口文件的结果进行综合汇总。
external_nodes:&cobbler-ext-nodes
默认值:yaml_jinja
使用渲染器用来渲染minions的状态数据
renderer:&yaml_jinja
默认值:False
设置一个全局的failhard表示,当单个的状态执行失败后,将会通知所有的状态停止运行状态
failhard:&False
默认值:False
如果真的要作出改变或者仅仅通知将要执行什么改变时设置所有的状态调用为test
test: False
#######################
master文件服务器设置
fileserver_backend
fileserver_backend:
&&&&-&roots
salt支持模块化的后端文件系统服务器,它允许salt通过第三方的系统来管理收集文件并提供给minions使用,可以配置多个后端文件系统,这里支持gitfs、hgfs、roots、s3fs文件调用的搜索顺序按照后台文件系统的配置顺序来搜索,默认的设置只开启了标准的后端服务器roots,具体的根选项配置通过file_roots参数设置
fileserver_backend:
&&&&-&roots
&&&&-&gitfs
file_roots
&&&&-&/srv/salt
salt运行一个轻量级的文件服务器通过ZeroMQ对minions进行文件传输,因此这个文件服务器是构造在master的守护进程中,并且不需要依赖于专用的端口
文件服务器的工作环境传递给master,每一个环境可以有多个跟目录,但是相同环境下多个文件的子目录不能相同,否则下载的文件将不能被可靠的保证,一个基础环境依赖于主的入口文件,如:&
file_roots:
&&&&&&&&-&/srv/salt
&&&&&&&&-&/srv/salt/dev/services
&&&&&&&&-&/srv/salt/dev/states
&&&&&&&&-&/srv/salt/prod/services
&&&&&&&&-&/srv/salt/prod/states
默认值:md5
hash_type是用来当发现在master上需要对一个文件进行hash时的hash使用的算法,默认是md5.但是它也支持sha1,sha224,shar256,shar384,shar512&
hash_type:&md5
file_buffer_size
默认值:1048576
文件服务器的缓存区大小&
file_buffer_size:&1048576
pillar配置
pillar_roots
&&&&-&/srv/pillar
设置不同的环境对应的存放pillar数据的目录,这个配置和file_roots参数配置一样&
pillar_roots:
&&&&&&&&-&/srv/pillar
&&&&&&&&-&/srv/pillar/dev
&&&&&&&&-&/srv/pillar/prod
ext_pillar
当进行pillar数据收集时,这个ext_pillar参数允许调用任意数量的外部pillar接口,这个配置是基于ext_pillar函数,你可以从这个找到这个函数/saltstack/salt/blob/develop/salt/pillar
默认情况下,这个ext_pillar接口没有配置运行
默认值:None&
ext_pillar:
&&&&-&hiera:&/etc/hiera.yaml
&&&&-&cmd_yaml:&cat&/etc/salt/yaml
&&&&-&reclass:
&&&&&&&&inventory_base_uri:&/etc/reclass
从这里可以查到pillar的一些额外细节
syndic server配置
syncdic是salt master用来通过从整体架构中高于自己层级的master或者syndic接收命令传递给minions的中间角色。使用syndic非常简单,如果这个master在整体架构中,他的下级存在syndic server,那么需要将master的配置文件中的&order_master&值设置为True,如果这个master还需要运行一个syndic进程,扮演另外一个角色,那么需要设置主master server的信息(上一级master)
千万别忘记了,这将意味着它将与其他master共享它的minion的id和pki_dir
order_masters
默认值:False
当额外的数据需要发送和传递,并且这个master控制的minions是被低等级的master或syndic直接管理下,那么&order_masters&这个值必须得设置为True&
order_master:&False
syndic_master
默认值:None
如果这个master运行的salt-syndic连接到了一个更高层级的master,那么这个参数需要配置成连接到的这个高层级的master的地址&
syndic_master:&masterofmasters
syndic_master_port
默认值:4506
如果这个master运行的salt-syndic连接到了一个更高层级的master,那么这个参数需要配置成连接到的这个高层级master的监听端口&
syndic_master_port:&4506
syndic_log_file
默认值:syndic.log
为syndic进程指定日志文件&
syndic_log_file:&salt-syndic.log
syndic_pidfile
默认值:salt-syndic.pid
为syndic进程指定pid文件&
syndic_pidfile:&syndic.pid
Peer Publish设置
salt minions可以向其他minions发送命令,但是仅仅在minion允许的情况下。默认情况下&Peer Publication&是关闭的,当需要开启的时候,需要开启对应的minion和对应的命令,这样可以允许根据个人的minions安全的划分出命令
默认值:{}
这个配置使用正则表达式去匹配minions并且是一个正则表达式列表函数,下面这个例子将允许名为的minion认证通过后执行test和pkg模块中的函数&
&&&&&&&&-&test.*
&&&&&&&&-&pkg.*
这将允许所有的minion执行所有的命令&
&&&&&&&&-&.*
这样的配置是极不推荐的,因为任何人得到架构中的任何一个minion即可拥有所有的minions,这是不安全的
默认值:{}
peer_run参数是用来打开runners在master所允许的minions上,peer_run的配置匹配格式和peer参数的配置一样
下面这个例子允许的minion执行manage.up runner&
&&&&&&&&-&manage.up
NODE GROUPS
默认值:{}
minions允许通过node groups来分成多个逻辑组,每个组由一个组名和复合模式组成&
nodegroups:
&&&&group1:&'L@,,&or&bl*.'
&&&&group2:&'G@os:Debian&and&'
Master日志设置
默认值:/var/log/salt/master
master的日志可以发送到一个普通文件,本地路径名或者网络位置,更多详情
log_file:&/var/log/salt/master
log_file:&file:///dev/log
log_file:&udp://loghost:10514
默认值:warning
按照日志级别发送信息到控制台,更多详情&
log_level:&warning
log_level_logfile
默认值:warning
按照日志级别发送信息到日志文件,更多详情&
log_level_logfile:&warning
log_datefmt
默认值:%H:%M:%S
发送到控制台信息所用的日期时间格式,更多详情&
log_datefmt:&'%H:%M:%S'
log_datefmt_logfile
默认值: %Y-%m-%d %H:%M:%S
发送到日志文件信息所用的日期时间格式,更多详情&
log_datefmt_logfile:&'%Y-%m-%d&%H:%M:%S'
log_fmt_console
默认值: [%(levelname)-8s] %(message)s
控制台日志信息格式,更多详情&
log_fmt_console:&'[%(levelname)-8s]&%(message)s'
log_fmt_logfile
默认值: %(asctime)s,%(msecs)03.0f [%(name)-17s][%(levelname)-8s] %(message)s
%(asctime)s: 16:49:45
%(msecs)03.0f:当前时间的毫秒部分
%(name):日志记录调用器的名字
%(levelname):日志记录级别
%(message)s:日志详细信息
日志文件信息格式,更多详情&
log_fmt_logfile:&'%(asctime)s,%(msecs)03.0f&[%(name)-17s][%(levelname)-8s]&%(message)s'
log_granular_levels
默认值:{}
这可以更加具体的控制日志记录级别,更多详情
Include 配置
default_include
默认值:master.d/*.conf
master可以从其他文件读取配置,默认情况下master将自动的将master.d/*.conf中的配置读取出来并应用,其中master.d目录是相对存在于主配置文件所在的目录
默认值:not defined
master可以包含其他文件中的配置,要启用此功能,通过此参数定义路径或文件,此路径可以是相对的也可以是绝对的,相对的,会被看作相对于主配置文件所在的目录,路径中还可以使用类似于shell风格的通配符,如果没有文件匹配的路径传递给此选项,那么master将会在日志中记录一条警告的消息&
#&Include&files&from&a&master.d&directory&in&the&same
#&directory&as&the&master&config&file
include:&master.d/*
#&Include&a&single&extra&file&into&the&configuration
include:&/etc/roles/webserver
#&Include&several&files&and&the&master.d&directory
&&&&-&extra_config
&&&&-&master.d/*
&&&&-&/etc/roles/webserver
参考文档:/ref/configuration/master.html
延伸阅读:
1 前言Ansible是自动化运维的工具,基于Python开发,...
本教程为 李华明 编著的iOS-Cocos2d游戏开发系列教程:教程涵盖关于i......
专题主要学习DirectX的初级编程入门学习,对Directx11的入门及初学者有......
&面向对象的JavaScript&这一说法多少有些冗余,因为JavaScript 语言本......
Windows7系统专题 无论是升级操作系统、资料备份、加强资料的安全及管......}

我要回帖

更多关于 saltstack 双master 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信