FastHandleとは
FastHandleは、サーバ構築、サーバテストのオペレーションをサポートするツールです。
サーバ構築をより早く、より正確にすることを目指して作っています。
自動化のために、Fabricコマンド、Expectコマンドなどを利用しています。
- 現状、こんな感じにしようという枠組みはできましたが、まだまだ作成途中です。動かないこともあると思いますが、少しずつ増やして、テストをしていきます。(2018/01/11)
- 今はLinuxサーバ向けですが、Windowsサーバも検討していきたいと考えています。(2018/01/11)
目指していること
- サーバ構築をできる限り早くしたい
- サーバ構築のミスをなくしたい
- 公式サイトにある設定、コマンドを見ることで、Linuxの勉強になるようにしたい
- 私の今までの経験からのベストなサーバ設定を標準にしたい
特徴
- 1台から1000台規模までのサーバ構築
- 1台を構築する時にも使えるます。
- シンプル
- 新しく覚えることを少なく
- コンフィグを書かないでも使える。
- YAMLではないので、コマンドのコピペでもサーバ構築できます。
- 環境構築が楽
- Agentless
開発動機
- インフラエンジニアにとっては、サーバを正確に早く作ることが重要だと考えているので、それを極限まで高めるツールを作りたいと思いました。
- 仕事の限られた時間内では、なかなかよいツールを作ることができないので、時間をかけ、何度も修正しながらベストに近づけるように、個人で開発することにしました。
- 世間では、サーバをAnsibleで構築して、Serverspecでテストするようですが、私たちが普段やっているやり方の方が効率的ですので、体系化し広めたいと思いました。
- 私がよいと考えているサーバ構築の方法が、世界的に受け入れられるか、ただの独りよがりなのか確認したいと思いました。
サーバ構築、テストツールの比較、検討
当初、私は、今はやりのAnsibleで構築して、Serverspecでテストするようにしたいと思いましたが、
どうも私には合わなかったです。
他にも色々なツールを検討をしましたので、その時のメモです。
Ansible
短所
- ディレクトリとか設定ファイル多いよ。覚えづらい。
- 同じ内容をコピペして、サーバごとに書かないといけない。
- 1台だけとか今回だけとか、ちょっと作業したいときにも、playbook書くのかな。面倒だな。
- 独特の書き方(YAML)で書いていく必要があり、慣れが必要
- ちょっとした設定だけなのに、複数行の設定を書かないといけません。
- いちいちYAMLの書き方を調べないといけません。
- これがインフラをプログラミングするということなのかな。
- 対象サーバが多くなると、サーバのグルーピングがしずらいです。
- 同じような構成のサーバが何台もあれば管理しやすいですが、数台のグループが何十グループもあると管理しづらいです。
- 1つのサーバで、複数のグループに登録することがやりずらいです。
Ansible使うとしたら
- 共通の初期設定にだけAnsibleを使うのがいいのかな。
Serverspec
短所
- サーバごとにテスト書くのめんどくさいな。
- この設定がどうなっているか全サーバで確認したいなどがやりずらいです。
Chef
短所
- 難しい。
- 理解するのに時間がかかる。
- 環境構築するのも時間がかかる。
- インフラ全員がChefを使えるようになるのは、難しいだろう
Fabric
短所
- ホスト一覧の機能がないです。
- 数十台のサーバを同時に、作業しずらい。
- カンマでサーバをつなげるのにも、台数が多いとちょっと。。
- 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使うとしたら
- シェルスクリプトでサーバ一覧から対象サーバを抜き出してコマンド実行することはできそう。
- パスワードの自動化はExpectでできそう。
- でも、できるだけExpectで書きたくはない。
結論
僕にとっては、学習コストが少ないSSH + α くらいのツールがよいです。
検討した結果、僕は、以下の理由でFabricのコマンドを使わせてもらうことにしました。
- Fabricは、ツールというよりも、コマンドなので、必要に応じて使いやすい。
- Pythonで色々改善していけ、問題点も解決できる。
- すぐに環境構築できる
- 学習コストが低い
FastHandle紹介
基本的な使い方
$ fhghost.sh web hosts.lst | fab auth.pro user.chpasswd_devuser01_pro
$ fhghost.sh web hosts.lst <- どのサーバが対象か確認可能
- hosts.lstファイルのサーバ一覧に書かれているwebグループに対してコマンド実行
- auth.proで、production(本番)の認証
- ユーザとパスワードや鍵の設定は、事前にauth.pyに記載
- 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 auth.pro -- hostname
$ fab -H $H auth.pro -- "ip a |grep inet"
$ fab -H $H auth.pro -- egrep "*" /proc/net/bonding/bond*
$ fab -H $H auth.pro -- netstat -rn
$ fab -H $H auth.pro -- sudo nmap -Pn -sT -p 22 xx.xx.xx.xx #サーバ間でPort22で接続できるか確認
$ fab -H $H auth.pro -- sudo tcpdump udp port 53 -i any -W1 -G60 # DNSの問い合わせ状況を確認
$ fab -H $H auth.pro -- chronyc sources
$ fab -H $H auth.pro -- chronyc sources -v
$ fab -H $H auth.pro -- ntpq -p
コマンドの例などは下記参照
https://fasthandle.net/operation/remote-shell-commands.html
普通の構築ツールやテストツールではできない以下のようなこともできます。
サーバ再起動前と後での状態比較
OSを再起動すると、NTPの時刻ズレや、mountできていなかったりということがあると思いますが、
OS再起動前と再起動後に状態を取得して、差分を確認できます。
$ H=a.a.a.a
$ fab -H $H auth.pro check.reboot_check
$ fab -H $H auth.pro ope.reboot
$ fab -H $H auth.pro check.reboot_check
$ fab -H $H auth.pro ope.check_reboot_diff
$ fab -H $H auth.pro check.ping_gw <- 全ゲートウェイへの疎通確認
サーバ間の差分確認
サーバを増やしたり、サーバリプレースの際に、旧サーバと新サーバの違いをなくしたいものです。
FastHandleでは、サーバ設定を取得し、diffができます。
また、必要な情報は、簡単なシェルスクリプトで書かれていますので、必要に応じて、設定の追加ができます。
$ fab -H a.a.a.a auth.pro get.systeminfo
$ fab -H b.b.b.b auth.pro get.systeminfo
$
$ sdiff output/201709/systeminfo.server-a.20170910_1550 output/201709/systeminfo.server-b.20170910_1551
リモートサーバにあるファイルとローカルにあるファイルをdiff
$ fab -H x.x.x.x auth.pro 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をどうぞ!
↓はいつ頃準備ができるか、わかりますでしょうか?