티스토리 뷰

안녕하세요~!!


오늘은 날씨가 매우 춥습니다. 아침엔 눈도 내렸구요~!! 바람도 쌩쌩 불어요. 이제 겨울이 성큼 우리들 앞으로 온 것만 같습니다. 이럴때일수록 옷도 따뜻하게 입고, 마음도 따뜻하게 가져야 할 것 같습니다. 이제 2014년도 한달밖에 남지 않았습니다. 한해를 잘 마무리하고 다가오는 새해를 잘 맞이해야겠죠~!! 그런 의미로 오늘은 지난시간에 이어 Keystone을 설치해 볼까합니다.


그럼, 시작해 볼까요~!!


Keystone 설치

오픈스택의 모든 서비스를 사용하려면 인증이 필요합니다. 인증은 Keystone이 담당하며, 오픈스택 서비스 중 가장 먼저 설치되는 서비스입니다.

 

1.     apt-get을 이용하여 keystone을 설치합니다.

$ sudo apt-get install keystone python-keystoneclient

** "오픈스택을 다루는 기술"에서 python-keystoneclient 설치부분을 설치해야 하는데 설치하지 않고 keystone만 설치하도록 되어 있었습니다. Keystone User 생성이 잘 되지 않는다며 어느 독자분께서 메일을 주셔서 확인해 보니, python-keystoneclient 설치 부분이 빠져 있었습니다. 아마도 편집하는 과정에서 누락이 있었던 것 같습니다 . 이번에도 역시 넓은 마음으로 이해해 주시면 정말정말 감사하겠습니다~!!  


2.     Keystone 설치가 완료되면 keystone.conf 파일의 데이터베이스 파트를 수정합니다. keystone.conf 파일의 기본 데이터베이스가 sqlite3로 되어 있는데, mysql을 사용할 것이므로 설치할 mysql 정보를 입력합니다.

$ sudo vi /etc/keystone/keystone.conf
...
[database]
#
# Options defined in keystone.openstack.common.db.options
#
connection = mysql://keystone:keystonedbpass@10.10.15.11/keystone
...

 

3.     이제 기본 데이터베이스는 mysql이므로 불필요한 keystone.db 파일은 삭제합니다.

$ sudo rm /var/lib/keystone/keystone.db

 

4.     환경설정이 완료되면 mysql에 접속해서 keystone 데이터베이스와 사용자 계정 및 패스워드를 생성합니다. 이때 사용자 계정은 현재 설치되어 있는 컨트롤러 노드와 다른 노드에서도 접근할 수 있도록 권한을 할당합니다.

$ mysql -u root -p
mysql> CREATE DATABASE keystone;
Query OK, 1 row affected (0.00 sec)
 
mysql> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' \
IDENTIFIED BY 'keystonedbpass’;
Query OK, 0 rows affected (0.00 sec)
 
mysql> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' \
IDENTIFIED BY 'keystonedbpass';
Query OK, 0 rows affected (0.00 sec)
 
mysql> exit
Bye

 

5.     Keystone 계정 생성이 완료되면 keystone에서 필요한 테이블을 만들어야 합니다. 테이블 생성은 keystone-manage db_sync 명령을 이용합니다.

$ sudo su -s /bin/sh -c "keystone-manage db_sync" keystone

 

6.     Keystone admin token이 필요한데 openssl rand 명령을 이용해서 생성된 임의의 문자열을 사용합니다.

$ openssl rand -hex 10
527e30fb91e0720d6105

 

7.     생성한 임의의 문자열은 /etc/keystone/keystone.conf 파일의 admin_token에 입력합니다. 그리고 log_dir을 다음과 같이 설정합니다.

$ sudo vi /etc/keystone/keystone.conf
[DEFAULT]
…
admin_token = 527e30fb91e0720d6105 #ADMIN_TOKEN
…
log_dir = /var/log/keystone

 

8.     환경설정이 완료되면 keystone 서비스를 재 시작합니다.

$ sudo service keystone restart

 


Keystone 설치 많이 어렵지 않죠? ^^


keystone 사용자, 테넌트, 롤 그리고 endpoint 생성

keystone 설치가 완료되면 오픈스택의 다른 서비스를 설치하고 사용하기 위해서 사용자, 테넌트, , endpoint를 생성해야 합니다. 그럼 지금부터 하나씩 생성하겠습니다.

 

1.     OS_SERVICE_TOKENOS_SERVICE_ENDPOINTexport합니다.

$ export OS_SERVICE_TOKEN=527e30fb91e0720d6105 #이건 ADMIN_TOKEN이예요
$ export OS_SERVICE_ENDPOINT=http://10.10.15.11:35357/v2.0

 

2.     keystone user-create 명령어로 다음과 같이 사용자 계정, 패스워드, 이메일을 입력해서 admin 계정을 생성합니다.

$ keystone user-create --name=admin --pass=adminpass --email=admin@email.com +----------+----------------------------------+ | Property | Value | +----------+----------------------------------+ | email | admin@email.com | | enabled | True | | id | 4df70ebaab6b417887141772dbd2aca0 | | name | admin | | username | admin | +----------+----------------------------------+

  

3.     이번에는 admin 롤을 다음과 같이 생성합니다.

$ keystone role-create --name=admin
+----------+------------------------------------------+
| Property  |              Value                             |
+----------+------------------------------------------+
|    id        | 82b49e5619f54357bf5f637c51dcfe2d |
|   name    |              admin                            |
+----------+------------------------------------------+

 

4.     Member 롤도 생성합니다.

$ keystone role-create --name=member
+----------+----------------------------------+
| Property |              Value               |
+----------+----------------------------------+
|    id    | 3eea2b0832ec499d962e4cf1872e72b9 |
|   name   |              member              |
+----------+----------------------------------+

 

5.     Admin 사용자와 롤 생성이 완료되었으면 admin 테넌트를 다음과 같이 생성합니다.

$ keystone tenant-create --name=admin --description="Admin Tenant"
+-------------+----------------------------------+
|   Property  |              Value               |
+-------------+----------------------------------+
| description |           Admin Tenant           |
|   enabled   |               True               |
|      id     | 7175efd4d22e41aa8903b0cab45ffaa6 |
|     name    |              admin               |
+-------------+----------------------------------+

 

6.     Admin 테넌트에 admin 사용자 계정과 admin 롤을 추가합니다.

$ keystone user-role-add --user admin --role admin --tenant admin

 

7.     이번에는 admin 테넌트에 admin 사용자 계정과 member 롤을 추가합니다.

$ keystone user-role-add --user admin --role member --tenant admin

 

8.     다시 처음으로 돌아와 demo 계정을 다음과 같이 생성합니다.

$ keystone user-create --name=demo --pass=demopass --email=demo@email.com
+----------+----------------------------------+
| Property |              Value               |
+----------+----------------------------------+
|  email   |          demo@email.com          |
| enabled  |               True               |
|    id    | a9f042c03887419c95c1f75a0788668f |
|   name   |               demo               |
| username |               demo               |
+----------+----------------------------------+

 

9.     Demo 테넌트도 생성합니다.

$ keystone tenant-create --name=demo --description="Demo Tenant"
+-------------+----------------------------------+
|   Property  |              Value               |
+-------------+----------------------------------+
| description |           Demo Tenant            |
|   enabled   |               True               |
|      id     | 479ed5a7670c4215981ffbf231b923cc |
|     name    |               demo               |
+-------------+----------------------------------+

 

10.  방금 생성한 Demo 계정은 Demo 테넌트에 추가하고 롤은 member를 설정합니다.

$ keystone user-role-add --user=demo --role=member --tenant=demo

 

11.  이번에는 오픈스택 서비스를 위한 서비스 테넌트를 다음과 같이 생성합니다.

$ keystone tenant-create --name=service --description="Service Tenant"
+-------------+----------------------------------+
|   Property  |              Value               |
+-------------+----------------------------------+
| description |          Service Tenant          |
|   enabled   |               True               |
|      id     | 850e02e81d02499eaf1e726147ac0640 |
|     name    |             service              |
+-------------+----------------------------------+

 

12.  서비스 테넌트가 생성되면 이번에는 keystone 서비스를 다음과 같이 생성합니다.

$ keystone service-create --name=keystone \n
--type=identity \n
--description="OpenStack Identity"
+-------------+----------------------------------+
|   Property  |              Value               |
+-------------+----------------------------------+
| description |        OpenStack Identity        |
|   enabled   |               True               |
|      id     | 09a4291a19d24cff9aa8377a4383f750 |
|     name    |             keystone             |
|     type    |             identity             |
+-------------+----------------------------------+

 

13.  생성된 서비스는 사용자나 다른 서비스가 접속할 수 있도록 Rest API 주소를 생성합니다. 이때 필요한 파라메터는 방금 생성한 서비스의 ID, 외부에서 접속되는 Public URL, 내부에서 접속할 Internal URL, 관리자가 접속할 Admin URL로 이루어집니다.

$ keystone endpoint-create --service_id=09a4291a19d24cff9aa8377a4383f750 \n
--publicurl=http://10.10.15.11:5000/v2.0 \n
--internalurl=http://10.10.15.11:5000/v2.0 \n
--adminurl=http://10.10.15.11:35357/v2.0
+-------------+----------------------------------+
|   Property  |              Value               |
+-------------+----------------------------------+
|   adminurl  |  http://10.10.15.11:35357/v2.0   |
|      id     | 5c5ba0e744a54aebb8781192a2c22cf2 |
| internalurl |   http://10.10.15.11:5000/v2.0   |
|  publicurl  |   http://10.10.15.11:5000/v2.0   |
|    region   |            regionOne             |
|  service_id | 09a4291a19d24cff9aa8377a4383f750 |
+-------------+----------------------------------+


14.  EndPoint URL까지 생성이 잘 되었으면 admin 계정을 생성할 당시 추가했던 OS_SERVICE_TOKENOS_SERVICE_ENDPOINT를 환경변수에서 해제합니다.

$ unset OS_SERVICE_TOKEN OS_SERVICE_ENDPOINT

 

15.  Keystone 서비스가 정상적으로 실행되는지 테스트하려면 username, password, auth-url을 입력하고 token을 달라는 명령어를 실행합니다. 이때 auth-url은 앞서 생성한 EndPont URL을 입력합니다. Token이 정상적으로 발급된다면 keystone이 정상적으로 설치된 것입니다.

$ keystone --os-username=admin --os-password=adminpass 
--os-auth-url=http://10.10.15.11:35357/v2.0 token-get
+----------+-----------------------------------------------------------------------+
| Property | Value                                                                 |
+----------+-----------------------------------------------------------------------+
| expires  | 2014-05-27T09:10:54Z                                                  |
|    id    | MIIC8QYJKoZIhvcNAQcCoIIC4jCCAt4CAQExCTAHBgUrDgMCGjCCAUcGCSqGSIb3DQEHAa
CCATgEggE0eyJhY2Nlc3MiOiB7InRva2VuIjogeyJpc3N1ZWRfYXQiOiAiMjAxNC0wNS0yN1QwODoxMDo1NC
4zOTU0MDAiLCAiZXhwaXJlcyI6ICIyMDE0LTA1LTI3VDA5OjEwOjU0WiIsICJpZCI6ICJwbGFjZWhvbGRlci
J9LCAic2VydmljZUNhdGFsb2ciOiBbXSwgInVzZXIiOiB7InVzZXJuYW1lIjogImFkbWluIiwgInJvbGVzX2
xpbmtzIjogW10sICJpZCI6ICI0ZGY3MGViYWFiNmI0MTc4ODcxNDE3NzJkYmQyYWNhMCIsICJyb2xlcyI6IFt
dLCAibmFtZSI6ICJhZG1pbiJ9LCAibWV0YWRhdGEiOiB7ImlzX2FkbWluIjogMCwgInJvbGVzIjogW119fX0x
ggGBMIIBfQIBATBcMFcxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVVbnNldDEOMAwGA1UEBwwFVW5zZXQxDjAMB
gNVBAoMBVVuc2V0MRgwFgYDVQQDDA93d3cuZXhhbXBsZS5jb20CAQEwBwYFKw4DAhowDQYJKoZIhvcNAQEBBQA
EggEAidnVAhAHerr-94ZwNlEkzEgUVnGxy6BEJoo91Vh1pq0jxFLfYFgezc4TcqwugOvw94nuDSDA2dco1IDMW
vcfYkNOYMcPE1AjhsDfqm3IF6wM-sgSGp8H6eDJR0FZ6zOtPECBdsz0RVfijjG6pOnxylgjyIE0Fjv+5c7VCOf
zeUDKH1oBHzYnDXhwLvuCP6wMhz+7sEzhwt3E2fq7vZLhIE9+9CSg33YI9dTmGSZVr+mvRKB+EEexRQa4eqMF
SYAKjQGNW7ZM4CIWXeXDyytWtAPep6y6ZpS5hQ5DPp2L+52m0918TK-aiVc0SRRdkpP9bqT8q4NBly9GiY0e
bO9E8w== |
| user_id  | 4df70ebaab6b417887141772dbd2aca0                                      |
+----------+-----------------------------------------------------------------------+

 

16.  서로 다른 테넌트에 속한 사용자 계정의 token을 얻어올 때는 username, password, tenant-name, auth-url을 파라메터로 입력합니다.

$ keystone --os-username=admin --os-password=adminpass --os-tenant-name=admin 

--os-auth-url=http://10.10.15.11:35357/v2.0 token-get

+-----------+------------------------------------------------------------------------+
|  Property |  Value                                                                 |
+-----------+------------------------------------------------------------------------+
|  expires  |  2014-05-27T09:12:42Z                                                  |
|     id    | MIIE7QYJKoZIhvcNAQcCoIIE3jCCBNoCAQExCTAHBgUrDgMCGjCCA0MGCSqGSIb3DQEHAaC
CAzQEggMweyJhY2Nlc3MiOiB7InRva2VuIjogeyJpc3N1ZWRfYXQiOiAiMjAxNC0wNS0yN1QwODoxMjo0Mi45
MzgwODYiLCAiZXhwaXJlcyI6ICIyMDE0LTA1LTI3VDA5OjEyOjQyWiIsICJpZCI6ICJwbGFjZWhvbGRlciIsI
CJ0ZW5hbnQiOiB7ImRlc2NyaXB0aW9uIjogIkFkbWluIFRlbmFudCIsICJlbmFibGVkIjogdHJ1ZSwgImlkIj
ogIjcxNzVlZmQ0ZDIyZTQxYWE4OTAzYjBjYWI0NWZmYWE2IiwgIm5hbWUiOiAiYWRtaW4ifX0sICJzZXJ2aWN
lQ2F0YWxvZyI6IFt7ImVuZHBvaW50cyI6IFt7ImFkbWluVVJMIjogImh0dHA6Ly8xMC4xMC4xNS4xMTozNTM1
Ny92Mi4wIiwgInJlZ2lvbiI6ICJyZWdpb25PbmUiLCAiaW50ZXJuYWxVUkwiOiAiaHR0cDovLzEwLjEwLjE1Lj
ExOjUwMDAvdjIuMCIsICJpZCI6ICIyNGUzMmJkYzBmYTg0NzU1ODk4Y2M5ZWIyZjg5ZTg4NiIsICJwdWJsaWNV
UkwiOiAiaHR0cDovLzEwLjEwLjE1LjExOjUwMDAvdjIuMCJ9XSwgImVuZHBvaW50c19saW5rcyI6IFtdLCAidHl
wZSI6ICJpZGVudGl0eSIsICJuYW1lIjogImtleXN0b25lIn1dLCAidXNlciI6IHsidXNlcm5hbWUiOiAiYWRta
W4iLCAicm9sZXNfbGlua3MiOiBbXSwgImlkIjogIjRkZjcwZWJhYWI2YjQxNzg4NzE0MTc3MmRiZDJhY2EwIi
wgInJvbGVzIjogW3sibmFtZSI6ICJtZW1iZXIifSwgeyJuYW1lIjogImFkbWluIn1dLCAibmFtZSI6ICJhZG1pb
iJ9LCAibWV0YWRhdGEiOiB7ImlzX2FkbWluIjogMCwgInJvbGVzIjogWyIzZWVhMmIwODMyZWM0OTlkOTYyZTRjZ
jE4NzJlNzJiOSIsICI4MmI0OWU1NjE5ZjU0MzU3YmY1ZjYzN2M1MWRjZmUyZCJdfX19MYIBgTCCAX0CAQEwXDBXMQ
swCQYDVQQGEwJVUzEOMAwGA1UECAwFVW5zZXQxDjAMBgNVBAcMBVVuc2V0MQ4wDAYDVQQKDAVVbnNldDEYMBYGA1
UEAwwPd3d3LmV4YW1wbGUuY29tAgEBMAcGBSsOAwIaMA0GCSqGSIb3DQEBAQUABIIBAF5rxlfYt6DKho87iRl+Dv
AZ+eDjLg5k9sIwYP6qvI3RunQ3EdC3g2Dj6J8IyruossRdaFTNxjGBQiddxF+9-zeCWE90rxG9E00+wG7Y8oXNlpf
JqHRZWiV6+C3IjN5h8tgcTXwCSJTv8dk+bs1-ZZEDbLmoEHvnoTwLVtzNDSLKz0g8blT9899j2NqfDUwO8EnamV4
vHhm08YU5A1JHZc4oNaMXM-gobMnopHuvRgCV38Bql25zHUICUYymd65sezY7bNkN0mn3HOtxndrbmf+q66S66f
zzNNxVRAzz8FLzAXhhtrKqVexF8unOQLH3spszIvsPubRJNFaK+-yB47Y= |
| tenant_id |  7175efd4d22e41aa8903b0cab45ffaa6                                      |
|  user_id  |  4df70ebaab6b417887141772dbd2aca0                                      |
+-----------+------------------------------------------------------------------------+

 

17.  이렇게 매번 사용자계정, 비밀번호, 패스워드, EndPont URL을 입력하고 인증을 해야만 한다면 매우 불편합니다. 그래서 다음과 같이 환경변수로 설정해 놓으면 파라메터 입력 없이 바로 오픈스택 명령어를 실행할 수 있습니다. 이때 환경변수를 쉽게 편집할 수 있게 vi 에디터로 파일을 만들어 저장해 둡니다.

$ vi admin-openrc.sh
export OS_USERNAME=admin
export OS_PASSWORD=adminpass
export OS_TENANT_NAME=admin
export OS_AUTH_URL=http://10.10.15.11:35357/v2.0

 

18.  Vi 에디터로 만든 환경변수 설정 파일은 다음과 같이 source export할 수 있습니다.

$ source admin-openrc.sh

 

19.  이제 파라메터 없이 바로 token을 얻어오겠습니다.

$ keystone token-get
+-----------+------------------------------------------------------------------------+
|  Property |  Value                                                                 |
+-----------+------------------------------------------------------------------------+
|  expires  |  2014-05-27T09:13:42Z                                                  |
|     id    | MIIE7QYJKoZIhvcNAQcCoIIE3jCCBNoCAQExCTAHBgUrDgMCGjCCA0MGCSqGSIb3DQEHAaC
CAzQEggMweyJhY2Nlc3MiOiB7InRva2VuIjogeyJpc3N1ZWRfYXQiOiAiMjAxNC0wNS0yN1QwODoxMzo0Mi4x
NTA0MDUiLCAiZXhwaXJlcyI6ICIyMDE0LTA1LTI3VDA5OjEzOjQyWiIsICJpZCI6ICJwbGFjZWhvbGRlciIsI
CJ0ZW5hbnQiOiB7ImRlc2NyaXB0aW9uIjogIkFkbWluIFRlbmFudCIsICJlbmFibGVkIjogdHJ1ZSwgImlkIj
ogIjcxNzVlZmQ0ZDIyZTQxYWE4OTAzYjBjYWI0NWZmYWE2IiwgIm5hbWUiOiAiYWRtaW4ifX0sICJzZXJ2aWN
lQ2F0YWxvZyI6IFt7ImVuZHBvaW50cyI6IFt7ImFkbWluVVJMIjogImh0dHA6Ly8xMC4xMC4xNS4xMTozNTM1
Ny92Mi4wIiwgInJlZ2lvbiI6ICJyZWdpb25PbmUiLCAiaW50ZXJuYWxVUkwiOiAiaHR0cDovLzEwLjEwLjE1L
jExOjUwMDAvdjIuMCIsICJpZCI6ICIyNGUzMmJkYzBmYTg0NzU1ODk4Y2M5ZWIyZjg5ZTg4NiIsICJwdWJsaW
NVUkwiOiAiaHR0cDovLzEwLjEwLjE1LjExOjUwMDAvdjIuMCJ9XSwgImVuZHBvaW50c19saW5rcyI6IFtdLCAi
dHlwZSI6ICJpZGVudGl0eSIsICJuYW1lIjogImtleXN0b25lIn1dLCAidXNlciI6IHsidXNlcm5hbWUiOiAiYW
RtaW4iLCAicm9sZXNfbGlua3MiOiBbXSwgImlkIjogIjRkZjcwZWJhYWI2YjQxNzg4NzE0MTc3MmRiZDJhY2Ew
IiwgInJvbGVzIjogW3sibmFtZSI6ICJtZW1iZXIifSwgeyJuYW1lIjogImFkbWluIn1dLCAibmFtZSI6ICJhZG1
pbiJ9LCAibWV0YWRhdGEiOiB7ImlzX2FkbWluIjogMCwgInJvbGVzIjogWyIzZWVhMmIwODMyZWM0OTlkOTYyZT
RjZjE4NzJlNzJiOSIsICI4MmI0OWU1NjE5ZjU0MzU3YmY1ZjYzN2M1MWRjZmUyZCJdfX19MYIBgTCCAX0CAQEw
XDBXMQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVW5zZXQxDjAMBgNVBAcMBVVuc2V0MQ4wDAYDVQQKDAVVbnNldD
EYMBYGA1UEAwwPd3d3LmV4YW1wbGUuY29tAgEBMAcGBSsOAwIaMA0GCSqGSIb3DQEBAQUABIIBAMzeUbt-hokR
op8qGVRN7L1BMHpDkh7UaUAK62ThFSV3ydu2zXR8tMGZcSS3lTxIL-0mrtoun44p2lX9x+9OPNldPKlC39cgyC
OnyFqb5kkdteXuD8JJiFq0klyNPzRtjKr6Vxxb4C3Xjf9tLJnzCuZKYBI9-F+oad0EOoaolLG-RNmD56AdGq3Qn
ly8MPi3EWeCIbHqTvXrVwBgOYUSYdUk32qEacw7atjxB1NdRzTpsmm7I261iEKhFTvBfCwQf6PH0AeNHSwpDIgQ
tJ6f6dlKJAKyKV1puFxUytymmPoLc3t9-IGB-rRDsOUnESGO3Ei11oQrv+FLGZ+62hGORjI= |
| tenant_id | 7175efd4d22e41aa8903b0cab45ffaa6                                       |
|  user_id  | 4df70ebaab6b417887141772dbd2aca0                                       |
+-----------+------------------------------------------------------------------------+

 

20.  사용자 목록도 확인합니다.

$ keystone user-list
+----------------------------------+-------+---------+-----------------+
|                id                |  name | enabled |      email      |
+----------------------------------+-------+---------+-----------------+
| 4df70ebaab6b417887141772dbd2aca0 | admin |   True  | admin@email.com |
| a9f042c03887419c95c1f75a0788668f |  demo |   True  |  demo@email.com |
+----------------------------------+-------+---------+-----------------+

 

21.  사용자가 가지고 있는 롤 목록도 확인합니다.

$ keystone user-role-list
+----------------------------------+--------+----------------------------------+----------------------------------+
|                id                |  name  |             user_id              |            tenant_id             |
+----------------------------------+--------+----------------------------------+----------------------------------+
| 82b49e5619f54357bf5f637c51dcfe2d | admin  | 4df70ebaab6b417887141772dbd2aca0 | 7175efd4d22e41aa8903b0cab45ffaa6 |
| 3eea2b0832ec499d962e4cf1872e72b9 | member | 4df70ebaab6b417887141772dbd2aca0 | 7175efd4d22e41aa8903b0cab45ffaa6 |
+----------------------------------+--------+----------------------------------+----------------------------------+

 

이렇게 해서 Keystone을 설치해 보았습니다. 다음시간에는 운영체제 이미지를 관리하는 Glance와 인스턴스를 관리하는 Nova를 설치해보도록 하겠습니다. 


그럼, 다음시간에 만나요~~~ ^^

최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함