◼︎ 概要
サーバ上で手順化されている作業を自動化してくれるFabricについてまとめます
便利で簡単なので勉強して損は無いかと思います
自分としても使い方などが気になっていたため入門の入門としてまとめます
◼︎ Fabricとは
- コマンドライン上で任意のPython関数を実行するツール
- 関数なので1回コマンドを実行するだけで複数のコマンドを実行することができる
- localホストのサーバへ実行することは勿論、remoteサーバに実行することができる
- remoteサーバ3台に実行させたい場合、並列で実行することができる
◼︎ インストール方法
$ sudo yum groupinstall "Development Tools" “Base” $ sudo yum install zlib-devel tk-devel tcl-devel sqlite-devel ncurses-devel gdbm-devel readline-devel bzip2-devel db4-devel openssl-devel python-setuptools python-devel $ sudo easy_install pip $ sudo pip install fabric $ sudo pip install setuptools --no-use-wheel --upgrade $ sudo pip uninstall pycrypto $ sudo pip install PyCrypto==2.3
動作確認
$ fab -V Fabric 1.10.2 Paramiko 1.16.0
◼︎ 使い方
fabfileを用意する
$ cat fabfile.py # -*- coding: utf-8 -*- from fabric.api import * from fabric.colors import * def hello(): # Hello world!を表示させるだけのタスク print("Hello world!") def test_task1(): # /tmp/testのファイルが何件あるか調べる run('ls -l /tmp/test | wc -l') # /tmp/testを作成(既に作成済みならタイムスタンプを更新) sudo('touch /tmp/test') # 完了した旨出力させる print(green("test_task1 complete!!")) def test_task2(): # /tmp/testを作成(既に作成済みならタイムスタンプを更新) sudo('touch /tmp/test') # /tmp/testtttttのファイルが作成されているか確認 if int(run('ls -l /tmp/testttttt 2>/dev/null | wc -l')) != 1: # 無かったらエラーを出して終了 abort(red("/tmp/testttttt file is not exists !!")) # 完了した旨出力させる print(green("test_task2 complete!!"))
このfileを用意したことで以下のタスクが存在する
$ fab -l Available commands: hello test_task1 test_task2
実際に使ってHellow world!を出力させる
// -I パスワードを最初に入力する // -H ホストを記述 $ fab -I hello -H localhost Initial value for env.password: [localhost] Executing task 'hello' Hello world! Done.
コマンドを複数記述したtest_task1を実行させる
順次実行して「test_task1 complete!!」が緑色の文字色で出力されていることを確認
Python形式に書けるのでif文も含めることができる
/tmp/testのファイルを作成したので/tmp/testtttttがないのは当然
abortしたことによってその後の処理は続かない
◼︎ fabfileの書き方
構文など書き方としてはpythonで記述できる
サンプルで出した例を見てもらうとわかる通りrun(‘コマンド’)とsudo(‘rootまたは別ユーザとして実行させるコマンド’)さえ覚えていればほとんど困らない
◼︎ remoteホストに対して実行する
以下のfabfileを用意する
$ cat fabfile.py # -*- coding: utf-8 -*- from fabric.api import * from fabric.colors import * def test_remote(): run('ls')
実行する
// -i 秘密鍵の指定 // -u SSHするユーザ名の指定 $ fab -I -H XXX.XXX.XXX.XXX -i ~/.ssh/id_rsa -u user test_remote Initial value for env.password: [52.193.114.144] Executing task 'test_remote' [52.193.114.144] run: ls [52.193.114.144] out: letsencrypt mysql_history [52.193.114.144] out: Done. Disconnecting from XXX.XXX.XXX.XXX ... done.
◼︎ 並列で実行する
-P オプションを付与させると並列で実行できる
// XXX.XXX.XXX.XXXとlocalhostに対して実行させる $ fab -I -P -H XXX.XXX.XXX.XXX,localhost -u user test_remote
コメントを書く
コメント一覧