AnsibleやServerspecより優れたサーバ構築・テストツールを作る[FastHandle]

FastHandleとは

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

https://fasthandle.net/

  • 現状、こんな感じにしようという枠組みはできましたが、まだまだ作成途中です。動かないこともあると思いますが、少しずつ増やして、テストをしていきます。(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をどうぞ!

26contribution

↓はいつ頃準備ができるか、わかりますでしょうか?

Installing FastHandle

We are preparing GitHub, please wait for a while.