openstack安裝(liberty)--安裝編排服務Orchestration service

使用heat orchestration template (HOT)創建和管理雲資源,將openstack的核心組件集成到一個單一模板系統。

此模板允許創建大部分OPENSTACK資源類型,比如實例、浮動IP、卷、安全組和用戶。

同時提供高級功能,比如實例高可用、實例自動縮放和嵌套堆棧(nested stacks)等。


10.1編排服務Orchestration主要組件

heat command-line client:命令行接口,能使用HEAT-API和雲架構APIs交互。終端開發者能直接使用Orchestration REST API

heat-api component:一個OPENSTACK原生REST API能夠處理髮送給HEAT-ENGINE的API請求(RPC)。

heat-api-cfn component:一個AWS查詢API併兼容AWS雲架構,能夠處理髮送給HEAT-ENGINE的API請求(RPC)。

heat-engine:爲API用戶提供啓動模板和事件回溯。


10.2準備

10.2.1創建數據庫並授權

[root@comtroller1 ~]# 
[root@comtroller1 ~]# mysql -uroot -p
Enter password: 
MariaDB [(none)]> CREATE DATABASE heat;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> GRANT ALL PRIVILEGES ON heat.* TO 'heat'@'localhost' IDENTIFIED BY 'heat';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> GRANT ALL PRIVILEGES ON heat.* TO 'heat'@'%' IDENTIFIED BY 'heat';
Query OK, 0 rows affected (0.00 sec)


10.2.2創建租戶並加入角色和項目

[root@comtroller1 ~]# . admin-openrc.sh 
[root@comtroller1 ~]# openstack user create --domain default --password-prompt heat
User Password:
Repeat User Password:
+-----------+----------------------------------+
| Field     | Value                            |
+-----------+----------------------------------+
| domain_id | default                          |
| enabled   | True                             |
| id        | f973c69a97da44cdb3c7244db6d41807 |
| name      | heat                             |
+-----------+----------------------------------+
[root@comtroller1 ~]# openstack role add --project service --user heat admin


10.2.3創建heat和heat-cfn服務實體

[root@comtroller1 ~]# openstack service create --name heat --description "Orchestration" orchestration
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Orchestration                    |
| enabled     | True                             |
| id          | cde09b9c3ac04e97bfd50e158fafc795 |
| name        | heat                             |
| type        | orchestration                    |
+-------------+----------------------------------+
[root@comtroller1 ~]# openstack service create --name heat-cfn --description "Orchestration"  cloudformation
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Orchestration                    |
| enabled     | True                             |
| id          | 3fff82ec95a64803b6550b8dc06abdf4 |
| name        | heat-cfn                         |
| type        | cloudformation                   |
+-------------+----------------------------------+


10.2.4創建API訪問端點

[root@comtroller1 ~]# openstack endpoint create --region RegionOne orchestration public http://controller1:8004/v1/%\(tenant_id\)s
| Field        | Value                                    |
+--------------+------------------------------------------+
| enabled      | True                                     |
| id           | 3e475bdbde404d399ebf781123673780         |
| interface    | public                                   |
| region       | RegionOne                                |
| region_id    | RegionOne                                |
| service_id   | cde09b9c3ac04e97bfd50e158fafc795         |
| service_name | heat                                     |
| service_type | orchestration                            |
| url          | http://controller1:8004/v1/%(tenant_id)s |
+--------------+------------------------------------------+
[root@comtroller1 ~]# openstack endpoint create --region RegionOne orchestration internal http://controller1:8004/v1/%\(tenant_id\)s
+--------------+------------------------------------------+
| Field        | Value                                    |
+--------------+------------------------------------------+
| enabled      | True                                     |
| id           | 0c47cb6c9b7d4be19fe432f55d068e82         |
| interface    | internal                                 |
| region       | RegionOne                                |
| region_id    | RegionOne                                |
| service_id   | cde09b9c3ac04e97bfd50e158fafc795         |
| service_name | heat                                     |
| service_type | orchestration                            |
| url          | http://controller1:8004/v1/%(tenant_id)s |
+--------------+------------------------------------------+
[root@comtroller1 ~]# openstack endpoint create --region RegionOne orchestration admin http://controller1:8004/v1/%\(tenant_id\)s
| Field        | Value                                    |
+--------------+------------------------------------------+
| enabled      | True                                     |
| id           | 20d89c20c152442f8f01c6cc9aab5290         |
| interface    | admin                                    |
| region       | RegionOne                                |
| region_id    | RegionOne                                |
| service_id   | cde09b9c3ac04e97bfd50e158fafc795         |
| service_name | heat                                     |
| service_type | orchestration                            |
| url          | http://controller1:8004/v1/%(tenant_id)s |
+--------------+------------------------------------------+
[root@comtroller1 ~]# openstack endpoint create --region RegionOne cloudformation public http://controller1:8000/v1 
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | e7108965424447ea99eb085167794555 |
| interface    | public                           |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 3fff82ec95a64803b6550b8dc06abdf4 |
| service_name | heat-cfn                         |
| service_type | cloudformation                   |
| url          | http://controller1:8000/v1       |
+--------------+----------------------------------+
[root@comtroller1 ~]# openstack endpoint create --region RegionOne cloudformation internal http://controller1:8000/v1 
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 71a2f23959ee482891af78810a3957fb |
| interface    | internal                         |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 3fff82ec95a64803b6550b8dc06abdf4 |
| service_name | heat-cfn                         |
| service_type | cloudformation                   |
| url          | http://controller1:8000/v1       |
+--------------+----------------------------------+
[root@comtroller1 ~]# openstack endpoint create --region RegionOne cloudformation admin http://controller1:8000/v1
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 6458b4fe00dc41edbee73cacdb0f6e06 |
| interface    | admin                            |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 3fff82ec95a64803b6550b8dc06abdf4 |
| service_name | heat-cfn                         |
| service_type | cloudformation                   |
| url          | http://controller1:8000/v1       |
+--------------+----------------------------------+


10.2.5添加附加信息到Identity service

[root@comtroller1 ~]# openstack domain create --description "Stack projects and users" heat  ###爲stack創建HEAR域用以包含項目和用戶
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Stack projects and users         |
| enabled     | True                             |
| id          | 4aa7f8d30d624290a789fd6b250facef |
| name        | heat                             |
+-------------+----------------------------------+
[root@comtroller1 ~]# openstack user create --domain heat --password-prompt heat_domain_admin  ###創建heat_domain_admin用戶用以管理heat域中項目和用戶
User Password:
Repeat User Password:
+-----------+----------------------------------+
| Field     | Value                            |
+-----------+----------------------------------+
| domain_id | 4aa7f8d30d624290a789fd6b250facef |
| enabled   | True                             |
| id        | f340cd8430654d2f8e98945595fac6de |
| name      | heat_domain_admin                |
+-----------+----------------------------------+
[root@comtroller1 ~]# openstack role add --domain heat --user heat_domain_admin admin  ###將heat_domain_admin添加到admin角色用以授予管理權限,此命令無輸出
[root@comtroller1 ~]# openstack role create heat_stack_owner  ###創建heat_stack_owner角色
+-------+----------------------------------+
| Field | Value                            |
+-------+----------------------------------+
| id    | cfc29d0f63c84786a18cb9d5db70516f |
| name  | heat_stack_owner                 |
+-------+----------------------------------+
[root@comtroller1 ~]# openstack role add --project demo --user demo heat_stack_owner  ###將角色heat_stack_owner添加到demo項目並啓用demo用戶管理stack,必須將heat_stack_owner角色添加到每個STACK管理用戶,此命令無輸出。
[root@comtroller1 ~]# openstack role create heat_stack_user  ###創建heat_stack_user角色,默認Orchestration在stack部署時自動分配heat_stack_user給用戶,此角色默認限制API操作。爲防止衝突,不要將此角色授予具備heat_stack_owner角色的用戶。
+-------+----------------------------------+
| Field | Value                            |
+-------+----------------------------------+
| id    | 65940a347b7d4404b3923fffd2dd7965 |
| name  | heat_stack_user                  |
+-------+----------------------------------+


10.3安裝配置組件

10.3.1安裝組件

[root@comtroller1 ~]# yum install openstack-heat-api openstack-heat-api-cfn openstack-heat-engine python-heatclient -y
10.3.2修改配置文件
[root@comtroller1 ~]# vi /etc/heat/heat.conf
[database]
connection = mysql://heat:heat@controller1/heat
[DEFAULT]
rpc_backend = rabbit
[oslo_messaging_rabbit]
rabbit_host = controller1
rabbit_userid = openstack
rabbit_password = openstack
[keystone_authtoken]  ##默認沒有需要添加
auth_uri = http://controller1:5000/v3                           ###官方文檔中配置爲 http://controller1:5000 但會引起錯誤。
auth_url = http://controller1:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
project_name = service
username = heat
password = heat
[trustee]   ##默認沒有需要添加
auth_plugin = password
auth_url = http://controller1:35357
username = heat
password = heat
user_domain_id = default
[clients_keystone]
auth_uri = http://controller1:5000
[ec2authtoken]
auth_uri = auth_uri = http://controller1:5000/v3
[DEFAULT]
heat_metadata_server_url = http://controller1:8000
heat_waitcondition_server_url = http://controller1:8000/v1/waitcondition
[DEFAULT]
stack_domain_admin = heat_domain_admin
stack_domain_admin_password = openstack
stack_user_domain_name = heat
[DEFAULT]
verbose = True


10.2.3初始化數據庫

[root@comtroller1 ~]# su -s /bin/sh -c "heat-manage db_sync" heat
2016-08-05 11:49:49.953 9049 INFO migrate.versioning.api [-] 27 -> 28... 
2016-08-05 11:49:50.153 9049 INFO migrate.versioning.api [-] done
2016-08-05 11:49:50.153 9049 INFO migrate.versioning.api [-] 28 -> 29... 
2016-08-05 11:49:50.189 9049 INFO migrate.versioning.api [-] done
2016-08-05 11:49:50.189 9049 INFO migrate.versioning.api [-] 29 -> 30... 
2016-08-05 11:49:50.221 9049 INFO migrate.versioning.api [-] done
2016-08-05 11:49:50.221 9049 INFO migrate.versioning.api [-] 30 -> 31... 
2016-08-05 11:49:50.422 9049 INFO migrate.versioning.api [-] done
2016-08-05 11:49:50.422 9049 INFO migrate.versioning.api [-] 31 -> 32... 
2016-08-05 11:49:50.538 9049 INFO migrate.versioning.api [-] done
2016-08-05 11:49:50.538 9049 INFO migrate.versioning.api [-] 32 -> 33... 
2016-08-05 11:49:50.790 9049 INFO migrate.versioning.api [-] done
2016-08-05 11:49:50.790 9049 INFO migrate.versioning.api [-] 33 -> 34... 
2016-08-05 11:49:50.815 9049 INFO migrate.versioning.api [-] done
2016-08-05 11:49:50.815 9049 INFO migrate.versioning.api [-] 34 -> 35... 
2016-08-05 11:49:51.035 9049 INFO migrate.versioning.api [-] done
2016-08-05 11:49:51.035 9049 INFO migrate.versioning.api [-] 35 -> 36... 
2016-08-05 11:49:51.069 9049 INFO migrate.versioning.api [-] done
2016-08-05 11:49:51.069 9049 INFO migrate.versioning.api [-] 36 -> 37... 
2016-08-05 11:49:51.111 9049 INFO migrate.versioning.api [-] done
2016-08-05 11:49:51.111 9049 INFO migrate.versioning.api [-] 37 -> 38... 
2016-08-05 11:49:51.189 9049 INFO migrate.versioning.api [-] done
2016-08-05 11:49:51.189 9049 INFO migrate.versioning.api [-] 38 -> 39... 
2016-08-05 11:49:51.252 9049 INFO migrate.versioning.api [-] done
2016-08-05 11:49:51.252 9049 INFO migrate.versioning.api [-] 39 -> 40... 
2016-08-05 11:49:51.290 9049 INFO migrate.versioning.api [-] done
2016-08-05 11:49:51.290 9049 INFO migrate.versioning.api [-] 40 -> 41... 
2016-08-05 11:49:51.300 9049 INFO migrate.versioning.api [-] done
2016-08-05 11:49:51.300 9049 INFO migrate.versioning.api [-] 41 -> 42... 
2016-08-05 11:49:51.369 9049 INFO migrate.versioning.api [-] done
2016-08-05 11:49:51.369 9049 INFO migrate.versioning.api [-] 42 -> 43... 
2016-08-05 11:49:51.382 9049 INFO migrate.versioning.api [-] done
2016-08-05 11:49:51.382 9049 INFO migrate.versioning.api [-] 43 -> 44... 
2016-08-05 11:49:51.454 9049 INFO migrate.versioning.api [-] done
2016-08-05 11:49:51.454 9049 INFO migrate.versioning.api [-] 44 -> 45... 
2016-08-05 11:49:51.492 9049 INFO migrate.versioning.api [-] done
2016-08-05 11:49:51.493 9049 INFO migrate.versioning.api [-] 45 -> 46... 
2016-08-05 11:49:51.527 9049 INFO migrate.versioning.api [-] done
2016-08-05 11:49:51.527 9049 INFO migrate.versioning.api [-] 46 -> 47... 
2016-08-05 11:49:51.572 9049 INFO migrate.versioning.api [-] done
2016-08-05 11:49:51.572 9049 INFO migrate.versioning.api [-] 47 -> 48... 
2016-08-05 11:49:51.604 9049 INFO migrate.versioning.api [-] done
2016-08-05 11:49:51.604 9049 INFO migrate.versioning.api [-] 48 -> 49... 
2016-08-05 11:49:51.628 9049 INFO migrate.versioning.api [-] done
2016-08-05 11:49:51.628 9049 INFO migrate.versioning.api [-] 49 -> 50... 
2016-08-05 11:49:51.673 9049 INFO migrate.versioning.api [-] done
2016-08-05 11:49:51.673 9049 INFO migrate.versioning.api [-] 50 -> 51... 
2016-08-05 11:49:51.691 9049 INFO migrate.versioning.api [-] done
2016-08-05 11:49:51.691 9049 INFO migrate.versioning.api [-] 51 -> 52... 
2016-08-05 11:49:51.732 9049 INFO migrate.versioning.api [-] done
2016-08-05 11:49:51.732 9049 INFO migrate.versioning.api [-] 52 -> 53... 
2016-08-05 11:49:51.817 9049 INFO migrate.versioning.api [-] done
2016-08-05 11:49:51.817 9049 INFO migrate.versioning.api [-] 53 -> 54... 
2016-08-05 11:49:51.903 9049 INFO migrate.versioning.api [-] done
2016-08-05 11:49:51.903 9049 INFO migrate.versioning.api [-] 54 -> 55... 
2016-08-05 11:49:52.052 9049 INFO migrate.versioning.api [-] done
2016-08-05 11:49:52.052 9049 INFO migrate.versioning.api [-] 55 -> 56... 
2016-08-05 11:49:52.167 9049 INFO migrate.versioning.api [-] done
2016-08-05 11:49:52.167 9049 INFO migrate.versioning.api [-] 56 -> 57... 
2016-08-05 11:49:52.508 9049 INFO migrate.versioning.api [-] done
2016-08-05 11:49:52.508 9049 INFO migrate.versioning.api [-] 57 -> 58... 
2016-08-05 11:49:52.567 9049 INFO migrate.versioning.api [-] done
2016-08-05 11:49:52.567 9049 INFO migrate.versioning.api [-] 58 -> 59... 
2016-08-05 11:49:52.606 9049 INFO migrate.versioning.api [-] done
2016-08-05 11:49:52.606 9049 INFO migrate.versioning.api [-] 59 -> 60... 
2016-08-05 11:49:52.877 9049 INFO migrate.versioning.api [-] done
2016-08-05 11:49:52.877 9049 INFO migrate.versioning.api [-] 60 -> 61... 
2016-08-05 11:49:53.027 9049 INFO migrate.versioning.api [-] done
2016-08-05 11:49:53.027 9049 INFO migrate.versioning.api [-] 61 -> 62... 
2016-08-05 11:49:53.100 9049 INFO migrate.versioning.api [-] done
2016-08-05 11:49:53.101 9049 INFO migrate.versioning.api [-] 62 -> 63... 
2016-08-05 11:49:53.145 9049 INFO migrate.versioning.api [-] done
2016-08-05 11:49:53.146 9049 INFO migrate.versioning.api [-] 63 -> 64... 
2016-08-05 11:49:53.193 9049 INFO migrate.versioning.api [-] done
2016-08-05 11:49:53.193 9049 INFO migrate.versioning.api [-] 64 -> 65... 
2016-08-05 11:49:53.263 9049 INFO migrate.versioning.api [-] done


 

10.2.4啓動服務並設置自啓動

[root@comtroller1 ~]# systemctl enable openstack-heat-api.service  openstack-heat-api-cfn.service openstack-heat-engine.service
[root@comtroller1 ~]# systemctl start openstack-heat-api.service  openstack-heat-api-cfn.service openstack-heat-engine.service
10.3驗證
[root@comtroller1 ~]# . admin-openrc.sh 
[root@comtroller1 ~]# heat service-list  ###應當輸出4條heat-engine
+-------------+-------------+--------------------------------------+-------------+--------+----------------------------+--------+
| hostname    | binary      | engine_id                            | host        | topic  | updated_at                 | status |
+-------------+-------------+--------------------------------------+-------------+--------+----------------------------+--------+
| comtroller1 | heat-engine | 090bd064-0264-4f2f-9de4-b8b89439d266 | comtroller1 | engine | 2016-08-05T03:58:16.000000 | up     |
| comtroller1 | heat-engine | 46e6ce11-db92-4387-be4c-81a993171ef9 | comtroller1 | engine | 2016-08-05T03:58:16.000000 | up     |
| comtroller1 | heat-engine | 472170eb-c9fa-4ab7-a5d5-5f52005485ba | comtroller1 | engine | 2016-08-05T03:58:16.000000 | up     |
| comtroller1 | heat-engine | ed1e85f1-a636-41d4-9a3e-7a2a4813714e | comtroller1 | engine | 2016-08-05T03:58:16.000000 | up     |
+-------------+-------------+--------------------------------------+-------------+--------+----------------------------+--------+

10.4使用模板服務

10.4.1創建一個模板

[root@comtroller1 ~]# vi demo-template.yml
heat_template_version: 2015-10-15
description: Launch a basic instance using the ``m1.tiny`` flavor and one network.
parameters:
  ImageID:
    type: string
    description: Image to use for the instance.
  NetID:
    type: string
    description: Network ID to use for the instance.
resources:
  server:
    type: OS::Nova::Server
    properties:
      image: { get_param: ImageID }
      flavor: m1.tiny
      networks:
      - network: { get_param: NetID }
outputs:
  instance_name:
    description: Name of the instance.
    value: { get_attr: [ server, name ] }
  instance_ip:
    description: IP address of the instance.
    value: { get_attr: [ server, first_address ] }

10.4.2創建一個STACK

[root@comtroller1 ~]# . demo-openrc.sh 
[root@comtroller1 ~]# neutron net-list
+--------------------------------------+---------+-----------------------------------------------------+
| id                                   | name    | subnets                                             |
+--------------------------------------+---------+-----------------------------------------------------+
| 93be9f32-e1f2-4748-9198-cc4b1807006f | public  | d0d06707-5b6f-4ed9-bd8e-bd7c47cc17c8 192.168.1.0/24 |
| 498d8e70-0e7d-48c8-b4f8-6d400cbf47ea | private | 6eb05faa-2490-4ea1-ab14-bea169ae959f 172.16.1.0/24  |
+--------------------------------------+---------+-----------------------------------------------------+
[root@comtroller1 ~]# neutron net-list | awk '/ public / { print $2 }'
93be9f32-e1f2-4748-9198-cc4b1807006f
[root@comtroller1 ~]# export NET_ID=$(neutron net-list | awk '/ public / { print $2 }')
[root@comtroller1 ~]# echo $NET_ID
93be9f32-e1f2-4748-9198-cc4b1807006f
[root@comtroller1 ~]# heat stack-list
+--------------------------------------+------------+--------------------+---------------------+--------------+
| id                                   | stack_name | stack_status       | creation_time       | updated_time |
+--------------------------------------+------------+--------------------+---------------------+--------------+
| 4173d1fe-b574-4002-b708-637b23df88ff | stack      | CREATE_IN_PROGRESS | 2016-08-05T05:57:55 | None         |
+--------------------------------------+------------+--------------------+---------------------+--------------+
[root@comtroller1 ~]# heat stack-delete 4173d1fe-b574-4002-b708-637b23df88ff
+--------------------------------------+------------+--------------------+---------------------+--------------+
| id                                   | stack_name | stack_status       | creation_time       | updated_time |
+--------------------------------------+------------+--------------------+---------------------+--------------+
| 4173d1fe-b574-4002-b708-637b23df88ff | stack      | CREATE_IN_PROGRESS | 2016-08-05T05:57:55 | None         |
+--------------------------------------+------------+--------------------+---------------------+--------------+
[root@comtroller1 ~]# heat stack-list
+----+------------+--------------+---------------+--------------+
| id | stack_name | stack_status | creation_time | updated_time |
+----+------------+--------------+---------------+--------------+
+----+------------+--------------+---------------+--------------+
[root@comtroller1 ~]# heat stack-create -f demo-template.yml -P "ImageID=cirros;NetID=$NET_ID" stack  ###解決方法參考HEAT.CONF文檔中註釋部分,即將[keystone_authtoken]中auth_uri = http://controller1:5000/v3增加V3版本說明。
ERROR: Remote error: NotFound The resource could not be found. (HTTP 404)
[root@comtroller1 ~]# heat stack-create -f demo-template.yml -P "ImageID=cirros;NetID=$NET_ID" stack
+--------------------------------------+------------+--------------------+---------------------+--------------+
| id                                   | stack_name | stack_status       | creation_time       | updated_time |
+--------------------------------------+------------+--------------------+---------------------+--------------+
| b50f220f-a0ea-42cb-93db-a08361fb25ce | stack      | CREATE_IN_PROGRESS | 2016-08-05T08:25:25 | None         |
+--------------------------------------+------------+--------------------+---------------------+--------------+
[root@comtroller1 ~]# heat stack-list
+--------------------------------------+------------+-----------------+---------------------+--------------+
| id                                   | stack_name | stack_status    | creation_time       | updated_time |
+--------------------------------------+------------+-----------------+---------------------+--------------+
| b50f220f-a0ea-42cb-93db-a08361fb25ce | stack      | CREATE_COMPLETE | 2016-08-05T08:25:25 | None         |
+--------------------------------------+------------+-----------------+---------------------+--------------+
[root@comtroller1 ~]# heat output-show --all stack
[
  {
    "output_value": "stack-server-4bq2x7thmhpx", 
    "description": "Name of the instance.", 
    "output_key": "instance_name"
  }, 
  {
    "output_value": "192.168.1.243", 
    "description": "IP address of the instance.", 
    "output_key": "instance_ip"
  }
]
[root@comtroller1 ~]# nova list
+--------------------------------------+---------------------------+---------+------------+-------------+-----------------------------------+
| ID                                   | Name                      | Status  | Task State | Power State | Networks                          |
+--------------------------------------+---------------------------+---------+------------+-------------+-----------------------------------+
| 4aa43e3a-c963-4a53-b500-78fa6a6872c5 | private-instance          | SHUTOFF | -          | Shutdown    | private=172.16.1.3, 192.168.1.242 |
| 913a49d8-14c5-4770-89a9-404f86ffb0e7 | stack-server-4bq2x7thmhpx | ACTIVE  | -          | Running     | public=192.168.1.243              |
+--------------------------------------+---------------------------+---------+------------+-------------+-----------------------------------+


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章