fabricを使う時に調べたことのメモ。雑記。
EC2へのインストール
$sudo yum update -y
# もしpipがなければ
$sudo easy_install pip
$sudo pip install fabric
$fab --version
/usr/lib64/python2.7/dist-packages/Crypto/Util/number.py:57: PowmInsecureWarning: Not using mpz_powm_sec. You should rebuild using libgmp >= 5 to avoid timing attack vulnerability.
_warn("Not using mpz_powm_sec. You should rebuild using libgmp >= 5 to avoid timing attack vulnerability.", PowmInsecureWarning)
Fabric 1.10.2
Paramiko 1.15.1
warningが出ますが、以下のとおり、下記のように挙動に問題はなさそうなので無視。
Using Ansible on AWS – EC2インスタンスを作成する
解消する方法も書きましたが、かなり面倒です。。。
fabricやAnsibleインストールでYou should rebuild using libgmp >= 5 to avoid timing attack vulnerabilityと出た時
ローカルで任意の操作をする
local(command)という感じで実行できる。
自分の場合、これで~/.ssh/configを変更して引数に指定したリモートサーバーへ踏み台を超えてアクセスするような設定を行った。
なお、変更後にenv.use_ssh_config = True
としないと変更前のssh/configを読み込むっぽいので注意が必要
終了ステータスコード1の場合にロールバック処理したい
上記の通りですが、以下の様な感じで使える
def exec():
env.warn_only=True
result = run('nslookup hogefuga')
if result.return_code != 0:
rollback()
def rollback():
#something
事前にファイルバックアップをしておいて、NGの場合、リストアみたいなことができて便利です。
タスクをまとめる
小さいタスクを定義してその小さなタスクを呼び出すタスクを定義すればOK
def before():
# something
def remote():
# something
def after():
# something
def all():
before()
remote()
after()
で
$fab -H hoge all
という感じで呼び出せば良い
引数を渡す
上記リンクのままですが、以下の様な形で定義して
def ls(path):
run("ls %s" % path)
以下のように呼び出せば良い
$fab -H fabric-host ls:/usr/local
タスクをまとめるに書いたように
def before(path):
# something
def remote():
# something
def after():
# something
def all(path):
before(path)
remote()
after()
$fab -H fabric-host all:/usr/local
とかも可能。
定数を使う
以下の様な感じで使える
FABRIC_EXEC_USER = 'ec2-user'
def check():
local("grep -e 'Host hogefuga' /home/%s/.ssh/config" % FABRIC_EXEC_USER)
変数の展開は複数でも当然可能。
実行コマンド、標準出力を表示しないようにする
デフォルトでは標準出力や実行コマンドの内容が表示されますが、コマンド実行前の処理(自分の場合、~/.ssh/configの設定変更やバックアップ)は標準出力されると邪魔です。
そのような場合、hideを使えば出力の制御ができます。
例えば
def hoge():
local("hostname")
$fab hoge
[localhost] local: hostname
vagrant-ubuntu-trusty-64
Done.
というのが
def hoge():
with hide('running', 'stdout'):
local("hostname")
とすると
fab hoge
Done.
という感じに出来ます。