fhコマンドで、効率的に複数台のLinuxサーバの構築・テスト・管理をする

fhコマンド作りました。

Python Fabricを真似て、リモートのサーバに対してデプロイするツールを、bashで作っています。
簡単なオプションで、リモートサーバに対して、コマンドを実行したり、シェルスクリプトを実行したりできます。
複数台のLinuxサーバを効率に設定したり、テストしたりできます。

GitHubで公開しています。
https://github.com/kuritaka/fasthandle2
https://github.com/kuritaka/fasthandle2-samples


##fhコマンドの利用例
色々な作業を自動化しましょう。

* リリースの作業を事前に準備しておき、リリースでは数行実行すればいいだけにする。
* サーバ台数が多い定期再起動を自動化する
* 何度も行う疎通確認を自動化する。結果判定も自動化する
* クラスターの起動し、ちゃんと起動したことを確認できるようにする

<br>

##fhコマンドの特徴

### 学習コストが低い（シンプル）

シンプルなオプションを心がけています。
「fh -h」を見れば、使い方がほぼ分かるようにしています。

fhコマンドは、簡単で、すぐに使えます。

事前学習や事前準備が、ほとんどいらないような使い方ができるので、
ちょっとだけ通信の確認に使ってみようかなという使い方ができます。
今回のリリースだけ使ってみようかなという使い方ができます。

### 環境依存が低い

シェルスクリプトなので、環境依存が低いです。
コードをコピペするだけで、どこでも動きます。
１０年後もずっと使えるはずです。


### 自力でトラブル解決がしやすい

実行するのは、シェルスクリプトなので、問題発生時に、なぜうまく動かなかったか調査しやすいです。
fhコマンド自身もシェルスクリプトで、問題発生時に修正もしやすいです。

### 学習に応用がきく

fhコマンドは、シェルスクリプトを実行するだけということは、シェルスクリプトを書けるようになることは必要です。
バックアップやアラートやその他自動化するために、シェルスクリプトを自由自在に書ける力がエンジニアには必要ですので、強くなりましょう。


<br>



## 操作例

### コマンド実行
```
fh -H host1 -c hostname         #host1に対して、hostnameコマンドを実行
fh -H host1,host2 -c hostname   #host1とhost2に対して、hostnameコマンドを実行
fh -H hostlist -c hostname      #hostlistに記載されているホストに対して、hostnameコマンド実行コマンド実行
fh -H host1 -s -c whoami        #host1に対して、sudoで、whoamiコマンドを実行
fh -H host1,host2 -s --vi FILE    #host1、host2に対して、sudo vi でファイル編集
fh -H hostlist --ping         #hostlistに記載のホストに対して、pingの疎通確認を実行
```

### シェル実行
```
fh -H host1 -f test.sh       #host1に対して、test.shシェルを実行
fh -H host1 -f test.sh:cmd_whoami     #host1に対して、test.shシェルを実行。cmd_whoamiが引数。
```


### ヘルプ

実際の使い方は、ヘルプを参照しながら使えてください。

```
$ fh -h
Usage: fh  [options]

Options:
    -h, --help                  show this help message and exit
    --version                   show program's version number and exit
    -v, --verbose               verbose mode
    -d, --debug                 debug mode
    -H HOST1[,HOST2], --hosts=HOST1[,HOST2], -H HOSTLISTFILE, --hosts=HOSTLISTFILE
                                comma-separated list of hosts or <HOSTLISTFILE> to operate on
    -o OUTPUTFILE, --output=OUTPUTFILE
                                Write output to bouth stdout and <OUTPUTFILE>
    -s, --sudo                  Execute command or shellscript with sudo
    -- COMMAND, -c COMMAND, --command=COMMAND
                                Execute COMMAND
    -f SHELLSCRIPT, --file=SHELLSCRIPT, -f SHELLSCRIPT1 SHELLSCRIPT2
                                Execute ShellScript
    --ping                      check ping test
    --login                     login remote host
    --vi FILE, --vi=FILE        edit the remote file
    --scp LOCLA_FILE REMOTE_DIR
                                transport file with scp

  Connection Options:
    control as whom and how to connect to hosts

    -u USER, --user=USER        username to use when connecting to remote hosts
    -p, --password, -p PASSWORD, --password=PASSWORD
                                ssh password
                                If you do not specify a password, an input field will appear. 
    -i PRIVATEKEY               SSH private key file.
    -P PORT, --port=PORT        Port to connect to on the remote host.


Usage:
  Execute Commnad in Local Host:
    fh -c uname -n
    fh -c 'uname -n; whoami'
    fh -c 'echo \$(uname -n)-------; whoami'
    fh -c whoami
    fh -c 'sudo whoami'
    fh -s -c whoami

  Execute ShellScript in Local Host:
    fh -f test.sh
    fh -f test.sh:cmd_whoami,uname_n
    fh -f test.sh:cmd_whoami,uname_n test2.sh:arg1,arg2
    fh -o outputfile -c uname -n

  Execute Command in Remote Host:
    fh -H host1 -c uname -n
    fh -H host1 -s -c whoami
    fh -H host1 -c sudo whoami
    fh -H host1 -c 'uname -n; whoami'
    fh -H host1 -c 'sudo uname -n; sudo whoami'
    fh -H host1 -s -c 'uname -n; whoami'
    fh -H host1 -c 'echo \$(uname -n)--------; whoami'
    fh -H host1 -s -c 'echo \$(uname -n)--------; whoami'
    fh -H host1,host2 -c uname -n
    fh -H host1,host2 -s -c uname -n

  Execute ShellScript in Remote Host:
    fh -H host1 -f test.sh:cmd_whoami
    fh -H host1 -s -f test.sh:cmd_whoami
    fh -H host1,host2 -f test.sh
    fh -H hostlist -f test.sh:cmd_whoami
    fh -H host1 -o outputfile -c uname -n

  Others
    fh -H host1 --ping
    fh -H host1 --login
    fh -H host1 --vi FILE
    fh -H host1 -s --vi FILE   #-s = with sudo
    fh -H host1 --scp LOCAL_FILE  REMOTEDIR
```