tmux自動化のPythonスクリプトを作成した

# **経緯**
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">tmux便利過ぎる・・・。なんで今まで使おうとしなかったのだろうか・・・orz</p>&mdash; としし@プログラマーになりたひ (@Tocyuki) <a href="https://twitter.com/Tocyuki/status/753445302149849089">2016年7月14日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

というわけで、最近使い始めたのですが、本番環境で運用しているサーバの台数が増えてきて、障害対応時などに複数台障害が発生していると、tmuxでセッション作成してウィンドウ作成して画面分割してを複数台手動でやるのはﾂﾗｲということでPythonの勉強がてら自動化してみました。

# **環境**
- tmux1.6.3
- CentOS6.7
- Python2.6.6

# **やりたいこと**
- 踏み台サーバへ自端末からSSH接続する
- 踏み台サーバで`tmux`を起動しシステム毎（サーバ10台程度）にセッションを作成
- 各セッションの各ウィンドウは3ペイン構成にする

# **スクリプト**
- ホスト一覧は`hosts.ini`に記述する

```py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import subprocess
import ConfigParser

inifile = ConfigParser.SafeConfigParser()
inifile.read("./hosts.ini")

for section in inifile.sections():
    cmd = "tmux new-session -s %s -d" % section
    subprocess.call(cmd, shell=True)
    for key, value in inifile.items(section):
        new_window = "tmux new-window -t %s" % section
        rename     = "tmux rename-window %s" % key
        ssh_0      = "tmux send-keys -t %s.0 'ssh %s' C-m" % (key, value)
        ssh_1      = "tmux send-keys -t %s.1 'ssh %s' C-m" % (key, value)
        ssh_2      = "tmux send-keys -t %s.2 'ssh %s' C-m" % (key, value)
        subprocess.call(new_window, shell=True)
        subprocess.call(rename, shell=True)
        subprocess.call("tmux split-window" ,shell=True)
        subprocess.call("tmux split-window -h" ,shell=True)
        subprocess.call(ssh_0, shell=True)
        subprocess.call(ssh_1, shell=True)
        subprocess.call(ssh_2, shell=True)
    else:
        # new-session分のウィンドウが不要なため削除
        # この処理がなんだかイケていない
        del_window = "tmux kill-window -t bash"
        subprocess.call(del_window, shell=True)
```

```ini:hosts.ini
[webserver]
centos01=192.168.5.11
centos02=192.168.5.12
centos03=192.168.5.13
centos04=192.168.5.14
centos05=192.168.5.15
centos06=192.168.5.16

[database]
centos11=192.168.5.21
centos12=192.168.5.22
centos13=192.168.5.23
centos14=192.168.5.24
centos15=192.168.5.25
centos16=192.168.5.26
```

# **解説**
- 解説するまでもないカススクリプトですが、自分のための覚書として・・・＼(^o^)／

## **ConfigParser**
### `hosts.ini`のパーサモジュールとして`ConfigParser`モジュールを使います！
- 例えばこんなiniファイルがあった場合・・・。

```ini:hosts.ini
[webserver]
centos01=192.168.5.11
centos02=192.168.5.12
```

- こんな感じでタプルのデータ型で返してくれる！便利！

```pycon
>>> import ConfigParser
>>> inifile = ConfigParser.SafeConfigParser()
>>> inifile.read("./hosts.ini")
['./hosts.ini']
>>> print inifile.items("webserver")
[('centos01', '192.168.5.11'), ('centos02', '192.168.5.12')]
```

## **subprocess**
### `tmux`コマンド実行のために`subprocess`モジュールを使います！
- 外部コマンド実行のモジュールはいくつかあるけど、`subprocess`以外は現在推奨されていないようなのです！

```pycon:さっきの続き
>>> import subprocess
>>> for key, value in inifile.items("webserver"):
...     cmd = "echo %s : %s" % (key, value)
...     subprocess.call(cmd, shell=True)
...
centos01 : 192.168.5.11
0
centos02 : 192.168.5.12
0
```

## **tmux**
### 準備が整ったので`tmux`の以下のコマンド`subprosecc`モジュールを使ってを実行します！
```bash:新しいセッションを作成する
tmux new-session -s {session_name} -d
```

```bash:新しいウィンドウを作成する
tmux new-window -t {session_name}
```

```bash:ウィンドウ名の変更
tmux rename-window {window_name}
```

```bash:画面分割
tmux split-window
tmux split-window -h
```

```bash:各ペインでのSSH接続
tmux send-keys -t {window_name}.0 'ssh {IP}'
tmux send-keys -t {window_name}.1 'ssh {IP}'
tmux send-keys -t {window_name}.2 'ssh {IP}'
```

# **おわりに**
なんだか全然スマートな感じではないですが、とりあえず最低限の要件は満たせたので、あとは少しづつ改良していければ良いなという気持ちです。

Rubyも楽しいけどPythonも楽しいなぁ〜＼(^o^)／