Ubuntu系統(tǒng)下如何安裝自動化部署工具puppet

本篇內(nèi)容介紹了“Ubuntu系統(tǒng)下如何安裝自動化部署工具puppet”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

創(chuàng)新新互聯(lián),憑借十載的成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)經(jīng)驗(yàn),本著真心·誠心服務(wù)的企業(yè)理念服務(wù)于成都中小企業(yè)設(shè)計(jì)網(wǎng)站有上千多家案例。做網(wǎng)站建設(shè),選創(chuàng)新互聯(lián)。

1.設(shè)置主機(jī)文件
在本教程里,我們將使用2臺運(yùn)行 ubuntu 15.04 “Vivid Vervet" 的主機(jī),一臺作為主控服務(wù)器,另一臺作為 puppet 的代理節(jié)點(diǎn)。下面是我們將用到的服務(wù)器的基礎(chǔ)信息。

puupet 主控服務(wù)器 IP:44.55.88.6 ,主機(jī)名: puppetmaster
puppet 代理節(jié)點(diǎn) IP: 45.55.86.39 ,主機(jī)名: puppetnode
我們要在代理節(jié)點(diǎn)和服務(wù)器這兩臺機(jī)器的 hosts 文件里面都添加上相應(yīng)的條目,使用 root 或是 sudo 訪問權(quán)限來編輯 /etc/hosts 文件,命令如下:

代碼如下:


# nano /etc/hosts
45.55.88.6 puppetmaster.example.com puppetmaster
45.55.86.39 puppetnode.example.com puppetnode


注意,puppet 主控服務(wù)器必使用 8140 端口來運(yùn)行,所以請務(wù)必保證開啟8140端口。

2. 用 NTP 更新時(shí)間
puppet 代理節(jié)點(diǎn)所使用系統(tǒng)時(shí)間必須要準(zhǔn)確,這樣可以避免代理證書出現(xiàn)問題。如果有時(shí)間差異,那么證書將過期失效,所以服務(wù)器與代理節(jié)點(diǎn)的系統(tǒng)時(shí)間必須互相同步。我們使用 NTP(Network Time Protocol網(wǎng)絡(luò)時(shí)間協(xié)議)來同步時(shí)間。在服務(wù)器與代理節(jié)點(diǎn)上面分別運(yùn)行以下命令來同步時(shí)間。

代碼如下:


# ntpdate pool.ntp.org


17 Jun 00:17:08 ntpdate[882]: adjust time server 66.175.209.17 offset -0.001938 sec   
(LCTT 譯注:顯示類似的輸出結(jié)果表示運(yùn)行正常)

如果沒有安裝 ntp,請使用下面的命令更新你的軟件倉庫,安裝并運(yùn)行ntp服務(wù)

代碼如下:


# apt-get update && sudo apt-get -y install ntp ; service ntp restart

3. 安裝主控服務(wù)器軟件
安裝開源版本的 puppet 有很多的方法。在本教程中我們在 puppet 實(shí)驗(yàn)室官網(wǎng)下載一個(gè)名為 puppetlabs-release 的軟件包的軟件源,安裝后它將為我們在軟件源里面添加 puppetmaster-passenger。puppetmaster-passenger 包括帶有 apache 的 puppet 主控服務(wù)器。我們開始下載這個(gè)軟件包:

代碼如下:


# cd /tmp/
# wget https://apt.puppetlabs.com/puppetlabs-release-trusty.deb
--2015-06-17 00:19:26-- https://apt.puppetlabs.com/puppetlabs-release-trusty.deb
Resolving apt.puppetlabs.com (apt.puppetlabs.com)... 192.155.89.90, 2600:3c03::f03c:91ff:fedb:6b1d
Connecting to apt.puppetlabs.com (apt.puppetlabs.com)|192.155.89.90|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7384 (7.2K) [application/x-debian-package]
Saving to: ‘puppetlabs-release-trusty.deb’
puppetlabs-release-tr 100%[===========================>] 7.21K --.-KB/s in 0.06s
2015-06-17 00:19:26 (130 KB/s) - ‘puppetlabs-release-trusty.deb’ saved [7384/7384]


下載完成,我們來安裝它:

代碼如下:


# dpkg -i puppetlabs-release-trusty.deb
Selecting previously unselected package puppetlabs-release.
(Reading database ... 85899 files and directories currently installed.)
Preparing to unpack puppetlabs-release-trusty.deb ...
Unpacking puppetlabs-release (1.0-11) ...
Setting up puppetlabs-release (1.0-11) ...


使用 apt 包管理命令更新一下本地的軟件源:

代碼如下:


# apt-get update


現(xiàn)在我們就可以安裝 puppetmaster-passenger 了

代碼如下:


# apt-get install puppetmaster-passenger


提示: 在安裝的時(shí)候可能會報(bào)錯:
Warning: Setting templatedir is deprecated.see http://links.puppetlabs.com/env-settings-deprecations (at /usr/lib/ruby/vendor_ruby/puppet/settings.rb:1139:in `issue_deprecation_warning')
不過不用擔(dān)心,忽略掉它就好,我們只需要在設(shè)置配置文件的時(shí)候把這一項(xiàng)禁用就行了。

如何來查看 puppet 主控服務(wù)器是否已經(jīng)安裝成功了呢?非常簡單,只需要使用下面的命令查看它的版本就可以了。

代碼如下:


# puppet --version
3.8.1


現(xiàn)在我們已經(jīng)安裝好了 puppet 主控服務(wù)器。因?yàn)槲覀兪褂玫氖桥浜?apache 的 passenger,由 apache 來控制 puppet 主控服務(wù)器,當(dāng) apache 運(yùn)行時(shí) puppet 主控服務(wù)器才運(yùn)行。

在開始之前,我們需要通過停止 apache 服務(wù)來讓 puppet 主控服務(wù)器停止運(yùn)行。

代碼如下:


# systemctl stop apache2

4. 使用 Apt 工具鎖定主控服務(wù)器的版本
現(xiàn)在已經(jīng)安裝了 3.8.1 版的 puppet,我們鎖定這個(gè)版本不讓它隨意升級,因?yàn)樯墪斐膳渲梦募靵y。 使用 apt 工具來鎖定它,這里我們需要使用文本編輯器來創(chuàng)建一個(gè)新的文件 /etc/apt/preferences.d/00-puppet.pref:

代碼如下:


# nano /etc/apt/preferences.d/00-puppet.pref


在新創(chuàng)建的文件里面添加以下內(nèi)容:

代碼如下:


# /etc/apt/preferences.d/00-puppet.pref
Package: puppet puppet-common puppetmaster-passenger
Pin: version 3.8*
Pin-Priority: 501


這樣在以后的系統(tǒng)軟件升級中, puppet 主控服務(wù)器將不會跟隨系統(tǒng)軟件一起升級。

5. 配置 Puppet 主控服務(wù)器
Puppet 主控服務(wù)器作為一個(gè)證書發(fā)行機(jī)構(gòu),需要生成它自己的證書,用于簽署所有代理的證書的請求。首先我們要刪除所有在該軟件包安裝過程中創(chuàng)建出來的 ssl 證書。本地默認(rèn)的 puppet 證書放在 /var/lib/puppet/ssl。因此我們只需要使用 rm 命令來整個(gè)移除這些證書就可以了。

代碼如下:


# rm -rf /var/lib/puppet/ssl


現(xiàn)在來配置該證書,在創(chuàng)建 puppet 主控服務(wù)器證書時(shí),我們需要包括代理節(jié)點(diǎn)與主控服務(wù)器溝通所用的每個(gè) DNS 名稱。使用文本編輯器來修改服務(wù)器的配置文件 puppet.conf:

代碼如下:


# nano /etc/puppet/puppet.conf


輸出的結(jié)果像下面這樣

代碼如下:


[main]
logdir=/var/log/puppet
vardir=/var/lib/puppet
ssldir=/var/lib/puppet/ssl
rundir=/var/run/puppet
factpath=$vardir/lib/facter
templatedir=$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_DN
ssl_client_verify_header = SSL_CLIENT_VERIFY


在這我們需要注釋掉 templatedir 這行使它失效。然后在文件的 [main] 小節(jié)的結(jié)尾添加下面的信息。

代碼如下:


server = puppetmaster
environment = production
runinterval = 1h
strict_variables = true
certname = puppetmaster
dns_alt_names = puppetmaster, puppetmaster.example.com


編輯完成后保存退出。

使用下面的命令來生成一個(gè)新的證書。

代碼如下:


# puppet master --verbose --no-daemonize
Info: Creating a new SSL key for ca
Info: Creating a new SSL certificate request for ca
Info: Certificate Request fingerprint (SHA256): F6:2F:69:89:BA:A5:5E:FF:7F:94:15:6B:A7:C4:20:CE:23:C7:E3:C9:63:53:E0:F2:76:D7:2E:E0:BF:BD:A6:78
...
Notice: puppetmaster has a waiting certificate request
Notice: Signed certificate request for puppetmaster
Notice: 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 stop
Notice: Processing stop


至此,證書已經(jīng)生成。一旦我們看到 Notice: Starting Puppet master version 3.8.1,就表明證書就已經(jīng)制作好了。我們按下 CTRL-C 回到 shell 命令行。

查看新生成證書的信息,可以使用下面的命令。

代碼如下:


# puppet cert list -all
+ "puppetmaster" (SHA256) 33:28:97:86:A1:C3:2F:73:10:D1:FB:42:DA:D5:42:69:71:84:F0:E2:8A:01:B9:58:38:90:E4:7D:B7:25:23:EC (alt names: "DNS:puppetmaster", "DNS:puppetmaster.example.com")

6. 創(chuàng)建一個(gè) Puppet 清單
默認(rèn)的主清單Manifest是 /etc/puppet/manifests/site.pp。 這個(gè)主要清單文件包括了用于在代理節(jié)點(diǎn)執(zhí)行的配置定義?,F(xiàn)在我們來創(chuàng)建一個(gè)清單文件:

代碼如下:


# 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 package
package { 'apache2':
require => Exec['apt-update'], # require 'apt-update' before installing
ensure => installed,
}
# ensure apache2 service is running
service { 'apache2':
ensure => running,
}


以上這幾行的意思是給代理節(jié)點(diǎn)部署 apache web 服務(wù)。

7. 運(yùn)行 puppet 主控服務(wù)
已經(jīng)準(zhǔn)備好運(yùn)行 puppet 主控服務(wù)器 了,那么開啟 apache 服務(wù)來讓它啟動

代碼如下:


# systemctl start apache2


我們 puppet 主控服務(wù)器已經(jīng)運(yùn)行,不過它還不能管理任何代理節(jié)點(diǎn)?,F(xiàn)在我們給 puppet 主控服務(wù)器添加代理節(jié)點(diǎn).

提示: 如果報(bào)錯

Job for apache2.service failed. see "systemctl status apache2.service" and "journalctl -xe" for details.
肯定是 apache 服務(wù)器有一些問題,我們可以使用 root 或是 sudo 訪問權(quán)限來運(yùn)行 apachectl start 查看它輸出的日志。在本教程執(zhí)行過程中, 我們發(fā)現(xiàn)一個(gè) /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 代理節(jié)點(diǎn)的軟件包
我們已經(jīng)準(zhǔn)備好了 puppet 的服務(wù)器,現(xiàn)在需要一個(gè)可以管理的代理節(jié)點(diǎn),我們將安裝 puppet 代理軟件到節(jié)點(diǎn)上去。這里我們要給每一個(gè)需要管理的節(jié)點(diǎn)安裝代理軟件,并且確保這些節(jié)點(diǎn)能夠通過 DNS 查詢到服務(wù)器主機(jī)。下面將 安裝最新的代理軟件到 節(jié)點(diǎn) puppetnode.example.com 上。

在代理節(jié)點(diǎn)上使用下面的命令下載 puppet 實(shí)驗(yàn)室提供的軟件包:

代碼如下:


# cd /tmp/
# wget https://apt.puppetlabs.com/puppetlabs-release-trusty.deb\
--2015-06-17 00:54:42-- https://apt.puppetlabs.com/puppetlabs-release-trusty.deb
Resolving apt.puppetlabs.com (apt.puppetlabs.com)... 192.155.89.90, 2600:3c03::f03c:91ff:fedb:6b1d
Connecting to apt.puppetlabs.com (apt.puppetlabs.com)|192.155.89.90|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7384 (7.2K) [application/x-debian-package]
Saving to: ‘puppetlabs-release-trusty.deb’
puppetlabs-release-tr 100%[===========================>] 7.21K --.-KB/s in 0.04s
2015-06-17 00:54:42 (162 KB/s) - ‘puppetlabs-release-trusty.deb’ saved [7384/7384]
在 ubuntu 15.04 上我們使用 debian 包管理系統(tǒng)來安裝它,命令如下:</p> <p># dpkg -i puppetlabs-release-trusty.deb


使用 apt 包管理命令更新一下本地的軟件源:

代碼如下:


# apt-get update


通過遠(yuǎn)程倉庫安裝:

代碼如下:


# apt-get install puppet


Puppet 代理默認(rèn)是不啟動的。這里我們需要使用文本編輯器修改 /etc/default/puppet 文件,使它正常工作:

代碼如下:


# nano /etc/default/puppet


更改 START 的值改成 "yes" 。

代碼如下:


START=yes


最后保存并退出。

9. 使用 Apt 工具鎖定代理軟件的版本
和上面的步驟一樣為防止隨意升級造成的配置文件混亂,我們要使用 apt 工具來把它鎖定。具體做法是使用文本編輯器創(chuàng)建一個(gè)文件 /etc/apt/preferences.d/00-puppet.pref:

代碼如下:


# nano /etc/apt/preferences.d/00-puppet.pref


在新建的文件里面加入如下內(nèi)容

代碼如下:


# /etc/apt/preferences.d/00-puppet.pref
Package: puppet puppet-common
Pin: version 3.8*
Pin-Priority: 501


這樣 puppet 就不會隨著系統(tǒng)軟件升級而隨意升級了。

10. 配置 puppet 代理節(jié)點(diǎn)
我們需要編輯一下代理節(jié)點(diǎn)的 puppet.conf 文件,來使它運(yùn)行。

代碼如下:


# nano /etc/puppet/puppet.conf


它看起來和服務(wù)器的配置文件完全一樣。同樣注釋掉 templatedir 這行。不同的是在這里我們需要刪除掉所有關(guān)于[master] 的部分。

假定主控服務(wù)器可以通過名字“puppet-master”訪問,我們的客戶端應(yīng)該可以和它相互連接通信。如果不行的話,我們需要使用完整的主機(jī)域名 puppetmaster.example.com

代碼如下:


[agent]
server = puppetmaster.example.com
certname = puppetnode.example.com


在文件的結(jié)尾增加上面3行,增加之后文件內(nèi)容像下面這樣:

代碼如下:


[main]
logdir=/var/log/puppet
vardir=/var/lib/puppet
ssldir=/var/lib/puppet/ssl
rundir=/var/run/puppet
factpath=$vardir/lib/facter
#templatedir=$confdir/templates
[agent]
server = puppetmaster.example.com
certname = puppetnode.example.com


最后保存并退出。

使用下面的命令來啟動客戶端軟件:

代碼如下:


# systemctl start puppet


如果一切順利的話,我們不會看到命令行有任何輸出。 第一次運(yùn)行的時(shí)候,代理節(jié)點(diǎn)會生成一個(gè) ssl 證書并且給服務(wù)器發(fā)送一個(gè)請求,經(jīng)過簽名確認(rèn)后,兩臺機(jī)器就可以互相通信了。

提示: 如果這是你添加的第一個(gè)代理節(jié)點(diǎn),建議你在添加其他節(jié)點(diǎn)前先給這個(gè)證書簽名。一旦能夠通過并正常運(yùn)行,回過頭來再添加其他代理節(jié)點(diǎn)。

11. 在主控服務(wù)器上對證書請求進(jìn)行簽名
第一次運(yùn)行的時(shí)候,代理節(jié)點(diǎn)會生成一個(gè) ssl 證書并且給服務(wù)器發(fā)送一個(gè)簽名請求。在主控服務(wù)器給代理節(jié)點(diǎn)服務(wù)器證書簽名之后,主服務(wù)器才能和代理服務(wù)器通信并且控制代理服務(wù)器。

在主控服務(wù)器上使用下面的命令來列出當(dāng)前的證書請求:

代碼如下:


# puppet cert list
"puppetnode.example.com" (SHA256) 31:A1:7E:23:6B:CD:7B:7D:83:98:33:8B:21:01:A6:C4:01:D5:53:3D:A0:0E:77:9A:77:AE:8F:05:4A:9A:50:B2


因?yàn)橹辉O(shè)置了一臺代理節(jié)點(diǎn)服務(wù)器,所以我們將只看到一個(gè)請求??雌饋眍愃迫缟?,代理節(jié)點(diǎn)的完整域名即其主機(jī)名。

注意有沒有“+”號在前面,代表這個(gè)證書有沒有被簽名。

使用帶有主機(jī)名的 puppet cert sign 這個(gè)命令來簽署這個(gè)簽名請求,如下:

代碼如下:


# puppet cert sign puppetnode.example.com
Notice: Signed certificate request for puppetnode.example.com
Notice: Removing file Puppet::SSL::CertificateRequest puppetnode.example.com at '/var/lib/puppet/ssl/ca/requests/puppetnode.example.com.pem'


主控服務(wù)器現(xiàn)在可以通訊和控制它簽名過的代理節(jié)點(diǎn)了。

如果想簽署所有的當(dāng)前請求,可以使用 -all 選項(xiàng),如下所示:

代碼如下:


# puppet cert sign --all

12. 刪除一個(gè) Puppet 證書
如果我們想移除一個(gè)主機(jī),或者想重建一個(gè)主機(jī)然后再添加它。下面的例子里我們將展示如何刪除 puppet 主控服務(wù)器上面的一個(gè)證書。使用的命令如下:

代碼如下:


# puppet cert clean hostname
Notice: Revoked certificate with serial 5
Notice: 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" (SHA256) 33:28:97:86:A1:C3:2F:73:10:D1:FB:42:DA:D5:42:69:71:84:F0:E2:8A:01:B9:58:38:90:E4:7D:B7:25:23:EC (alt names: "DNS:puppetmaster", "DNS:puppetmaster.example.com")

13. 部署 Puppet 清單
當(dāng)配置并完成 puppet 清單后,現(xiàn)在我們需要部署清單到代理節(jié)點(diǎn)服務(wù)器上。要應(yīng)用并加載主 puppet 清單,我們可以在代理節(jié)點(diǎn)服務(wù)器上面使用下面的命令:

代碼如下:


# puppet agent --test
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for puppetnode.example.com
Info: Applying configuration version '1434563858'
Notice: /Stage[main]/Main/Exec[apt-update]/returns: executed successfully
Notice: Finished catalog run in 10.53 seconds


這里向我們展示了主清單如何立即影響到了一個(gè)單一的服務(wù)器。

如果我們打算運(yùn)行的 puppet 清單與主清單沒有什么關(guān)聯(lián),我們可以簡單使用 puppet apply 帶上相應(yīng)的清單文件的路徑即可。它僅將清單應(yīng)用到我們運(yùn)行該清單的代理節(jié)點(diǎn)上。

代碼如下:


# puppet apply /etc/puppet/manifest/test.pp

14. 為特定節(jié)點(diǎn)配置清單
如果我們想部署一個(gè)清單到某個(gè)特定的節(jié)點(diǎn),我們需要如下配置清單。

在主控服務(wù)器上面使用文本編輯器編輯 /etc/puppet/manifest/site.pp:

代碼如下:


# nano /etc/puppet/manifest/site.pp


添加下面的內(nèi)容進(jìn)去

代碼如下:


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 package
package { 'apache2':
require => Exec['apt-update'], # require 'apt-update' before installing
ensure => installed,
}
# ensure apache2 service is running
service { 'apache2':
ensure => running,
}
}


這里的配置顯示我們將在名為 puppetnode 和 puppetnode1 的2個(gè)指定的節(jié)點(diǎn)上面安裝 apache 服務(wù)。這里可以添加其他我們需要安裝部署的具體節(jié)點(diǎn)進(jìn)去。

15. 配置清單模塊
模塊對于組合任務(wù)是非常有用的,在 Puppet 社區(qū)有很多人貢獻(xiàn)了自己的模塊組件。

在主控服務(wù)器上, 我們將使用 puppet module 命令來安裝 puppetlabs-apache 模塊。

代碼如下:


# puppet module install puppetlabs-apache


警告: 千萬不要在一個(gè)已經(jīng)部署 apache 環(huán)境的機(jī)器上面使用這個(gè)模塊,否則它將清空你沒有被 puppet 管理的 apache 配置。

現(xiàn)在用文本編輯器來修改 site.pp :

代碼如下:


# nano /etc/puppet/manifest/site.pp


添加下面的內(nèi)容進(jìn)去,在 puppetnode 上面安裝 apache 服務(wù)。

代碼如下:


node 'puppet-node' {
class { 'apache': } # use apache module
apache::vhost { 'example.com': # define vhost resource
port => '80',
docroot => '/var/www/html'
}
}


保存退出。然后重新運(yùn)行該清單來為我們的代理節(jié)點(diǎn)部署 apache 配置。

“Ubuntu系統(tǒng)下如何安裝自動化部署工具puppet”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

文章名稱:Ubuntu系統(tǒng)下如何安裝自動化部署工具puppet
當(dāng)前URL:http://bm7419.com/article0/gihdoo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、動態(tài)網(wǎng)站網(wǎng)站內(nèi)鏈、企業(yè)建站網(wǎng)站設(shè)計(jì)公司、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)