AWSのタグ名を取得して、任意のインスタンスへのみデプロイできるようにする。

fabricとは

コマンドライン 経由で 任意の Python 関数 を実行するツールです。

(低レベルライブラリの上に構築された)サブルーチンのライブラリで、SSH経由で 簡単に かつ Python風に シェルコマンドを実行します

チュートリアル

http://fabric-ja.readthedocs.org/en/latest/tutorial.html

Fabric実行モデル

https://fabric-ja.readthedocs.org/ja/latest/usage/execution.html

PrivateIPの取得

条件にマッチしたインスタンスのPrivateIPを取得して、
hostsにsetすることで指定のインスタンスへのデプロイが可能。

  • 起動中であるインスタンス
  • Roles/Enviromentのタグに任意のものを指定
@task
def set_hosts(e,r):
    """ホスト一覧取得"""
    client = boto3.client('ec2', region_name=region)
    # 対象インスタンスリストの取得
    instances = client.describe_instances(Filters=[
                                    {'Name':'tag:Roles', 'Values':[r]},
                                    {'Name':'tag:Environment', 'Values':[e]},
                                    {'Name': 'instance-state-name', 'Values': ['running']}
                                    ])
    # プライベートIPをenvに入れる
    for i in instances["Reservations"]:
            env.hosts.append(i["Instances"][0]["PrivateIpAddress"])

実行

例えばvimを入れる処理を追加。

@task
def install_vim():
  sudo("yum -y install vim")

実行すれば、指定のインスタンスへvimがインストールされる。

  • 対象

起動中、Enviroment=dev/Roles=web

[ec2-user@ip-172-16-66-177 fabric]$  fab set_hosts:e=dev,r=web install_vim
[172.16.66.177] Executing task 'install_vim'
[172.16.66.177] sudo: yum -y install vim
[172.16.66.177] out: Loaded plugins: priorities, update-motd, upgrade-helper

まとめ

タグ名の指定をきちんとしておけば、開発環境のWeb全台へなどのデプロイが簡単できる。

元記事はこちら

fabricで任意のインスタンスへデプロイする