Create a gist now

Instantly share code, notes, and snippets.

@kurochan /ictsc9-p1.md Secret
Created Dec 19, 2017

Embed
【公開用】ICTSC9予選 問1

問1. Server

問題説明

Linuxサーバ構築をしてみましょう! 今回はWebサーバを構築してもらいたいと思います。

まずはサーバにログインするためにsshをしましょう。 接続先がチームごとに異なりますので、接続するための情報はお配りした物をつかってください。

sshが成功すると、

ictsc@my-pc:~$ ssh ubuntu@xx.xx.xx.xx -p 10000
ubuntu@team00-c000:~$

2行目のようなシェルが表示されるはずです。このサーバはこれから構築してもらうサーバへ接続するための、”踏み台”となるサーバです。手元PC → 踏み台サーバ → 構築対象サーバのように2段階で接続します。試しにQ1で構築するサーバに接続してみましょう。

ubuntu@team00-c000:~$ ssh team00-c001
ubuntu@team00-c001:~$

ここではteam00となっていますが、00の部分はあなたのチーム番号で読み替えて下さい。PRE01であればteam01-c001となります。パスワードはお配りしたものです。ポート番号は指定なし(22番)です。 さっそく、nginxというwebサーバアプリケーションをインストールしましょう。今回はubuntuというLinuxディストリビューションですので、aptというパッケージマネージャを使います。

ubuntu@team00-c001:~$ sudo apt install nginx
[略]
Do you want to continue? [Y/n] y
[略]
ubuntu@team00-c001:~$

途中で本当にインストールするかどうか聞かれますので、”y”を押して続行しましょう。これだけでnginxのインストールが完了しました。実際に運用するには設定ファイルを標準の物から書き換える必要があるかもしれません。

確認をしてみましょう。今回構築してもらうサーバはインターネットからは直接アクセスできないネットワークにあるので(そのために踏み台サーバを経由しました)、curlというコマンドを踏み台サーバから叩いてみて、httpレスポンスが返ってくるかを確認します。

ubuntu@team00-c001:~$ logout
Connection to team26-c001 closed.
ubuntu@team00-c000:~$

logoutと打つとサーバとの接続が終了し、踏み台サーバのシェルに戻ってきます。exitと打ってもよいですし、ctrl+Dを押しても抜けられます。

ubuntu@team00-c000:~$ curl http://team00-c001
[略]
<p><em>Thank you for using nginx.</em></p>
</body>
</html>

curlコマンドの引数は構築したwebサーバです。team00の00の部分はさきほど同様にチーム番号で読み替えてください。HTMLが返ってくれば構築成功です。(これで少し得点もゲットです!)

ここからは具体的なコマンドは指示しません。問題で指定された構成を実現してください。 これ以降もteam00の00の部分はチーム番号で読み替えてください。

Q1. Webサーバを構築しましょう

http://xx.xx.xx.xx/hostname.json これは構築してほしいwebサーバのサンプルURLです。特別にインターネットからアクセスできるようにしてあります。

ubuntu@team00-c000:~$ curl http://xx.xx.xx.xx/hostname.json
{"hostname": "team00-c001"}

試しにcurlコマンドでアクセスしてみると、このようなJSON形式の文字列が返ってきます。 curlコマンドに-vオプションをつけると、HTTPヘッダなどが見られます。HTMLではなく、json形式の文字列なので、Content-TypeというHTTPヘッダがapplication/jsonとなっているのがわかります。

ubuntu@team00-c000:~$ curl -v http://xx.xx.xx.xx/hostname.json
*   Trying xx.xx.xx.xx...
* Connected to xx.xx.xx.xx (xx.xx.xx.xx) port 80 (#0)
> GET /hostname.json HTTP/1.1
> Host: xx.xx.xx.xx
> User-Agent: curl/7.47.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: nginx/1.10.3 (Ubuntu)
< Date: Fri, 15 Dec 2017 22:57:02 GMT
< Content-Type: application/json
< Content-Length: 28
< Last-Modified: Fri, 15 Dec 2017 22:25:07 GMT
< Connection: keep-alive
< ETag: "5a344bc3-1c"
< Accept-Ranges: bytes
<
{"hostname": "team00-c001"}
* Connection #0 to host xxx.xx.xx.xx left intact

このように、踏み台サーバから http://team00-c001/hostname.json にアクセスすると、サーバ自身のhostnameを返すようにしてください。たとえば、team88-c001というhostnameであれば、

{"hostname": "team88-c001"}

というJSONを返します。

Q2. Webサーバをもっと構築しましょう

実は今回はサーバを1チームあたり100台用意しています。 team00-c001, team00-c002, … team00-c100までcのあとが連番になるようなホスト名になっています。Q1と同じ仕様のものをteam00-c002 ~ team00-c100まで構築してください。レスポンスされるJSONのhostnameフィールドは実際のhostnameを表しているので、サーバによって違うレスポンスが返ってくるはずです。

解答方法

与えられた環境を操作して、実際に要件を満たすサーバを構築してください。環境構築で必要であれば踏み台サーバにパッケージやツール類をインストールしても構いません。 構築するためにどんな操作を行ったのか、メールで報告してください。報告をもって構築完了とみなします。また、構築できなかった場合もできたところまでを報告してください。 予選終了時間になったら全サーバからログアウトし、一切操作を行わないでください。 接続を監視しているため、予選終了後にも操作が確認された場合は減点になる場合があります。

余談

パスワードなしでサーバにログインするには公開鍵認証が安全で便利です。公開鍵を転送するにはssh-copy-idコマンドがよくつかわれます。それ以外にもパスワードの入力操作を省くためにsshpassコマンドというものもあります。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment