Edited at

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


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でテストするようですが、私たちが普段やっているやり方の方が効率的ですので、体系化し広めたいと思いました。

  • 私がよいと考えているサーバ構築の方法が、世界的に受け入れられるか、ただの独りよがりなのか確認したいと思いました。



サーバ構築、テストツールの比較、検討

当初、私は、今はやりのAnsibleで構築して、Serverspecでテストするようにしたいと思いましたが、

どうも私には合わなかったです。

他にも色々なツールを検討をしましたので、その時のメモです。


Ansible


短所


  • ディレクトリとか設定ファイル多いよ。覚えづらい。


    • 同じ内容をコピペして、サーバごとに書かないといけない部分が多い。



  • サーバ設定のこの部分だけAnsibleでするというより、全てAnsibleで設定していく使い方


    • ちょっと使いたいとはできない。

    • インストールの状態から使えるまでにそれなりに準備が必要



  • YAMLで書いていく必要があり、慣れが必要


    • ちょっとした設定だけなのに、複数行の設定を書かないといけません。

    • いちいちYAMLの書き方を調べないといけません。

    • これがインフラをプログラミングするということなのかな。



  • 対象サーバが多くなると、サーバのグルーピングがしずらいです。


    • 1つのサーバで、複数のグループに登録することがやりずらいです。



  • バージョンアップのたびに、仕様が変わるので、常にAnsibleの勉強をする必要がある。


    • 僕は、Ansibleをマスターすることに時間をかけたくないな。




Serverspec


短所


  • サーバごとにテスト書くのめんどくさいな。


    • この設定がどうなっているか全サーバで確認したいなどがやりずらいです。




Chef


短所


  • 難しい。


    • 理解するのに時間がかかる。

    • 環境構築するのも時間がかかる。

    • インフラ全員がChefを使えるようになるのは、難しいだろう




Fabric


短所


  • サーバ台数が多いとロールによるホスト一覧が使いづらい。


  • Python3に対応しないのが今後の不安。 公式FabricもFabric2として、Python3対応。ただ色々変わってしまった。。


    • フォークしてPython3に対応している人はいます。



  • 構成管理ツールというか。コマンドだな。


長所


  • パスワードでも鍵でも、1台だけパスワードが違っていても大丈夫


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で色々改善していけ、問題点も解決できる。

  • すぐに環境構築できる

  • 学習コストが低い



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タスク




$ fab -l    <- タスクの一覧

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


ホスト一覧の例


  • ファイルの1列目のサーバを対象とします。

  • 1行1ホスト

  • 2列目以降は、なんでもよいです。何個でもグループを追加できます。

  • #はコメント

# 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




普通の構築ツールやテストツールではできない以下のようなこともできます。



サーバ再起動前と後での状態比較

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:リモートのファイルパス,ローカルのファイルパス




他にはこんなことも効率的にします。


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







詳細は公式サイトを参照ください。

https://fasthandle.net/

FastHandleをどうぞ!