Archive for April, 2013

git submodule commit

git으로 작업하면서 야심차게 submodule을 도입해봤습니다. 그런데 서브모듈에서 커밋하는 순간부터 막히기 시작하네요.

원칙으로 한다면 submodule을 커밋 & push하고 parent도 commit & push 해 줘야하겠지요. 근데 submodule을 커밋하려면 해당 모듈이 있는 디렉토리로 이동해서 해야합니다.

$ cd submodule && git commit -m 'this is submodule commit message' -a

하나라면 그런데로 할만한데.. 이게 2개 이상이면 좀 짜증이 나기 시작합니다. 그래서 간단하게 쉘 스크립트를 만들어 해봤지요.

녭.. 이런거 해주는 비슷한 것이 있습니다. git foreach 명령이죠.

$ git submodule foreach git commit -m 'this is submodule commit message' -a

그런데 커밋하면 바로 에러가 납니다. 이유는 서브 모듈 중에서 변경되지 않은, 커밋될 필요가 없는 것은 위의 git commit 명령이 오류를 내면서 정지하기 때문이죠. 그래서 모두 커밋하려면 위에서 처럼 분기가 필요한데.. 이를 foreach와 묶는 것을 한 줄로 처리하기 힘들죠..

그리고 된다고 하더리도 아마도 -m 메시지의 공백때문에 제대로 처리가 되지 않을 겁니다.

Update: gist가 좋아보여서 거기다 스크립트 넣어봤습니다. 괜찮네요.

Update: push하는 것도 적용해봤습니다.


chef: role에서 environment에 따라서 run_list 다르게 지정하기

chef를 사용하다보면 environment에 따라서 다른 run_list가 필요한 경우가 있습니다.  이를테면 개발 환경의 서버는 개발자를 위한 편의 기능들을 미리 집어넣는 경우지요. 아마도 개발머신에서는 개발자의 public_key를 모두 등록해서 개발 머신에는 각자의 키로 접속할 수 있고, production에서는 그 기능을 빼는 경우죠.

role에서는 이런 경우를 위해서 env_run_lists를 이용하여 기능을 재공하고 있습니다.

roles/base.rb

name "base"
description "base role for all node"

default_roles = [
	"recipe[chef-client::service]", "recipe[chef-client::config]", "recipe[ntp]",
]

run_list default_roles
env_run_lists	"_default" => default_roles,
				"devel"      => default_roles + ["recipe[my_cookbook::developers_public_keys]"]

굳이 설명 안해도 코드만 보고 다 알겠죠? ㅎㅎ


리눅스 배포판 및 버전 확인하기: lsb_release

스크립트 작업할 때 리눅스 배포판을 확인해서 그에 따라서 작업할 경우가 있습니다. CentOS에는 어쩌구.. Ubuntu에서는 어쩌고...

배포판을 확인할 수 있는 명령은 lsb_release인데 man page에 따르면 아래와 같습니다.

FSG lsb_release v2.0 prints certain LSB (Linux Standard Base) and Distribution information.

여기서 주요하게 필요한 것이 --id(CentOS or Ubuntu), --release(5.8, 12.04)이 두가지 인데, CentOS와 Ubuntu에 약간 차이가 있습니다.

CentOS 5.8에서는

$ lsb_release -i -r -s
CentOS 5.8

Ubuntu 12.04에서는

$ lsb_release -i -r -s
Ubuntu
12.04

이를 스크립트에서 활용할 수 있게 tr 명령과 섞으면 아래와 같이 됩니다.

$ /usr/bin/lsb_release -i -r -s | tr "\\n" " " | sed "s/ *\$//g "
Ubuntu 12.04

이제 이를 이용해서 OS에 따른 대응 코드를 만들면..

#!/bin/bash
function get_dist(){
	/usr/bin/lsb_release -i -r -s | tr "\\n" " " | sed "s/ *\$//g "
}

case $(get_dist()) in
	CentOS*)
		SERVICE=/sbin/service
		SERVICE_NAME=network
		;;
	Ubuntu*)
		SERVICE=/user/sbin/service
		SERVICE_NAME=networking
		;;
	*)
		fatal "Not supported platform"
esac

$SERVICE $SERVICE_NAME restart

끄읏~


  • Copyright © 1996-2010 Your wish is my command. All rights reserved.
    iDream theme by Templates Next | Powered by WordPress