Tech-circle #4 Consul勉強会 -Extra stage-

# Tech-circle #4 Consul勉強会 -Extra stage-

## おさらい
前回[consulクライアント](http://qiita.com/_BSmile_/items/fa6e6c19e05fec1bb52a#221-consul-client%E8%A8%AD%E5%AE%9A)起動時、/opt/consul/scripts/consul-client-start.shを実行するようになっていました。
このスクリプトは、初期起動時にnginxの初期設定を行いconsul agentを起動するというものです。

    /opt/consul/scripts/consul-client-start.sh

```bash
#!/bin/bash

CONSUL_SV=$1

/bin/cp -rp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.org
/bin/sed -i -e "s/nginx!/$HOSTNAME/g" /usr/share/nginx/html/index.html

/usr/sbin/service nginx start

/usr/local/bin/consul agent \
-node=$HOSTNAME \
-data-dir=/opt/consul/dat \
-config-file=/opt/consul/conf \
-ui-dir=/opt/consul/webui/dist \
-client="0.0.0.0" \
-join=$CONSUL_SV
```

この中で、[-config-file=/opt/consul/conf]というオプションがあり
定期監視し状態を送信する為のjsonファイルがディレクトリに配置されています。

```bash
$ sudo docker exec consul-cl1 ls /opt/consul/conf/
nginx.json
```

※注意：下記httpチェックは旧来(consul version 0.3以前)のやり方となっております。今現在、動作的に問題があるわけではありませんがイケてはいないです。

```bash
{
  "service": {
    "name": "http",
    "tags": [ "nginx" ],
    "port": 80,
    "check": {
      "script": "curl -LI localhost:80 -o /dev/null -w '%{http_code}\n' -s",
      "interval": "10s"
    }
  }
}
```

## HTTP APIを使用してサービス監視を増やす
新たにチェック対象を増やしたい場合は、上記のようなjsonファイルを[-config-file(-config-dir)]で指定する事で行えます。
※ファイルを追加した場合は、[consul reload]コマンドで再読み込みが必要です。

ですが、100台・200台と追加していった場合にchef等の構成管理ツールを使わなければ配布は非常に面倒ですよね。
そういう時は、HTTP APIを使用し外から登録という手もあります。
試しに、consul-sv1のシステムディスク使用量をチェックしてみましょう。
※下記curlのIPアドレスは適宜読み替えてください。

```bash
$ curl -s -X PUT http://172.17.0.2:8500/v1/agent/service/register -d '
{
  "ID": "system",
  "Name": "df",
  "Tags": [
    "system",
    "disk"
  ],
  "Address": "127.0.0.1",
  "Check": {
    "Script": "LANG=C;df -h",
    "Interval": "10s" 
  }             
}
'
```

再びconsulのweb-uiを見ると、consul-sv1のservice checkに'df'checkが追加されました。

![Screenshot 2015-03-24 11:44:02.png](https://qiita-image-store.s3.amazonaws.com/0/47801/2d76ecc4-dcfb-8338-3b29-1a584d134554.png)

DNSでも参照できます。

```bash
$ dig @172.17.0.2 -p 8600 df.service.consul SRV

; <<>> DiG 9.9.5-3ubuntu0.2-Ubuntu <<>> @172.17.0.2 -p 8600 df.service.consul SRV
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42964
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 2
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;df.service.consul.		IN	SRV

;; ANSWER SECTION:
df.service.consul.	0	IN	SRV	1 1 0 consul-sv.node.dc1.consul.
df.service.consul.	0	IN	SRV	1 1 0 01412ac451a2.node.dc1.consul.

;; ADDITIONAL SECTION:
consul-sv.node.dc1.consul. 0	IN	A	127.0.0.1
01412ac451a2.node.dc1.consul. 0	IN	A	127.0.0.1

;; Query time: 2 msec
;; SERVER: 172.17.0.2#8600(172.17.0.2)
;; WHEN: Tue Mar 24 11:47:53 JST 2015
;; MSG SIZE  rcvd: 247
```

## まとめ
HTTP APIを利用する事でほぼ全ての事が行えます。
裏を返せば悪用も簡単にされます。

今回のセミナーでは簡単にポートを開放し、簡単に使って頂いてますが
簡単であるが故のリスクを忘れないようにして下さい。

### リスクに対する参照先
IPA 情報セキュリティ対策
http://www.ipa.go.jp/security/measures/


------

## おまけ
hashicorpのドキュメントが見づらいと思われるかたも良くいらっしゃいますが
サンプルも多くあったりします。
この手順も下記を参考にしながら行う事が出来ますので、皆さんで応用し実践してみてください。
https://www.consul.io/docs/agent/http/agent.html#agent_services