Archive for December, 2012

도데체 내 floatingip-list는 뭔고? + field_specs 사용법

quantum은 nova와는 다르게 사용자를 구별하지 않습니다. 아직 keystone의 인증 기능이 완전하게 통합되지 않는 것이죠. 아마도 grizzly에서 해결할 것 같습니다.

그런데 지금 너무 불편합니다. quantum floatingip-list하면 내가 할당받은 floatingip-list만 나와도 정신없는데, 다른 tenant의 것까지 나온다면 더욱 더 정신없습니다. nova처럼 내것만 나오면 좋을텐데 말입니다.

목마른 사람이 우물판다고 간단하게 스크립트 만들어 봤습니다.

#!/bin/bash
TENANT_ID=$(keystone tenant-list | grep " $OS_TENANT_NAME " | awk '{print $2}')
ARG=$@

if [ ! -z "$TENANT_ID" ]; then
        EXTARG=--tenant_id=${TENANT_ID}

        if [[ ! "$ARG" =~ ' -- ' ]]; then
                EXTARG="-- $EXTARG"
        fi
fi

quantum $ARG $EXTARG

사용법은 q.sh로 저장하시고 quantum 명령과 동일하게 쓰면 됩니다. 이제 q.sh로 실행하면 quantum의 대부분의 query 명령이 내가 속한 tenant의 것만 나옵니다. 이제 눈이 좀 정갈해 지는군요.

quantum의 help를 아무리 뒤져봐도 특정 tenant의 목록을 가져오는 것은 없습니다. 유일하게 힌트가 보이는 것 이라고는 filter_specs가 있는데, 여기 키와 값에 뭘 넣어야할지 막막하기도 합니다. 녜 quantum은 이제 folsom 버전에 들어가서 아직 부족한 부분이 많아서 그렇습니다. 당연 문서도 부족합니다(cinder도 아마 그렇지요).

filter_specs에 넣을 수 있는 값들은 리스트된 객체를 show 했을때 보이는 값입니다.

root@:~# quantum net-list
+--------------------------------------+---------+--------------------------------------+
| id                                   | name    | subnets                              |
+--------------------------------------+---------+--------------------------------------+
| 0ded8d5c-9820-4e90-8ca8-97e4a072b2e1 | demo2   | 5d21c90d-7640-4de4-bed7-ce27421851d3 |
| 791d5c88-c437-4f82-97f0-ce435acb2172 | ext_net | c9f2a3cf-2013-4452-b3f5-c778143cc87f |
| d4950d6e-d796-4e30-9fba-d33599ba3644 | admin   | 304f2b2b-6e8f-403c-96b6-0b292007685d |
| e8d18114-540d-4c5e-b2a9-32e4a2e29625 | demo1   | 67b07eb0-235b-4dc4-843c-81e41247e737 |
+--------------------------------------+---------+--------------------------------------+
root@:~# quantum net-show ext_net
+---------------------------+--------------------------------------+
| Field                     | Value                                |
+---------------------------+--------------------------------------+
| admin_state_up            | True                                 |
| id                        | 791d5c88-c437-4f82-97f0-ce435acb2172 |
| name                      | ext_net                              |
| provider:network_type     | gre                                  |
| provider:physical_network |                                      |
| provider:segmentation_id  | 1                                    |
| router:external           | True                                 |
| shared                    | False                                |
| status                    | ACTIVE                               |
| subnets                   | c9f2a3cf-2013-4452-b3f5-c778143cc87f |
| tenant_id                 | e949c418d49649c39005d6dfa7d3ade2     |
+---------------------------+--------------------------------------+

이라고 했을때 여기서 ext_net을 찾는 방법은 아래와 같습니다.

root@:~# quantum net-list -- --name=ext_net
+--------------------------------------+---------+--------------------------------------+
| id                                   | name    | subnets                              |
+--------------------------------------+---------+--------------------------------------+
| 791d5c88-c437-4f82-97f0-ce435acb2172 | ext_net | c9f2a3cf-2013-4452-b3f5-c778143cc87f |
+--------------------------------------+---------+--------------------------------------+
root@:~# quantum net-list -- --router:external=True
+--------------------------------------+---------+--------------------------------------+
| id                                   | name    | subnets                              |
+--------------------------------------+---------+--------------------------------------+
| 791d5c88-c437-4f82-97f0-ce435acb2172 | ext_net | c9f2a3cf-2013-4452-b3f5-c778143cc87f |
+--------------------------------------+---------+--------------------------------------+

하지만.. 이게 절대적인 것은 아니고 대부분 이렇다는 것이네요.. ^^;


github에 계정이 여러개 있을 때.. push

github에 계정이 2개 있습니다. 하나는 회사것 하나는 개인것... 물론 public_key도 다르겠지요..
별 생각없이 사용하면, 개인 레포지트리도 회사의 계정으로 접근을 합니다. 최근까지도 신경안쓰고 있었다가, 개인 레포에 push할 것이 있어서 했는데, 에러가 나더군요.

어떻게 할까.. 고민하다가.. ssh_config를 조금 손보는 것으로 처리했습니다.

Host github.com
        User git
        HostName github.com
        IdentityFile ~/.ssh/company_id_key.rsa

Host whitekid.github.com
        User git
        HostName github.com
        IdentityFile ~/.ssh/personal_key_rsa

위처럼 ~/.ssh/config를 적당히 손봅니다. 이제 ssh github.com하면 첫번째 설정으로 접근하고, ssh whitekid.github.com 하면 두번째 설정으로 접근하게 됩니다.

이렇게 하면 ssh가 구분하여 호스트를 설정하는 것은 되었고 git repository에서는 위의 설정대로 .git/config 파일에서 개인 레포지트르의 호스트 설정을 살짝 바꿔주면 됩니다.

[remote "origin"]
        fetch = +refs/heads/*:refs/remotes/origin/*
        url = git@whitekid.github.com:whitekid/openstack-chef.git

이제는 어디서든 push 해도 햇갈일 일이 없음~


ec2 instance start/ stop scripts

클라우드 관련 일을 하니 역시나 사실상 표준인 ec2를 분석할 일이 생겼고, 인스턴스를 만들고 하는 일이 생겼습니다. 콘솔에서 작업하는 것이 너무 귀찮아서 간단하게 모든 region의 instance에 대해서 start/ stop/ status를 보는 스크립트를 만들어봤네요.

물론 이런 일을 해주는 뭔가가 있겠지만, 아주 간단한 일이라 찾는것도 귀찮아서...

#!/bin/bash
export EC2_PRIVATE_KEY=<YOUR EC2 PRIVATE KEY FILE HERE>
export EC2_CERT=<YOUR EC2 CERT FILE HERE>

this=$0
cmd="$1"
shift

function check_expire(){
	f=$1
	EXPIRETIME=$2

	[ ! -f $f ] && return

	NOW=`date +%s`                              # get current time
	FCTIME=`stat -c %Y ${f}`                    # get file last modification time
	let "AGE=$NOW-$FCTIME"
	if [[ $AGE -gt $EXPIRETIME ]] ; then
		rm -f $f                                # this file age is more than the EXPIRETIME above, we can delete it
	fi
}

case "$cmd" in
	stop)
		$this | while read region instance etc; do
			ec2-stop-instances --region $region $instance
		done
		;;

	start)
		$this | while read region instance etc; do
			ec2-start-instances --region $region $instance
		done
		;;

	regions)
		let expire_time=60*60*24*7	# expire in a week
		region_cache='/var/tmp/ec2-region-cache'
		check_expire $region_cache $expire_time

		if [ ! -f $region_cache ]; then
			ec2-describe-regions | awk '{print $2}' > $region_cache
		fi

		cat $region_cache
		;;

	*)
		for region in `$this regions`; do
			ec2-describe-instances --region=$region | grep INSTANCE | awk "{print \"$region \" \$2 \" \" \$4 \" \" \$6}"
		done
		;;
esac

흠.. ec2 api .. 엄청 느리군요.. ㅡㅡ


chef: search node role vs search node roles

knife를 이용해 특정 role을 가지는 role을 검색하려면 아래처럼 합니다.

$ knife search node role:openstack-compute

그런데 다른 소스를 뒤져보다 아래와 같이 queury하는 것을 봤습니다.

$ knife search node roles:openstack-compute

뭘까? 하고 그냥 지나치다가 찾아봤죠.. Find Nodes with a Role in the Expanded Run List라고 부르는군요.

간단히 예를 들면

  • nodeA: role-A
  • nodeB: role-B
  • role-A: recipe[A], role[base]
  • role-B: recipe[B], role[base]

이라고 되어있을 경우

$ knife search node role:base

로 할 경우 role에 직접적으로 base가 지정되어 있지 않기 때문에, 검색결과가 없습니다.

$ knife search nodes role:base

로 할 경우는 role-A를 확장하여 role-A, recipe[A], role[base]를 대상으로 찾기 때문에 nodeA, nodeB가 모두 검색이 됩니다.

또한 하나의 side-effect로 role이 expand되는 때는 실제로 chef-client가 실행하면서죠.. 따라서 chef-client가 정상적으로 실행되고 나서야 roles로 검색이 가능합니다. 즉 roles로 검색된 결과는 해당 role로 할당된 노드가 있고, chef-client 정상적으로 cookbook을 실행했다는 의미죠.


Open Technet, Cloud Computing Technology & Business Conference 발표 자료

어제(2012. 12. 4) Open Technet, Cloud Computing Technology & Business Conference에서 발표했던 자료 입니다.

  • Deploy OpenStack with Quantum
  • Logical Deploy Model
  • Physical Deploy Model
  • Quantum Overview and Deploy
  • Automation with Chef

할 이야기는 많고 시간은 부족하고.. 결국은 starting point를 제공하는 기분으로 했습니다~


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