LoginSignup
1
1

More than 5 years have passed since last update.

かんたんに出来た! fabric を使った 踏み台経由SSH の deployment作業 を circleCI を使って自動化

Last updated at Posted at 2017-07-01

手作業でdeployするのがイヤになったのでいい加減、時代の波に乗りました。
状況としてはこんな感じです。

  • ファイルをアップしたいサーバが踏み台経由
  • fabric を使ってアップするコマンドを作る(今回これの詳細は説明しません)
  • circleCI の deployment を使って自動化

やったこと

  • circleCIの設定
  • fabricの設定
  • ssh_config
  • サーバ側の設定

ぐらいで出来ました。世界はカンタンになっているようです。

circleCIの設定

  • Project Setting > SSH Permissions に秘密鍵をアップする
    • この時 hostname は決まっていれば入力していいですが、空白だと全部に使ってくれる
  • リポジトリの circle.yml をいじる
circle.yml
machine:
  python:
    version: 2.7.12

dependencies:
  pre:
    - pip install -r ./requirements.txt
    - cat ~/repos_name/circleci_ssh_config >> ~/.ssh/config

deployment:
  staging:
    branch: master
    commands:
      - fab deploy_from_circleci

僕が書いたのはこんな感じ

次から branch: に設定したブランチにpushすると自動で fab コマンド動きます。
(当たり前ですが requirements.txt にFabricないとダメっす)

別のSSH_CONFIGを作成して、fabricから読む方法はダメだった

fabricではsshで使うSSH_CONFIGファイルを指定出来る機能があります

(超メモ)fabric で ssh の config ファイルを指定する、利用する - ようへいの日々精進XP

はじめはこれでやっていたのですが、元々の~/.ssh/configを読み込まないとidentifier系が原因でSSHがコケます。

苦肉の策で、独自SSH_CONFIGを~/.ssh/configに付け足して解決しました(´・ω・`)
どなたか env.ssh_config_path で解決出来た方いらっしゃいましたら教えてくださいm(__)m

fabricの設定

deploy_from_circleci.py
from fabric.tasks import Task


class DeplyFromCircleCI(Task):
    """
    鯖に現在のlocal状態をupする
    """
    name = "up"

    def run(self):
        self.__set_env()
        self.__up_server()
        print blue(u"done")

    @classmethod
    def __set_env(cls):
        env.use_ssh_config = True
        env.user = "deployer"
        env.host_string = "deploy_server_hostname"

    @classmethod
    def __up_server(cls):
        project.rsync_project(
            "/path-to-remoteserver/",
            local_dir="./path-to-local/"
            exclude=[".DS_Store"], delete=True, default_opts="-cropgtvz --progress"
        )


deploy_from_circleci = DeplyFromCircleCI()

特別な事はしてないですね。rsyncしてるだけです。

ssh_config の書き方

circleci_ssh_config
ForwardAgent yes

Host fumidai
    User circleci
    HostName 1.1.1.1
    Port 22

Host deploy_server_hostname
    HostName 2.2.2.2
    ProxyCommand ssh fumidai -W %h:%p

ProxyCommand で踏み台経由に設定してるだけです。IPは適当です。

サーバ側の設定

fumidai にあたるサーバ

circleci ユーザーを作って、circleCIに登録した鍵でSSHログイン出来るようにしておきます。 authorized_keys 登録すればよさそう。

deploy_server_hostname にあたるサーバ

deployer ユーザーを作って、circleCIに登録した鍵でSSHログイン出来るようにしておきます。 authorized_keys 登録すればよさそう。

ForwardAgent yes してるのでいけそう

これでいけるはず

超カンタンですね。
これからmasterにpushする度に自動でdeployしてくれます。
3回以上同じ事するぐらいなら自動化しましょう。(ってどこかのスゴイエンジニアの人がおっしゃってました)

1
1
1

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
1
1