72
71

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2018-01-10

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をどうぞ!
72
71
8

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
72
71

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?