LoginSignup
8
11

More than 5 years have passed since last update.

fabricを使う時に調べたことのメモ

Last updated at Posted at 2015-08-15

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が出ますが、以下のとおり、下記のように挙動に問題はなさそうなので無視。

OSS編~Ansibleでサーバ構成管理 パート①~

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の場合にロールバック処理したい

fabric でエラー時のロールバック処理をする

上記の通りですが、以下の様な感じで使える

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

という感じで呼び出せば良い

引数を渡す

Fabricを使って複数のサーバを操作する

上記リンクのままですが、以下の様な形で定義して

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.

という感じに出来ます。

8
11
0

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
8
11