2021年3月、FastHnadle2として、作り直しました。
https://github.com/kuritaka/fasthandle2
Python Fabricを使うのではなく、fhコマンドを自作しています。
#FastHandleとは
FastHandleは、サーバ構築、サーバテストのオペレーションをサポートするツールです。
サーバ構築をより早く、より正確にすることを目指して作っています。
自動化のために、Fabricコマンド、Expectコマンドなどを利用しています。
- 現状、こんな感じにしようという枠組みはできましたが、まだまだ作成途中です。動かないこともあると思いますが、少しずつ増やして、テストをしていきます。(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をどうぞ!