AnsibleやServerspecより使いやすいサーバ構築・テストツールを作る[FastHandle]

<br>

2021年3月、FastHnadle2として、作り直しました。
https://github.com/kuritaka/fasthandle2
Python Fabricを使うのではなく、fhコマンドを自作しています。

<br>

#FastHandleとは

FastHandleは、サーバ構築、サーバテストのオペレーションをサポートするツールです。
サーバ構築をより早く、より正確にすることを目指して作っています。
自動化のために、Fabricコマンド、Expectコマンドなどを利用しています。

https://fasthandle.net/

- 現状、こんな感じにしようという枠組みはできましたが、まだまだ作成途中です。動かないこともあると思いますが、少しずつ増やして、テストをしていきます。(2018/01/11)
- ~~今はLinuxサーバ向けですが、Windowsサーバも検討していきたいと考えています。(2018/01/11)~~
  - WindowsやVMwareやネットワーク機器でも動くようにしました。(2018/04/05)

##目指していること
- サーバ構築をできる限り早くしたい
- サーバ構築のミスをなくしたい
- 公式サイトにある設定、コマンドを見ることで、Linuxの勉強になるようにしたい
- 私の今までの経験からのベストなサーバ設定を標準にしたい

##特徴
- 1台から1000台規模までのサーバ構築
  - 1台を構築する時にも使えるます。
- シンプル
 - 新しく覚えることを少なく
 - コンフィグを書かないでも使える。
 - YAMLではないので、ソースにあるコマンドのコピペでもサーバ構築できます。
 - 環境構築が楽
 - Agentless
- 学習することで、どの会社に行っても活かせる知識が身に付く



##開発動機
- インフラエンジニアにとっては、サーバを正確に早く作ることが重要だと考えているので、それを極限まで高めるツールを作りたいと思いました。
- 仕事の限られた時間内では、なかなかよいツールを作ることができないので、時間をかけ、何度も修正しながらベストに近づけるように、個人で開発することにしました。
- 世間では、サーバをAnsibleで構築して、Serverspecでテストするようですが、私たちが普段やっているやり方の方が効率的ですので、体系化し広めたいと思いました。
- 私がよいと考えているサーバ構築の方法が、世界的に受け入れられるか、ただの独りよがりなのか確認したいと思いました。

<br>
#サーバ構築、テストツールの比較、検討
当初、私は、今はやりのAnsibleで構築して、Serverspecでテストするようにしたいと思いましたが、
どうも私には合わなかったです。
他にも色々なツールを検討をしましたので、その時のメモです。

##Ansible
###短所
- ディレクトリとか設定ファイル多いよ。覚えづらい。
  - 同じ内容をコピペして、サーバごとに書かないといけない部分が多い。
- サーバ設定のこの部分だけAnsibleでするというより、全てAnsibleで設定していく使い方
  - ちょっと使いたいとはできない。
  - インストールの状態から使えるまでにそれなりに準備が必要
- YAMLで書いていく必要があり、慣れが必要
 - ちょっとした設定だけなのに、複数行の設定を書かないといけません。
 - いちいちYAMLの書き方を調べないといけません。
   - これがインフラをプログラミングするということなのかな。
- 対象サーバが多くなると、サーバのグルーピングがしずらいです。
 - １つのサーバで、複数のグループに登録することがやりずらいです。
- バージョンアップのたびに、仕様が変わるので、常にAnsibleの勉強をする必要がある。
  - 僕は、Ansibleをマスターすることに時間をかけたくないな。

##Serverspec
###短所
- サーバごとにテスト書くのめんどくさいな。
  - この設定がどうなっているか全サーバで確認したいなどがやりずらいです。

##Chef
###短所
- 難しい。
 - 理解するのに時間がかかる。
 - 環境構築するのも時間がかかる。
 - インフラ全員がChefを使えるようになるのは、難しいだろう

##Fabric
###短所
- サーバ台数が多いとロールによるホスト一覧が使いづらい。
- ~~Python3に対応しないのが今後の不安。~~ 公式FabricもFabric2として、Python3対応。ただ色々変わってしまった。。
  - フォークしてPython3に対応している人はいます。
- 構成管理ツールというか。コマンドだな。

###長所
- パスワードでも鍵でも、１台だけパスワードが違っていても大丈夫


##ssh

```
■sshの例
ssh ホスト名 コマンド
ssh -i 鍵 ホスト名 コマンド
ssh  x.x.x.x sudo "bash -c 'echo \"any host 192.168.100.1 gw 192.168.0.5\" >> /etc/sysconfig/static-routes'"
for i in 192.168.0.1 192.168.0.2 ; do ssh -n $i "hostname" ; done
```

###短所
- 実行コマンドに付ける'や"など注意が必要だな。エスケープも注意しないと。
- 環境ごとにユーザやパスワードや鍵を変えるの大変だな。
- 対象台数が多いと大変。forでループするしかないかな。
- リモートサーバのコマンドを実行する時に、もう少し簡単にできる機能が欲しいな。
- パスフレーズなしSSH鍵が必要

###ssh使うとしたら
- シェルスクリプトでサーバ一覧から対象サーバを抜き出してコマンド実行することはできそう。
- パスワードの自動化はExpectでできそう。
  - でも、できるだけExpectで書きたくはない。

##結論
僕にとっては、学習コストが少ないSSH + α くらいのツールがよいです。
検討した結果、僕は、以下の理由でFabricのコマンドを使わせてもらうことにしました。

- Fabricは、ツールというよりも、コマンドなので、必要に応じて使いやすい。
- Pythonで色々改善していけ、問題点も解決できる。
- すぐに環境構築できる
- 学習コストが低い


<br>
#FastHandle紹介
##基本的な使い方
```
$ fhghost.sh web hosts.lst | fab  user.chpasswd_devuser01_pro
$ fhghost.sh web hosts.lst <- どのサーバが対象か確認可能
```

- hosts.lstファイルのサーバ一覧に書かれているwebグループに対してコマンド実行
- user.chpasswd_devuser01_proで、devuser01のパスワードを変更
  - user.pyに書かれたchpasswd_devuser01_proタスク

<br>

```
$ fab -l    <- タスクの一覧
$ fab -l   |grep XXXX    <- 設定によっては多いので、grepで絞りましょう。
```

## ホスト一覧の例
- ファイルの１列目のサーバを対象とします。
- １行１ホスト
- ２列目以降は、なんでもよいです。何個でもグループを追加できます。
- #はコメント

```
# web
test-web-01   web   reboot1
test-web-02   web   reboot2
test-web-03   web   reboot3
 
# ap
test-ap-01    ap    reboot1
test-ap-02    ap    reboot2
test-ap-03    ap    reboot3
 
#db
test-db-01    db    reboot1
test-db-02    ap    reboot2
```


##設定ファイルを書かないでも使える

設定ファイルを書かないでも、--の後に実行したいコマンドを書くとリモートから複数台同時に実行できます。
auth.proは、production（本番）のユーザ、パスワード情報です。auth.pyファイルです。

```
$ H=test-server-1,test-server-2
$ fab -H $H  -- hostname
$ fab -H $H  -- "ip a |grep inet"
$ fab -H $H  -- egrep  "*"  /proc/net/bonding/bond*
$ fab -H $H  -- netstat -rn
$ fab -H $H  -- sudo nmap -Pn -sT -p 22 xx.xx.xx.xx   #サーバ間でPort22で接続できるか確認
$ fab -H $H  -- sudo tcpdump  udp port 53 -i any  -W1 -G60  # DNSの問い合わせ状況を確認
$ fab -H $H  -- chronyc sources
$ fab -H $H  -- chronyc sources -v
$ fab -H $H  -- ntpq -p
```

コマンドの例などは下記参照
https://fasthandle.net/operation/remote-shell-commands.html

<br>
**普通の構築ツールやテストツールではできない以下のようなこともできます。**
<br>
##サーバ再起動前と後での状態比較
OSを再起動すると、NTPの時刻ズレや、mountできていなかったりということがあると思いますが、
OS再起動前と再起動後に状態を取得して、差分を確認できます。

```
$ H=a.a.a.a
$ fab -H $H  check.reboot_check
$ fab -H $H  ope.reboot
$ fab -H $H  check.reboot_check
$ fab -H $H  ope.check_reboot_diff

$ fab -H $H  check.ping_gw   <- 全ゲートウェイへの疎通確認
```


##サーバ間の差分確認
サーバを増やしたり、サーバリプレースの際に、旧サーバと新サーバの違いをなくしたいものです。
FastHandleでは、サーバ設定を取得し、diffができます。
また、必要な情報は、簡単なシェルスクリプトで書かれていますので、必要に応じて、設定の追加ができます。

```
$ fab -H a.a.a.a  get.systeminfo
$ fab -H b.b.b.b  get.systeminfo
$
$ sdiff output/201709/systeminfo.server-a.20170910_1550 output/201709/systeminfo.server-b.20170910_1551
```

##リモートサーバにあるファイルとローカルにあるファイルをdiff
```
$ fab -H x.x.x.x  get.sdiff_remote_local:/etc/hosts,/home/fasthandle/conf/etc/hosts.server1
```
get.sdiff_remote_local:リモートのファイルパス,ローカルのファイルパス

<br>
**他にはこんなことも効率的にします。**

##FastHandle Scriptsの例
https://fasthandle.net/index.html#fasthandle_scripts

```
■ログインの自動化をしましょう
$ fhssh.sh 192.168.0.10


■SSL証明書を作りましょう。
$ create_ssl_csr_key.sh  CNを書く
$ create_ssl_csr_key.sh  192.168.0.10


■SSHの鍵ペアを作りましょう
$ create_ssh_keypair.sh  user01  test-server-01


■パスワード設定後は、ログイン確認をしましょう
$ check_loginpass.exp  $IP $USER '$PASS'
$ check_loginpass.exp  192.168.0.10  user01 'testpass'


■ リストファイルに対して、疎通確認をしましょう。
$ fhping.sh test.list
127.0.0.1 is alive
192.168.10.1 is alive
192.168.10.2 is unreachable
```


<br>
<br>
詳細は公式サイトを参照ください。
https://fasthandle.net/
FastHandleをどうぞ！
<br>