ファブリックを使用して管理タスクと展開を自動化する方法
序章
物事を自動化しましょう。 すべての。
また、単一のツールを使用してこれを行う方法を考えてみましょう。 プログラムしやすく、使いやすいもの。 そして、リモートマシンにSSHをインストールするだけで、これらすべてを実行してみませんか。すべてのコマンドは、ローカルまたは任意の数のさまざまなサーバーで実行するために単一の場所でスクリプト化されています。
見事なとファブに聞こえませんか? 私達は同意します。
このDigitalOceanの記事では、 Fabric – [システム]管理およびアプリケーション展開の合理化ライブラリ–が私たちの主題です。 このすばらしいツールをインストールする方法を学び、bashハックや保守が難しい複雑なスクリプトを使ってフープを飛び越える必要がある日常的な管理タスクを自動化するだけで簡単にできることを確認します。
用語集
1. ファブリックとは何ですか?
- ファブリックとPythonプログラミング言語
- システム/サーバー管理
- アプリケーションの展開
2. Ubuntu/Debianを実行しているドロップレットにファブリックをインストールする方法
3. ファブリックの機能とSSHとの統合
run(fabric.operations.run)sudo(fabric.operations.sudo)local(fabric.operations.local)get(fabric.operations.get)put(fabric.operations.put)prompt(fabric.operations.prompt)reboot(fabric.operations.reboot)
4. ファブリックのヘルパー:コンテキストマネージャー
cd(fabric.context_managers.cd)lcd(fabric.context_managers.lcd)path(fabric.context_managers.path)settings(fabric.context_managers.settings)prefix(fabric.context_managers.prefix)
5. 管理タスクを自動化するためのfabfileの例
ファブリックとは何ですか?
ファブリックはPythonライブラリです(つまり SSHおよびコンピュータシステムとの対話に使用されるon)を構築するためのツールであり、アプリケーションの展開から一般的なシステム管理まで、さまざまなタスクを自動化します。
Pythonベースですが、他のPythonアプリケーションやツールを操作するために厳密に使用されているわけではありません。 実際、Fabricは、特定の言語やシステムに関係なく、ほぼすべてを達成するためにあります。 非常に基本的な要件が満たされている限り、この優れたライブラリを利用できます。
ファブリックスクリプトは基本的なPythonファイルです。 これらは、Fabricに付属のfabツールを使用して実行されます。 これはすべて含まれています(すなわち import ..)スクリプト(つまり 実行するための指示)そして提供された手順を実行します。
「HelloFab!」と言ってくださいファブリックの使用(fabfile.py):
# def hello(who="world"):
# print "Hello {who}!".format(who=who)
$ fab hello:who=Fab
Hello Fab!
ファブリックとPythonプログラミング言語
上で簡単に述べたように、Fabricは非常に大規模なシナリオで使用できますが、Pythonベースのライブラリであり、fabfileはPythonプログラミング言語を使用してプログラミングする必要があります。
他のプログラミング言語(Pythonを含む)の経験に関係なく、Fabricの記事を読み進めるうちに、このツールの操作方法を学び、それがどれほど単純で素晴らしいかを理解するのにそれほど時間はかかりません。
Pythonは非常に人気があり、広く採用されている汎用(つまり、 特定の問題を解決するために作成されたものではありません)プログラミング言語。 コードの可読性と単純さを重視することで、簡単に区別できます。 Pythonを理解するには、非常に短いPython拡張提案(PEP)20 Pythonの禅に続いて、少し長いPythonコードのスタイルガイドを確認してください。
Pythonでのプログラミングがどのようなものかを全体的に理解するために、Python初心者向けガイドにリストされているいくつかの優れた記事を読むことができます。
システム/サーバー管理
Fabricを使用するための重要な領域の1つは、システム(およびサーバー)管理の日常的なタスクを自動化することです。 これらの仕事には、以下に関連するほとんどすべてが含まれます。
- サーバーの構築;
- そのメンテナンス、および;
- モニタリング。
独自のドロップレット(完全な制御/アクセスを備えた本格的な仮想化サーバー)で作業を開始すると、謎のように見えるものがすぐに馴染み始めます。 アプリケーションをデプロイしてメンテナンスに取り掛かるとき、いくつかの問題が発生することを予期するのは当然のことです。 ただし、アプリケーションの人気が高まり、物事が成長し始めると、複数の液滴を管理し、すべてを何度も繰り返す必要がなくなります。
それはまさにあなたが何年も前にFabricに会ったことを望む時です。
アプリケーションの展開
アプリケーションのデプロイ(Webサイト、API、サーバーに関係なく)は通常、システムを最初から(または時間内に取得したスナップショットから)セットアップし、すべてを更新して準備し、依存関係をダウンロードし、ファイルをセットアップすることを意味します構造と権限、最後にコードベースをアップロードするか、GitなどのSCMを使用してダウンロードします。
開発プロセス中に、定期的に実行する必要のあるコマンドが発生する可能性もあります(例:展開サイクルに入る直前)。
これらのタスク(ローカルとリモートの両方)を論理的に編成され、最も重要なこととしてプログラム可能な方法でスクリプト化できることは、同じ手順を繰り返し繰り返すのにどれだけの時間が浪費されているかを理解した直後に非常に貴重であることがわかります。処理する。
これはまさに、Fabricが何をするかとどこでそれを行うかを知っているPythonファイルの形であなたの助けになるときです。
Ubuntu/Debianを実行しているドロップレットにファブリックをインストールする方法
Fabricをインストールする簡単でまとまりのある方法は、デフォルトのオペレーティングシステムパッケージマネージャーaptitudeを使用することです。
aptitudeを使用してFabricをインストールするには、以下を実行します。
sudo aptitude install fabric # Alternatively, you can also use *pip*: # pip install fabric
ファブリックの機能とSSHとの統合
箱から出して、任意のPythonコマンド(またはプロシージャ)とモジュールをFabricを介して利用できます-Fabricが実際にPythonライブラリであることを前提としています。
Fabricが実際にテーブルにもたらすのは、SSHとの広範囲で優れた統合であり、単純なスクリプトを使用してすべてを合理化できます(つまり、 fabfile.py)。
このセクションでは、ツールの選択を見つけることができます(例: 機能)指定したコマンドが実行される環境と対話するために使用できるFabricに付属しています。
注:件名に関するドキュメントにアクセスすると、Fabricの操作について詳しく知ることができます。
実行(fabric.operations.run)
Fabricのrunプロシージャは、1つ以上のリモートホストでシェルコマンドを実行するために使用されます。
- run の出力結果は、変数を使用してキャプチャできます。
- コマンドが成功したか失敗したかは、
.failedと.succeededを使用して確認できます。
使用例:
# Create a directory (i.e. folder)
run("mkdir /tmp/trunk/")
# Uptime
run("uptime")
# Hostname
run("hostname")
# Capture the output of "ls" command
result = run("ls -l /var/www")
# Check if command failed
result.failed
sudo(fabric.operations.sudo)
runに加えて、最も広く使用されているファブリックコマンドはおそらくsudoです。 これにより、sudoを使用して特定のコマンドと引数のセットを実行できます(つまり、 リモートホストでのsuperuser)権限。
sudoコマンドが明示的に指定されたユーザーで使用される場合、実行はrootとしてではなく、別のユーザー(つまり、 UID 1010)。
使用例:
# Create a directory
sudo("mkdir /var/www")
# Create a directory as another user
sudo("mkdir /var/www/web-app-one", user="web-admin")
# Return the output
result = sudo("ls -l /var/www")
ローカル(fabric.operations.local)
はじめに説明したように、単一のファブリックスクリプト(fabfile)を使用して、ローカルマシンとリモートシステムの両方でアクションを実行できます。 この目的のために、Fabricはコマンドをローカルで実行するためのlocal操作を提供します。
ただし、runやsudoとは異なり、localの出力を同じように操作することはできません。 どちらの出力もキャプチャまたは印刷できます–スイッチはcapture引数で設定できます。
lcdコンテキストマネージャー(ローカル作業ディレクトリの設定に使用)などのローカルヘルパーは、localと同じように名誉になります[ X168X] (またはsudo)は、cdコンテキストマネージャーを尊重します。
使用例:
# Create a source distribution tar archive (for a Python App.)
local("python setup.py sdist --formats=gztar", capture=False)
# Extract the contents of a tar archive
local("tar xzvf /tmp/trunk/app.tar.gz")
# Remove a file
local("rm /tmp/trunk/app.tar.gz")
get(fabric.operations.get)
getコマンドは、ダウンロードするために存在します(つまり、 プル)ファイルをリモートシステムからファブリックが使用されているコンピューターにプルします。 これは、scpの動作に似ており、バックアップ、ログデータ、またはその他のサーバー関連アイテムをダウンロードする必要がある場合に便利です。
remote_path引数でリモートパスを指定できます。local_path引数を使用して、local --download--pathを指定できます。
使用例:
# Download some logs
get(remote_path="/tmp/log_extracts.tar.gz", local_path="/logs/new_log.tar.gz")
# Download a database back-up
get("/backup/db.gz", "./db.gz")
put(fabric.operations.put)
ファイルをアップロードする必要がある場合、putコマンドはgetと非常によく似た方法で使用できます。 .failedまたは.succeededを使用して、コマンドの実行結果に再度アクセスできます。
local_path-ローカルパスを設定します。remote_path-リモートパスを設定します。use_sudo-気の利いたトリックを使用して、リモートマシンの任意の場所にファイルをアップロードします。一時的な場所にアップロードしてから移動します。mode-ファイルモード(フラグ)を設定します。mirror_local-ファイルフラグを設定します(つまり、 ローカルファイルのモードを読み取ることにより、自動的に実行可能にします。
使用例:
# Upload a tar archive of an application
put("/local/path/to/app.tar.gz", "/tmp/trunk/app.tar.gz")
# Use the context manager `cd` instead of "remote_path" arg.
# This will upload app.tar.gz to /tmp/trunk/
with cd("/tmp"):
put("local/path/to/app.tar.gz", "trunk")
# Upload a file and set the exact mode desired
upload = put("requirements.txt", "requirements.txt", mode=664)
# Verify the upload
upload.succeeded
プロンプト(fabric.operations.prompt)
Fabricでの作業にさらに柔軟性が必要な場合は、promptが役に立ちます。 このコマンドは、その名前が示唆していることを正確に実行し、ユーザーに尋ねます(つまり、 スクリプトを実行しているもの)を実行して、連続実行中に使用する特定のデータを入力します。
たとえば、単一のファイルを使用して複数のアプリケーションで管理している場合は、promptを使用して、アクションを実行するように1つのファイルを設定できます。
何かを始める前に、promptを使用して、使用するポート番号を照会することもできます。
使用例:
# Prompt the user
port_number = prompt("Which port would you like to use?")
# Prompt the user with defaults and validation
port_number = prompt("Which port?", default=42, validate=int)
再起動(fabric.operations.reboot)
rebootコマンドも自明です。これは、リモートシステムを再起動するために使用されます。 デフォルトでは、2分間待機します(つまり、 120秒->wait=120)その仕事をする前に。
使用例:
# Reboot the remote system reboot() # Reboot after 30 seconds reboot(wait=30)
ファブリックのヘルパー:コンテキストマネージャー
ファブリックのコンテキストマネージャーは、Pythonのwithステートメントで使用されます。 この理由は、コマンドの実行間のセッションがシェルレス接続間で維持されない方法であるためです。
注:件名に関するドキュメントにアクセスすると、Fabricのコンテキストマネージャーの詳細を確認できます。
cd(fabric.context_managers.cd)
cdコンテキストマネージャーを使用すると、ディレクトリの状態を維持できます(つまり、 次のコメントブロックが実行されます)。 これは、SSHセッション中に cd コマンドを実行し、さまざまな異なるコマンドを実行することに似ています。
使用例:
# The *cd* context manager makes enwrapped command's
# execution relative to the stated path (i.e. "/tmp/trunk")
with cd("/tmp/trunk"):
items = sudo("ls -l")
# It is possible to "chain" context managers
# The run commands gets executed, therefore at "/tmp/trunk"
with cd("/tmp"):
with cd("/trunk"):
run("ls")
lcd(fabric.context_managers.lcd)
lcdコンテキストマネージャー(ローカルCD)は、上記のもの(cd)と非常によく似ています。 ただし、ローカルシステムの状態にのみ影響します。
使用例:
# Change the local working directory to project's
# and upload a tar archive
with lcd("~/projects/my_project"):
print "Uploading the project archive"
put("app.tar.gz", "/tmp/trunk/app.tar.gz")
パス(fabric.context_managers.path)
pathコンテキストマネージャーはPATH変数を変更します。
設定(fabric.context_managers.settings)
一時的に必要な場合(つまり 特定のコマンドチェーンの場合)、settingsステートメントを使用できます(つまり、 env値をオーバーライドします)。
使用例:
# Perform actions using a different *user*
with settings(user="user1"):
sudo("cmd")
プレフィックス(fabric.context_managers.prefix)
prefixステートメントは、その名前が示すとおりに実行し、指定されたrunおよびsudoコマンドを指定されたコマンドでラップします。
使用例:
with prefix("cmd arg."):
run("./start")
# cmd arg. && ./start
管理タスクを自動化するためのfabfileの例
fabfile をプログラムして簡単な管理タスクを自動化する方法を学び始めるために、空のfabfile.pyを作成しましょう。
次のコマンドを実行して、テキストエディタnanoを使用してfabfile.pyを作成します。
nano fabfile.py
次のコードブロックを追加して、システムを更新し、memcachedをインストールします。
# Fabfile to:
# - update the remote system(s)
# - download and install an application
# Import Fabric's API module
from fabric.api import *
env.hosts = [
'server.domain.tld',
# 'ip.add.rr.ess
# 'server2.domain.tld',
]
# Set the username
env.user = "root"
# Set the password [NOT RECOMMENDED]
# env.password = "passwd"
def update_upgrade():
"""
Update the default OS installation's
basic default tools.
"""
run("aptitude update")
run("aptitude -y upgrade")
def install_memcached():
""" Download and install memcached. """
run("aptitude install -y memcached")
def update_install():
# Update
update_upgrade()
# Install
install_memcached()
保存してCTRL+Xを使用して終了し、Yで確定します。
これで、Fabricとここで説明する機能を使用して、日常的なサーバー管理タスクの自動化を開始できます。
# Automate everything! fab update_install