タグ別アーカイブ: fabric

fabricでchef-soloの実行環境を整えてみる

AWS環境を除き、SSHアカウントがパスワードでの管理がメインとなっている今の職場環境にて、

chef-soloを実行する上でまず最初にクリアすべき、

sudo権限のあるSSHキーファイルでログインできるユーザの作成と、

chef-solo実行環境を整えて、あとはレシピを適用するだけ!な状態を作る作業を自動化すべく、

fabricで実装してみました。

 

環境はCentOS6.4(x86_64)です。

 

fabricを実行する環境ではchef-solo,knife-solo環境が整っていることが前提です。

 

↓こんな感じです。

import cuisine
from fabric.api import run, cd, abort, require, sudo, env, put, prompt, get, local
from fabric.decorators import runs_once, roles
from fabric.contrib.console import confirm

env.user = ''
env.password = ''
env.hosts = ['']

def prepare_chef():
    sudo('useradd chefuser')
    sudo('passwd -fu chefuser')
    sudo('ssh-keygen', user="chefuser")
    sudo('cat /home/chefuser/.ssh/id_rsa.pub >> /home/chefuser/.ssh/authorized_keys', user="chefuser")
    get('/home/chefuser/.ssh/id_rsa', '~/' + env.host + '.pem')
    sudo('chmod 600 /home/chefuser/.ssh/authorized_keys')
    sudo('echo "chefuser ALL=(ALL) ALL" >> /etc/sudoers')
    local('chmod 600 ~/' + env.host + '.pem')
    local('knife solo prepare chefuser@' + env.host + ' -i ~/' + env.host + '.pem')

実行すると、ホームディレクトリ下に接続先.pemというSSHキーファイルができるので、

レシピを適用する場合はそれを利用します。

 

SSHキーの生成時に対話入力を求められてしまうので、

そこも自動化したいのですが、

未熟故にexpect使うくらいしか方法が思い浮かびません・・・

 


fabricでSVNやGitを使わないデプロイツールを作成中

久しぶりのメモです。

最近、仕事でモチベーションというかテンションが下がるようなことが多くて、

なかなか書く気になれませんでした・・・

 

以前書いたように

誰もやってくれないならシステムにやってもらおう!

ということで、第一弾として・・・

 

まだ未完成ですが、作ってみました。

SVNとかGitとかで同期コマンド叩くだけなら楽チンだったんでしょうが、

社内でしかアクセスできないリポジトリをおいそれと移行できなかったりと色々あるので、

リリース対象に一意な識別子をつけてもらい、

万が一切り戻したい場合には、

その識別子を入力すると元に戻るようなものを考えました。

 

こんな感じです。

import cuisine
from fabric.api import run, cd, abort, require, sudo, env, put, prompt, local
from fabric.decorators import runs_once, roles
from fabric.contrib.console import confirm

env.user = ''
env.password = ''
env.hosts = ['']
env.site_directory_name = ''                 #リリース対象ディレクトリ
env.site_directory_path = '/var/www/html'    #リリース対象ディレクトリへのパス

#リリース
def release():
    identifier = prompt('Enter The Identifier: ')                #識別子を入力

    bakup_target = "/tmp/backupTarget" +identifier;              #バックアップリストファイル名

    local('find * | grep ".*/.\+\..*" > %s' % bakup_target)   #バックアップリストファイルに今回のリリース対象を書き出し
    put(bakup_target, bakup_target)                              #バックアップリストファイルを転送

    deploy_dir = '/tmp/deploy';                                  #作業ディレクトリパス
    deploy_dir_revision = deploy_dir + '/' +identifier;          #今回の作業ディレクトリ

    #作業ディレクトリ作成
    if not cuisine.file_exists(deploy_dir) :
        run('mkdir ' + deploy_dir)
    if not cuisine.file_exists(deploy_dir_revision) :
        run('mkdir ' + deploy_dir_revision)

    #リリース対象をtarで固める
    local('tar -cvf deploy.tar %(site_directory_name)s' % env)
    put('deploy.tar', deploy_dir_revision + '/deploy.tar')

    #リリース
    with cd('%(site_directory_path)s' % env) :
        run('cat ' + bakup_target + ' | xargs tar -rvf ' + deploy_dir_revision + '/backup.tar')  #バックアップリストに記載されているファイル群をtarで固めてバックアップ
        run('tar -xvf' + deploy_dir_revision + '/deploy.tar')                                    #上書きリリース

    local('rm -f deploy.tar')

#切り戻し
def rollback():
    identifier= prompt('EnterThe Identifier: ')  #識別子を入力

    #対応する識別子の作業ディレクトリ上にあるtarバックアップを元の場所に展開する
    deploy_dir = '/tmp/deploy';
    deploy_dir_revision = deploy_dir + '/' +identifier;
    backup_file_path = deploy_dir_revision + '/backup.tar';
    if cuisine.file_exists(backup_file_path) :
        with cd('%(site_directory_path)s' % env) :
            sudo('tar -xvf' + backup_file_path)

あとは、上書きじゃなくて削除する場合にバックアップと削除ができる方法があれば良い感じなんですが・・・

fabricはpythonっていうよりも、

pythonの構文でシェルを書けてリモートで実行できるツールって感じです。

個人的にシェルスクリプトの特殊な構文よりも書きやすいので、

日々のちょっとした作業にも使っていきたいです。

 


自動化について。愚痴っぽい独り言 ※一部不適切な発言を含みます

少し不適切な発言をします。

僕はまだまだヒヨッコであり、できないこともたくさんあります。
以下に書かれていることは勢いに任せて完全に自分を棚に上げています。
もし読む場合は、生温かい目で読んでやってください。

このところ、意識の低い・できない人達に
「なんでそんなこともできない(分からない)の?何年エンジニアやってるの?バカなの?死ぬの?」

また、何故偉い人達の大半は、
「意識の低い・できない人達の尻拭いをしている人が居るからこそ成り立っている現状を顧みないのか?」

…とイライラしていました。
(今もまだ少ししています)

ですが、最近思うのです。

そういう人達が何かしてくれることを期待するからイライラするのであって、
自分はエンジニアなのだから、
誰もやってくれないならシステムにやってもらえば良いんです。
そういうシステムを作れば良いんです。

「期間が短い」「人が足りない」と嘆いても、
どうやっても人と時間は作れません

でも、人がやっていた作業を自動化して時間に余裕を作ることはできます。

ある程度のものであれば誰でも安定して作れるような枠組みを作って、
1人あたりの効率を上げることができます。

後者はそう簡単にはできませんが、
前者はそう難しいことではありません。

というわけで、
個人的にcheffabricのお勉強中です。
fabricは大分分かってきたので、
近いうちにまとめておきたいです。

これらを使いこなせば、きっと作業量が減ることでしょう(主に自分のw)

カタログスペックを語っても、
有効性が証明できなければ意味が無いので、
今はあくまで個人的にお勉強中です。