位置: 编程技术 - 正文

Ubuntu系统下自动化部署工具puppet的安装和使用教程(ubuntu系统自动获取ip)

编辑:rootadmin

推荐整理分享Ubuntu系统下自动化部署工具puppet的安装和使用教程(ubuntu系统自动获取ip),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:ubuntu系统自动运行脚本,ubuntu系统自动重启,ubuntu系统自动锁屏,ubuntu系统自动重启,ubuntu系统自动删除文件夹,ubuntu系统自动获取ip,ubuntu系统自动获取ip,ubuntu系统自动获取ip,内容如对您有帮助,希望把文章链接给更多的朋友!

大家好,本教程将学习如何在 ubuntu . 上面安装 puppet,它可以用来管理你的服务器基础环境。puppet 是由 puppet 实验室Puppet Labs开发并维护的一款开源的配置管理软件,它能够帮我们自动化供给、配置和管理服务器的基础环境。不管我们管理的是几个服务器还是数以千计的计算机组成的业务报表体系,puppet 都能够使管理员从繁琐的手动配置调整中解放出来,腾出时间和精力去提系统的升整体效率。它能够确保所有自动化流程作业的一致性、可靠性以及稳定性。它让管理员和开发者更紧密的联系在一起,使开发者更容易产出付出设计良好、简洁清晰的代码。puppet 提供了配置管理和数据中心自动化的两个解决方案。这两个解决方案分别是 puppet 开源版 和 puppet 企业版。puppet 开源版以 Apache 2.0 许可证发布,它是一个非常灵活、可定制的解决方案,设置初衷是帮助管理员去完成那些重复性操作工作。pupprt 企业版是一个全平台复杂 IT 环境下的成熟解决方案,它除了拥有开源版本所有优势以外还有移动端 apps、只有商业版才有的加强支持,以及模块化和集成管理等。Puppet 使用 SSL 证书来认证主控服务器与代理节点之间的通信。

本教程将要介绍如何在运行 ubuntu . 的主控服务器和代理节点上面安装开源版的 puppet。在这里,我们用一台服务器做主控服务器master,管理和控制剩余的当作 puppet 代理节点agent node的服务器,这些代理节点将依据主控服务器来进行配置。在 ubuntu . 只需要简单的几步就能安装配置好 puppet,用它来管理我们的服务器基础环境非常的方便。(LCTT 译注:puppet 采用 C/S 架构,所以必须有至少有一台作为服务器,其他作为客户端处理)

1.设置主机文件在本教程里,我们将使用2台运行 ubuntu . “Vivid Vervet" 的主机,一台作为主控服务器,另一台作为 puppet 的代理节点。下面是我们将用到的服务器的基础信息。

puupet 主控服务器 IP:...6 ,主机名: puppetmasterpuppet 代理节点 IP: ... ,主机名: puppetnode我们要在代理节点和服务器这两台机器的 hosts 文件里面都添加上相应的条目,使用 root 或是 sudo 访问权限来编辑 /etc/hosts 文件,命令如下:复制代码代码如下:# nano /etc/hosts...6 puppetmaster.example.com puppetmaster... puppetnode.example.com puppetnode注意,puppet 主控服务器必使用 端口来运行,所以请务必保证开启端口。

2. 用 NTP 更新时间puppet 代理节点所使用系统时间必须要准确,这样可以避免代理证书出现问题。如果有时间差异,那么证书将过期失效,所以服务器与代理节点的系统时间必须互相同步。我们使用 NTP(Network Time Protocol网络时间协议)来同步时间。在服务器与代理节点上面分别运行以下命令来同步时间。复制代码代码如下:# ntpdate pool.ntp.org Jun :: ntpdate[]: adjust time server ... offset -0. sec (LCTT 译注:显示类似的输出结果表示运行正常)

如果没有安装 ntp,请使用下面的命令更新你的软件仓库,安装并运行ntp服务复制代码代码如下:# apt-get update && sudo apt-get -y install ntp ; service ntp restart

3. 安装主控服务器软件安装开源版本的 puppet 有很多的方法。在本教程中我们在 puppet 实验室官网下载一个名为 puppetlabs-release 的软件包的软件源,安装后它将为我们在软件源里面添加 puppetmaster-passenger。puppetmaster-passenger 包括带有 apache 的 puppet 主控服务器。我们开始下载这个软件包:复制代码代码如下:# cd /tmp/# wget ::-- apt.puppetlabs.com (apt.puppetlabs.com)... ..., :3c::fc:ff:fedb:6b1dConnecting to apt.puppetlabs.com (apt.puppetlabs.com)|...|:... connected.HTTP request sent, awaiting response... OKLength: (7.2K) [application/x-debian-package]Saving to: ‘puppetlabs-release-trusty.deb’puppetlabs-release-tr %[===========================>] 7.K --.-KB/s in 0.s-- :: ( KB/s) - ‘puppetlabs-release-trusty.deb’ saved [/]下载完成,我们来安装它:复制代码代码如下:# dpkg -i puppetlabs-release-trusty.debSelecting previously unselected package puppetlabs-release.(Reading database ... files and directories currently installed.)Preparing to unpack puppetlabs-release-trusty.deb ...Unpacking puppetlabs-release (1.0-) ...Setting up puppetlabs-release (1.0-) ...使用 apt 包管理命令更新一下本地的软件源:复制代码代码如下:# apt-get update现在我们就可以安装 puppetmaster-passenger 了复制代码代码如下:# apt-get install puppetmaster-passenger提示: 在安装的时候可能会报错:Warning: Setting templatedir is deprecated.see (at /usr/lib/ruby/vendor_ruby/puppet/settings.rb::in `issue_deprecation_warning')不过不用担心,忽略掉它就好,我们只需要在设置配置文件的时候把这一项禁用就行了。

如何来查看 puppet 主控服务器是否已经安装成功了呢?非常简单,只需要使用下面的命令查看它的版本就可以了。复制代码代码如下:# puppet --version3.8.1现在我们已经安装好了 puppet 主控服务器。因为我们使用的是配合 apache 的 passenger,由 apache 来控制 puppet 主控服务器,当 apache 运行时 puppet 主控服务器才运行。

在开始之前,我们需要通过停止 apache 服务来让 puppet 主控服务器停止运行。复制代码代码如下:# systemctl stop apache2

4. 使用 Apt 工具锁定主控服务器的版本现在已经安装了 3.8.1 版的 puppet,我们锁定这个版本不让它随意升级,因为升级会造成配置文件混乱。 使用 apt 工具来锁定它,这里我们需要使用文本编辑器来创建一个新的文件 /etc/apt/preferences.d/-puppet.pref:复制代码代码如下:# nano /etc/apt/preferences.d/-puppet.pref在新创建的文件里面添加以下内容:复制代码代码如下:# /etc/apt/preferences.d/-puppet.prefPackage: puppet puppet-common puppetmaster-passengerPin: version 3.8*Pin-Priority: 这样在以后的系统软件升级中, puppet 主控服务器将不会跟随系统软件一起升级。

5. 配置 Puppet 主控服务器Puppet 主控服务器作为一个证书发行机构,需要生成它自己的证书,用于签署所有代理的证书的请求。首先我们要删除所有在该软件包安装过程中创建出来的 ssl 证书。本地默认的 puppet 证书放在 /var/lib/puppet/ssl。因此我们只需要使用 rm 命令来整个移除这些证书就可以了。复制代码代码如下:# rm -rf /var/lib/puppet/ssl现在来配置该证书,在创建 puppet 主控服务器证书时,我们需要包括代理节点与主控服务器沟通所用的每个 DNS 名称。使用文本编辑器来修改服务器的配置文件 puppet.conf:复制代码代码如下:# nano /etc/puppet/puppet.conf输出的结果像下面这样复制代码代码如下:[main]logdir=/var/log/puppetvardir=/var/lib/puppetssldir=/var/lib/puppet/sslrundir=/var/run/puppetfactpath=$vardir/lib/factertemplatedir=$confdir/templates[master]# These are needed when the puppetmaster is run by passenger# and can safely be removed if webrick is used.ssl_client_header = SSL_CLIENT_S_DNssl_client_verify_header = SSL_CLIENT_VERIFY在这我们需要注释掉 templatedir 这行使它失效。然后在文件的 [main] 小节的结尾添加下面的信息。复制代码代码如下:server = puppetmasterenvironment = productionruninterval = 1hstrict_variables = truecertname = puppetmasterdns_alt_names = puppetmaster, puppetmaster.example.com编辑完成后保存退出。

使用下面的命令来生成一个新的证书。复制代码代码如下:# puppet master --verbose --no-daemonizeInfo: Creating a new SSL key for caInfo: Creating a new SSL certificate request for caInfo: Certificate Request fingerprint (SHA): F6:2F:::BA:A5:5E:FF:7F:::6B:A7:C4::CE::C7:E3:C9:::E0:F2::D7:2E:E0:BF:BD:A6:...Notice: puppetmaster has a waiting certificate requestNotice: Signed certificate request for puppetmasterNotice: Removing file Puppet::SSL::CertificateRequest puppetmaster at '/var/lib/puppet/ssl/ca/requests/puppetmaster.pem'Notice: Removing file Puppet::SSL::CertificateRequest puppetmaster at '/var/lib/puppet/ssl/certificate_requests/puppetmaster.pem'Notice: Starting Puppet master version 3.8.1^CNotice: Caught INT; storing stopNotice: Processing stop至此,证书已经生成。一旦我们看到 Notice: Starting Puppet master version 3.8.1,就表明证书就已经制作好了。我们按下 CTRL-C 回到 shell 命令行。

查看新生成证书的信息,可以使用下面的命令。复制代码代码如下:# puppet cert list -all+ "puppetmaster" (SHA) ::::A1:C3:2F:::D1:FB::DA:D5:::::F0:E2:8A::B9::::E4:7D:B7:::EC (alt names: "DNS:puppetmaster", "DNS:puppetmaster.example.com")

6. 创建一个 Puppet 清单默认的主清单Manifest是 /etc/puppet/manifests/site.pp。 这个主要清单文件包括了用于在代理节点执行的配置定义。现在我们来创建一个清单文件:复制代码代码如下:# nano /etc/puppet/manifests/site.pp在刚打开的文件里面添加下面这几行:复制代码代码如下:# execute 'apt-get update'exec { 'apt-update': # exec resource named 'apt-update'command => '/usr/bin/apt-get update' # command this resource will run}# install apache2 packagepackage { 'apache2':require => Exec['apt-update'], # require 'apt-update' before installingensure => installed,}# ensure apache2 service is runningservice { 'apache2':ensure => running,}以上这几行的意思是给代理节点部署 apache web 服务。

7. 运行 puppet 主控服务已经准备好运行 puppet 主控服务器 了,那么开启 apache 服务来让它启动复制代码代码如下:# systemctl start apache2我们 puppet 主控服务器已经运行,不过它还不能管理任何代理节点。现在我们给 puppet 主控服务器添加代理节点.

提示: 如果报错

Job for apache2.service failed. see "systemctl status apache2.service" and "journalctl -xe" for details.肯定是 apache 服务器有一些问题,我们可以使用 root 或是 sudo 访问权限来运行 apachectl start 查看它输出的日志。在本教程执行过程中, 我们发现一个 /etc/apache2/sites-enabled/puppetmaster.conf 的证书配置问题。修改其中的 SSLCertificateFile /var/lib/puppet/ssl/certs/server.pem 为 SSLCertificateFile /var/lib/puppet/ssl/certs/puppetmaster.pem,然后注释掉后面这行 SSLCertificateKeyFile 。然后在命令行重新启动 apache。

8. 安装 Puppet 代理节点的软件包我们已经准备好了 puppet 的服务器,现在需要一个可以管理的代理节点,我们将安装 puppet 代理软件到节点上去。这里我们要给每一个需要管理的节点安装代理软件,并且确保这些节点能够通过 DNS 查询到服务器主机。下面将 安装最新的代理软件到 节点 puppetnode.example.com 上。

Ubuntu系统下自动化部署工具puppet的安装和使用教程(ubuntu系统自动获取ip)

在代理节点上使用下面的命令下载 puppet 实验室提供的软件包:复制代码代码如下:# cd /tmp/# wget ::-- apt.puppetlabs.com (apt.puppetlabs.com)... ..., :3c::fc:ff:fedb:6b1dConnecting to apt.puppetlabs.com (apt.puppetlabs.com)|...|:... connected.HTTP request sent, awaiting response... OKLength: (7.2K) [application/x-debian-package]Saving to: ‘puppetlabs-release-trusty.deb’puppetlabs-release-tr %[===========================>] 7.K --.-KB/s in 0.s-- :: ( KB/s) - ‘puppetlabs-release-trusty.deb’ saved [/]在 ubuntu . 上我们使用 debian 包管理系统来安装它,命令如下:</p><p># dpkg -i puppetlabs-release-trusty.deb使用 apt 包管理命令更新一下本地的软件源:复制代码代码如下:# apt-get update通过远程仓库安装:复制代码代码如下:# apt-get install puppetPuppet 代理默认是不启动的。这里我们需要使用文本编辑器修改 /etc/default/puppet 文件,使它正常工作:复制代码代码如下:# nano /etc/default/puppet更改 START 的值改成 "yes" 。复制代码代码如下:START=yes最后保存并退出。

9. 使用 Apt 工具锁定代理软件的版本和上面的步骤一样为防止随意升级造成的配置文件混乱,我们要使用 apt 工具来把它锁定。具体做法是使用文本编辑器创建一个文件 /etc/apt/preferences.d/-puppet.pref:复制代码代码如下:# nano /etc/apt/preferences.d/-puppet.pref在新建的文件里面加入如下内容复制代码代码如下:# /etc/apt/preferences.d/-puppet.prefPackage: puppet puppet-commonPin: version 3.8*Pin-Priority: 这样 puppet 就不会随着系统软件升级而随意升级了。

. 配置 puppet 代理节点我们需要编辑一下代理节点的 puppet.conf 文件,来使它运行。复制代码代码如下:# nano /etc/puppet/puppet.conf它看起来和服务器的配置文件完全一样。同样注释掉 templatedir 这行。不同的是在这里我们需要删除掉所有关于[master] 的部分。

假定主控服务器可以通过名字“puppet-master”访问,我们的客户端应该可以和它相互连接通信。如果不行的话,我们需要使用完整的主机域名 puppetmaster.example.com复制代码代码如下:[agent]server = puppetmaster.example.comcertname = puppetnode.example.com在文件的结尾增加上面3行,增加之后文件内容像下面这样:复制代码代码如下:[main]logdir=/var/log/puppetvardir=/var/lib/puppetssldir=/var/lib/puppet/sslrundir=/var/run/puppetfactpath=$vardir/lib/facter#templatedir=$confdir/templates[agent]server = puppetmaster.example.comcertname = puppetnode.example.com最后保存并退出。

使用下面的命令来启动客户端软件:复制代码代码如下:# systemctl start puppet如果一切顺利的话,我们不会看到命令行有任何输出。 第一次运行的时候,代理节点会生成一个 ssl 证书并且给服务器发送一个请求,经过签名确认后,两台机器就可以互相通信了。

提示: 如果这是你添加的第一个代理节点,建议你在添加其他节点前先给这个证书签名。一旦能够通过并正常运行,回过头来再添加其他代理节点。

. 在主控服务器上对证书请求进行签名第一次运行的时候,代理节点会生成一个 ssl 证书并且给服务器发送一个签名请求。在主控服务器给代理节点服务器证书签名之后,主服务器才能和代理服务器通信并且控制代理服务器。

在主控服务器上使用下面的命令来列出当前的证书请求:复制代码代码如下:# puppet cert list"puppetnode.example.com" (SHA) :A1:7E::6B:CD:7B:7D::::8B:::A6:C4::D5::3D:A0:0E::9A::AE:8F::4A:9A::B2因为只设置了一台代理节点服务器,所以我们将只看到一个请求。看起来类似如上,代理节点的完整域名即其主机名。

注意有没有“+”号在前面,代表这个证书有没有被签名。

使用带有主机名的 puppet cert sign 这个命令来签署这个签名请求,如下:复制代码代码如下:# puppet cert sign puppetnode.example.comNotice: Signed certificate request for puppetnode.example.comNotice: Removing file Puppet::SSL::CertificateRequest puppetnode.example.com at '/var/lib/puppet/ssl/ca/requests/puppetnode.example.com.pem'主控服务器现在可以通讯和控制它签名过的代理节点了。

如果想签署所有的当前请求,可以使用 -all 选项,如下所示:复制代码代码如下:# puppet cert sign --all

. 删除一个 Puppet 证书如果我们想移除一个主机,或者想重建一个主机然后再添加它。下面的例子里我们将展示如何删除 puppet 主控服务器上面的一个证书。使用的命令如下:复制代码代码如下:# puppet cert clean hostnameNotice: Revoked certificate with serial 5Notice: Removing file Puppet::SSL::Certificate puppetnode.example.com at '/var/lib/puppet/ssl/ca/signed/puppetnode.example.com.pem'Notice: Removing file Puppet::SSL::Certificate puppetnode.example.com at '/var/lib/puppet/ssl/certs/puppetnode.example.com.pem'如果我们想查看所有的签署和未签署的请求,使用下面这条命令:复制代码代码如下:# puppet cert list --all+ "puppetmaster" (SHA) ::::A1:C3:2F:::D1:FB::DA:D5:::::F0:E2:8A::B9::::E4:7D:B7:::EC (alt names: "DNS:puppetmaster", "DNS:puppetmaster.example.com")

. 部署 Puppet 清单当配置并完成 puppet 清单后,现在我们需要部署清单到代理节点服务器上。要应用并加载主 puppet 清单,我们可以在代理节点服务器上面使用下面的命令:复制代码代码如下:# puppet agent --testInfo: Retrieving pluginfactsInfo: Retrieving pluginInfo: Caching catalog for puppetnode.example.comInfo: Applying configuration version ''Notice: /Stage[main]/Main/Exec[apt-update]/returns: executed successfullyNotice: Finished catalog run in . seconds这里向我们展示了主清单如何立即影响到了一个单一的服务器。

如果我们打算运行的 puppet 清单与主清单没有什么关联,我们可以简单使用 puppet apply 带上相应的清单文件的路径即可。它仅将清单应用到我们运行该清单的代理节点上。复制代码代码如下:# puppet apply /etc/puppet/manifest/test.pp

. 为特定节点配置清单如果我们想部署一个清单到某个特定的节点,我们需要如下配置清单。

在主控服务器上面使用文本编辑器编辑 /etc/puppet/manifest/site.pp:复制代码代码如下:# nano /etc/puppet/manifest/site.pp添加下面的内容进去复制代码代码如下:node 'puppetnode', 'puppetnode1' {# execute 'apt-get update'exec { 'apt-update': # exec resource named 'apt-update'command => '/usr/bin/apt-get update' # command this resource will run}# install apache2 packagepackage { 'apache2':require => Exec['apt-update'], # require 'apt-update' before installingensure => installed,}# ensure apache2 service is runningservice { 'apache2':ensure => running,}}这里的配置显示我们将在名为 puppetnode 和 puppetnode1 的2个指定的节点上面安装 apache 服务。这里可以添加其他我们需要安装部署的具体节点进去。

. 配置清单模块模块对于组合任务是非常有用的,在 Puppet 社区有很多人贡献了自己的模块组件。

在主控服务器上, 我们将使用 puppet module 命令来安装 puppetlabs-apache 模块。复制代码代码如下:# puppet module install puppetlabs-apache警告: 千万不要在一个已经部署 apache 环境的机器上面使用这个模块,否则它将清空你没有被 puppet 管理的 apache 配置。

现在用文本编辑器来修改 site.pp :复制代码代码如下:# nano /etc/puppet/manifest/site.pp添加下面的内容进去,在 puppetnode 上面安装 apache 服务。复制代码代码如下:node 'puppet-node' {class { 'apache': } # use apache moduleapache::vhost { 'example.com': # define vhost resourceport => '',docroot => '/var/www/html'}}保存退出。然后重新运行该清单来为我们的代理节点部署 apache 配置。

总结现在我们已经成功的在 ubuntu . 上面部署并运行 puppet 来管理代理节点服务器的基础运行环境。我们学习了 puppet 是如何工作的,编写清单文件,节点与主机间使用 ssl 证书认证的认证过程。使用 puppet 开源软件配置管理工具在众多的代理节点上来控制、管理和配置重复性任务是非常容易的。

安装Aptik来备份Ubuntu系统上的软件 当你想重装Ubuntu或者仅仅是想安装它的一个新版本的时候,如果有个便捷的方法来重新安装之前的应用并且重置其设置会很方便的。此时Aptik粉墨登场,

Ubuntu下挂载Win7下的NFS服务器失败的两种解决办法 最近参与的项目都与Linux有关,遇到的问题也特别多,这不今天就有一个同事跟我说他遇到的问题:他在windows下开启了一个NFS服务器,然后在Ubuntu下挂

Ubuntu .中安装TeamViewer 轻松搞定 个人平常经常用到TeamViewer,TeamViewer发布之后提供了显著的性能优化,还同时提高了语音传输质量、优化了登录时间及提高多核处理器的处理能力。现

标签: ubuntu系统自动获取ip

本文链接地址:https://www.jiuchutong.com/biancheng/352794.html 转载请保留说明!

上一篇:在Ubuntu系统上安装AWStats来分析服务器软件的日志(ubuntu安装超详细教程)

下一篇:安装Aptik来备份Ubuntu系统上的软件(alpine安装apt)

  • 视同销售的增值税怎么申报
  • 增值税纳税期限1日是什么意思
  • 利润表中的所得税
  • 其他货币资金的科目编码
  • 最新增值税申报表及附表下载
  • 企业注销资产负债表年初数要调整吗?
  • 委托加工物资两种情况例题
  • 应计入资产负债表应付利息项目的有
  • 收到固定资产抵账增值税计税基础
  • 制造费用属于哪一类科目
  • 客户能把货款打给个人吗
  • 新成立公司注资流程
  • 应收账款处置损益
  • 个体工商户库存商品入账
  • 银行异地汇款抽奖需要扣缴个人所得税吗?
  • 公司购买的商品给别的企业用了,企业所得税能列支吗
  • 汇算清缴差旅费扣除标准
  • 外币报表未分配利润折算
  • 只有进项没有销项怎么报税
  • 工商年报纳税总额是应缴还是实缴
  • 进项和销项的会计分录
  • 开票需要对方提供营业执照吗
  • 临时设施需要验收吗
  • 厂房装修费用计入制造费用吗
  • 发票冲红可以冲红数量不变金额减少
  • 不征税的通行费怎么分录
  • 建筑施工企业跨区域如何缴税
  • 注册资本金认缴制
  • 增值税账面和实际缴纳不平,怎样调整
  • 机器用油怎么做成的
  • 车间整改的目的
  • 半成品月末账务处理
  • 前端静态页面
  • symfony是最好的框架
  • 认缴制下实收资本需要验资吗
  • 用php编写从大到小排序
  • react.strictmode
  • 高新技术企业收入占比不到60%,能否享受税收优惠政策
  • 第一季度季初资产总额和第一季度季末同一个数吗
  • 预定义变量是什么
  • 什么是AI工具
  • adan算法
  • phpcms是什么意思
  • 帝国cms使用手册
  • 开发票时有哪些规定呢?
  • 拓展训练属于培训费吗
  • 小规模附加税减免性质代码如何选
  • 其他应收款其他应付款的风险
  • 交易性金融资产公允价值变动计入
  • 案例详解:功能点估算法
  • 汇款和转账有什么区别吗
  • 劳动保护的各项支出列入工资总额的范围吗
  • 对公付款对方不开发票可以吗
  • 缓交社保个税怎么报?
  • 跨年费用入账
  • 金税四期来了我们前期要准备什么
  • 兼职老师工资小时多少钱
  • 劳务总价包干
  • 装修费摊销年限规定会计分录
  • 发票遗失证明怎么写范文
  • 包工包料工程如何计税
  • 财务月末暂估成本是什么
  • 开办费包括哪些内容多少钱
  • sql语句大全实例教程.pdf
  • Windows 2000中NTFS磁盘权限应用
  • auepuf.exe是什么进程
  • windows如何删除本地用户
  • virtualbox虚拟机菜单找不到了
  • 系统配置运行命令
  • windows10右键菜单被任务栏挡
  • 微软强制升级
  • linux 多线程 写文件
  • linux系统叫啥
  • 关于android中view的说法正确的是
  • node.js文件流
  • pythion
  • 安卓登录界面布局设计
  • 车位过户需要契税发票吗
  • 公司投资款可否取回
  • 天津市河东区税务局
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设