[install] powerdns 설치하기

[markdown]
## Private DNS? POWERDNS!

DB를 마스터/슬레이브로 운영하고 있을 경우, 마스터 디비가 죽으면 슬레이브 디비를 마스터로 승격시켜주는 녀석들이 있다.(MMM, MHA등등) 그런데, 보통 디비를 바라보고 있는 클라이언트는 보통 아이피나 도메인을 통해서 디비를 바라보고 있을 것이다. 그런 상황에서 슬레이브가 마스터로 승격되어 봤자 클라이언트들은 죽어있는 마스터를 바라보게 마련이다.

이런경우 슬레이브를 마스터로 승격 시켜주는 것과 별개로 아이피나 도메인도 같이 바꿔줘야 하는데,
아이피를 바꾸려면 가상아이피라는 녀석을 써야한다. 그런데 지금 사용하는 클라우드 서비스에서는 가상아이피를 지원하지 않는관계로,어쩔 수 없이(?!) 도메인을 써야하는 상황이었다.

어쨌든 클라이언트들이 모르게 도메인만 슬쩍 바꿔버리면, 클라이언트는 마스터가 죽었는지 살았는지 모를테니, dns서버라는 녀석을 도입하기로 했다. 그중에 제일 간편해 보이는 녀석이 powerdns 였는데..(설치는 간편하지 않다) web api도 지원하고 해서 실제 서비스에 도입해서 사용하고 있다.

Private DNS라고 쓰긴했지만, 내가 그렇게 쓴다는거지, Public DNS 서버로 못쓴다는 얘기는 아니다.

궁금한 사람은 [powerdns](https://doc.powerdns.com) 문서 페이지와 [github](https://github.com/PowerDNS/pdns)에서 더 많은 정보를 볼 수 있을 것이다.

### MariaDB설치
PowerDNS는 벡엔드로 Mysql을 사용할 수 있는데, 나는 MariaDB를 사용하기로 했다. (이유가 있었던것 같은데, 까먹었다.)
여튼 설치를 해보자. root 유저로 들어가서 실행해야한다.

“`
# apt-get update && apt-get upgrade -y
# apt-get install software-properties-common
# apt-key adv –recv-keys –keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db
# add-apt-repository ‘deb http://ftp.kaist.ac.kr/mariadb/repo/5.5/ubuntu trusty main’
# apt-get -y install libaio1 libdbd-mysql-perl libdbi-perl libmariadbclient18 libmysqlclient18 libnet-daemon-perl libplrpc-perl mariadb-client-5.5 mariadb-client-core-5.5 mariadb-common mysql-common mariadb-server mariadb-server-5.5 mariadb-server-core-5.5
“`

### mariadb 보안 적용
보안을 위해서 하는 건데, 테스트환경이라면 굳이 하지 않아도 된다.

“`
$ mysql_secure_installation
“`

위의 코드를 실행하면 아래와 같이 물어보는데, 읽어보고 yes를 해주면 된다.

“`
Change the root password? [Y/n] n
Remove anonymous users? [Y/n] y
Disallow root login remotely? [Y/n] y
Remove test database and access to it? [Y/n] y
Reload privilege tables now? [Y/n] y
Thanks for using MariaDB!
“`

### powerdns 유저 생성및 데이터베이스와 테이블 생성

powerdns_init.sql이라는 파일을 하나 생성하고 아래의 내용을 채워넣자. (*패스워드는 알아서 잘 바꿔주자. 복붙금지!*)

“`
CREATE DATABASE powerdns;
GRANT ALL ON powerdns.* TO ‘pdns’@’localhost’ IDENTIFIED BY ‘password’;
FLUSH PRIVILEGES;
USE powerdns;
CREATE TABLE domains (
id INT AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
master VARCHAR(128) DEFAULT NULL,
last_check INT DEFAULT NULL,
type VARCHAR(6) NOT NULL,
notified_serial INT DEFAULT NULL,
account VARCHAR(40) DEFAULT NULL,
PRIMARY KEY (id)
) Engine=InnoDB;

CREATE UNIQUE INDEX name_index ON domains(name);
CREATE TABLE records (
id INT AUTO_INCREMENT,
domain_id INT DEFAULT NULL,
name VARCHAR(255) DEFAULT NULL,
type VARCHAR(10) DEFAULT NULL,
content VARCHAR(64000) DEFAULT NULL,
ttl INT DEFAULT NULL,
prio INT DEFAULT NULL,
change_date INT DEFAULT NULL,
disabled TINYINT(1) DEFAULT 0,
ordername VARCHAR(255) BINARY DEFAULT NULL,
auth TINYINT(1) DEFAULT 1,
PRIMARY KEY (id)
) Engine=InnoDB;

CREATE INDEX nametype_index ON records(name,type);
CREATE INDEX domain_id ON records(domain_id);
CREATE INDEX recordorder ON records (domain_id, ordername);

CREATE TABLE supermasters (
ip VARCHAR(64) NOT NULL,
nameserver VARCHAR(255) NOT NULL,
account VARCHAR(40) NOT NULL,
PRIMARY KEY (ip, nameserver)
) Engine=InnoDB;
CREATE TABLE comments (
id INT AUTO_INCREMENT,
domain_id INT NOT NULL,
name VARCHAR(255) NOT NULL,
type VARCHAR(10) NOT NULL,
modified_at INT NOT NULL,
account VARCHAR(40) NOT NULL,
comment VARCHAR(64000) NOT NULL,
PRIMARY KEY (id)
) Engine=InnoDB;

CREATE INDEX comments_domain_id_idx ON comments (domain_id);
CREATE INDEX comments_name_type_idx ON comments (name, type);
CREATE INDEX comments_order_idx ON comments (domain_id, modified_at);
CREATE TABLE domainmetadata (
id INT AUTO_INCREMENT,
domain_id INT NOT NULL,
kind VARCHAR(32),
content TEXT,
PRIMARY KEY (id)
) Engine=InnoDB;

CREATE INDEX domainmetadata_idx ON domainmetadata (domain_id, kind);
CREATE TABLE cryptokeys (
id INT AUTO_INCREMENT,
domain_id INT NOT NULL,
flags INT NOT NULL,
active BOOL,
content TEXT,
PRIMARY KEY(id)
) Engine=InnoDB;

CREATE INDEX domainidindex ON cryptokeys(domain_id);
CREATE TABLE tsigkeys (
id INT AUTO_INCREMENT,
name VARCHAR(255),
algorithm VARCHAR(50),
secret VARCHAR(255),
PRIMARY KEY (id)
) Engine=InnoDB;

CREATE UNIQUE INDEX namealgoindex ON tsigkeys(name, algorithm);
“`

디비생성후에 다음의 커맨드로 mariadb에 반영해주자.

“`
$ mysql -u root -p < powerdns_init.sql ``` ### Powerdns설치 (4.0.X) /etc/apt/source.list에 아래한줄을 추가한다. ``` # add-apt-repository 'deb [arch=amd64] http://repo.powerdns.com/ubuntu trusty-auth-40 main' ``` 그리고 `/etc/apt/preferences.d/pdns` 파일을 생성하고 아래 내용을 추가한다. ``` # touch /etc/apt/preferences.d/pdns # echo -e "Package: pdns-*\nPin: origin repo.powerdns.com\nPin-Priority: 600" | sudo tee /etc/apt/preferences.d/pdns ``` 위의 것들을 하면 아래의 명령어로 실행할 수 있다. ``` # curl https://repo.powerdns.com/FD380FBB-pub.asc | sudo apt-key add - # apt-get update && apt-get upgrade # apt-get install -y pdns-server pdns-backend-mysql # rm /etc/powerdns/pdns.d/* ### 기존의 설정 삭제 꼭 해줘야한다. ``` 설치시에 아래와 같은 에러가 난다면, 아래의 명령을 실행해주자. `# apt-get -f purge -y mysql-client` ``` You might want to run 'apt-get -f install' to correct these. The following packages have unmet dependencies: mariadb-server : Depends: mariadb-server-5.5 (= 5.5.49+maria-1~trusty) but 5.5.49-1ubuntu0.14.04.1 is installed E: Unmet dependencies. Try using -f. ``` 설치시 아래와 같은 화면이 나오는데, No를 선택해주자. [![](http://gyus.me/wp-content/uploads/2016/05/pdns1-1-1.png)](http://gyus.me/wp-content/uploads/2016/05/pdns1-1-1.png) 그리고 /etc/powerdns/pdns.d/pdns.local.gmysql.conf 파일을 아래와같이 수정해 주어야 한다. 디비의 유저와 패스워드를 잘 바꿔서 넣어주자. ``` ### MySQL Configuration file launch=gmysql gmysql-host=localhost gmysql-dbname=디비명 gmysql-user=유저명 gmysql-password=

###수정후 mariadb를 재시작해준다.
$ service pdns restart
“`

### pdns가 잘동작하는지 테스트
netstat와 dig를 사용했을 때 아래와 비슷하게 나와야 한다.

“`
$ netstat -nlp |grep pdns
tcp 0 0 0.0.0.0:53 0.0.0.0:* LISTEN 6793/pdns_server-in
udp 0 0 0.0.0.0:53 0.0.0.0:* 6793/pdns_server-in
unix 2 [ ACC ] STREAM LISTENING 46518 6789/pdns_server /var/run/pdns.controlsocket
$ dig @localhost
; <<>> DiG 9.9.5-3ubuntu0.8-Ubuntu <<>> @localhost
; (3 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 28331 ;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1 ;; WARNING: recursion requested but not available ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 2800 ;; QUESTION SECTION: ;. IN NS ;; Query time: 2 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Thu Mar 10 20:06:16 KST 2016 ;; MSG SIZE rcvd: 29 ``` ### Poweradmin 설치 powerdns에는 Poweradmin 이라는 php관리 페이지가 따로 있다. 설치가 어렵지않고, 설치하면 많은 기능을 웹기반으로 쉽게사용할 수 있으니 설치하도록 하자. (커맨드라인으로 굳이하겠다면 말리지는 않음) ``` $ apt-get install -y unzip apache2 gettext libapache2-mod-php5 php5 php5-common php5-curl php5-dev php5-gd php-pear php5-imap php5-ming php5-mysql php5-xmlrpc php5-mhash php5-mcrypt $ pear upgrade pear/PEAR $ pear install DB $ pear install pear/MDB2#mysql ### php 모듈 활성화 $ php5enmod mcrypt $ service apache2 restart $ cd tmp $ wget https://github.com/poweradmin/poweradmin/archive/master.zip -O poweradmin.zip $ unzip poweradmin.zip $ mv poweradmin-master /var/www/html/poweradmin ``` ###Poweradmin 설정 설치가 끝났으니 아래의 주소로 들어가서 설정을 하도록하자. http://#{server_ip}/poweradmin/install/ [![](http://gyus.me/wp-content/uploads/2016/05/pdns2-1-1.png)](http://gyus.me/wp-content/uploads/2016/05/pdns2-1-1.png) 들어가면 위와 같은 언어 선택 화면이 나온다. 대부분 영어겠지만, 익숙한 언어를 선택하고 Go to step2로 가자. 나는 영어를 선택했다. [![](http://gyus.me/wp-content/uploads/2016/05/pdns3-1-1.png)](http://gyus.me/wp-content/uploads/2016/05/pdns3-1-1.png) 스텝2는 별거 없다. 바로 Go to step3 를 누르자. [![](http://gyus.me/wp-content/uploads/2016/05/pdns4-1-1.png)](http://gyus.me/wp-content/uploads/2016/05/pdns4-1-1.png) Step3에서는 DB와 Poweradmin에 대한 설정을 하게 된다. 적절한 값을 넣도록 하자. ``` Username : DB와 연결할 유저명을 적으면 된다. 우리는 위에서 pdns라는 유저를 생성했다. Password : 디비패스워드 Database type : MySQL Hostname : localhost DB Port : 3306 Database : powerdns Poweradmin administrator password : 파워애드민에서 사용할 관리자 패스워드 ``` [![](http://gyus.me/wp-content/uploads/2016/05/pdns5-1-1.png)](http://gyus.me/wp-content/uploads/2016/05/pdns5-1-1.png) Username : poweradmin의 관리자명 Password: poweradmin의 관리자 패스워드 hostmaster.unixmen.local – SOA레코드를 만들때 없을경우 기본값으로 들어가는 값. 다음과 같은 방식이 된다. “hostmaster.example.net”. ns1.unixmen.local – 템플릿을 만들때 주 네임서버로 설정되는 값. 요런식으로 적는다. “ns1.example.net”. ns2.unixmen.local – 템플릿을 만들때 주 네임서버로 설정되는 값. 요런식으로 적는다. “ns2.example.net”. 잘 적은뒤에 Step5로 가자. [![](http://gyus.me/wp-content/uploads/2016/05/pdns6-1-1.png)](http://gyus.me/wp-content/uploads/2016/05/pdns6-1-1.png) Step5에서는 poweradmin에서 powerdns의 유저가 디비에 접근할때의 권한을 SELECT, INSERT, UPDATE, DELETE 만주라고 권장하고 있다. 화면에 있는 내용을 mysql에서 실행해주면 된다. [![](http://gyus.me/wp-content/uploads/2016/05/pdns7-1-1.png)](http://gyus.me/wp-content/uploads/2016/05/pdns7-1-1.png) Step6에서는 poweradmin의 설정파일을 "../inc/config.inc.php" 경로에 만들어라고 말을하고 있다. 해당 내용을 복사해서 만들어주자. 설정파일에 db_user가 admin 이라고 되어있는데, 디비에 유저가 생성되지 않은 경우가 있으므로 그경우에는 기존의 'pdns'유저로 해당 파일의 설정을 변경해주자. 나 같은 경우는 "/var/www/html/poweradmin/inc/config.inc.php" 경로에 생성을 했다. 7단계로 가자. 이게 설치는 거의 다되어 간다! [![](http://gyus.me/wp-content/uploads/2016/05/pdns8-1-1.png)](http://gyus.me/wp-content/uploads/2016/05/pdns8-1-1.png) 7단계에서는 DDNS를 사용하고 싶으면 mod_rewrite를 활성화 하라고 하고 있다. 그리고 반드시 "install" 디렉토리를 삭제하라고 한다. 다음으로 poweradmin의 "install" 디렉토리를 반.드.시. 삭제해야한다. (나는 사실 이름만 바꿨다. 실서버에서는 이렇게 하면 안된다.) [![](http://gyus.me/wp-content/uploads/2016/05/pdns9-1-1.png)](http://gyus.me/wp-content/uploads/2016/05/pdns9-1-1.png) http://server_ip/poweradmin 으로 들어왔을 때 위와 같은 화면이 나오면 설치는 성공이다. Username과 Password에 위에서 설정한 값을 넣으면 Poweradmin에 접근이 가능하다. 이제 설치는 끝이다. ### DNS서버 설정 [![](http://gyus.me/wp-content/uploads/2016/05/pdns1-10-1-1.png)](http://gyus.me/wp-content/uploads/2016/05/pdns1-10-1-1.png) Add Master Zone을 추가하자. [![](http://gyus.me/wp-content/uploads/2016/05/pdns1-11-1-1.png)](http://gyus.me/wp-content/uploads/2016/05/pdns1-11-1-1.png) Zone name에 'pkpk.com' 등과 같은 사용하고 싶은 주도메인을 입력하고 Add zone 을 눌러서 추가해준다. [![](http://gyus.me/wp-content/uploads/2016/05/pdns1-12-1-1.png)](http://gyus.me/wp-content/uploads/2016/05/pdns1-12-1-1.png) List zones에 들어가면 위와같은 화면이 나오고 빨간 동그라미친 곳에 들어가면 A record등을 추가할 수 있다. [![](http://gyus.me/wp-content/uploads/2016/05/pdns1-13-1-1.png)](http://gyus.me/wp-content/uploads/2016/05/pdns1-13-1-1.png) `alpha.pkpk.com` 이라는 도메인을 요청하면 `192.168.0.8`로 응답을 주도록 세팅을 했다. ### DNS서버 테스트 이제 잘되는지 테스트를 해보자. 먼저는 powerdns가 설치된 서버에서 실행을 해보자. 다음과 같은 코드를 실행해보자 `$ dig alpha.pkpk.com A @127.0.0.1` 아래와 비슷한 결과가 나오면 성공이다. ``` ; <<>> DiG 9.9.5-3ubuntu0.8-Ubuntu <<>> alpha.pkpk.com A @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18817 ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; WARNING: recursion requested but not available ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 2800 ;; QUESTION SECTION: ;alpha.pkpk.com. IN A ;; ANSWER SECTION: alpha.pkpk.com. 5 IN A 192.168.0.8 ;; Query time: 0 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Thu Mar 10 21:21:09 KST 2016 ;; MSG SIZE rcvd: 59 ``` 이제 다른 서버에 DNS서버를 연결해서 테스트해보자. ``` ### ubuntu14.04에서 실행했다. root권한으로 실행해야한다. $ echo "nameserver dnsserver의 아이피" >> /etc/resolvconf/resolv.conf.d/head
$ service networking restart
$ sudo resolvconf -u
“`

설정이 끝났으니 위에서 추가한 alpha.pkpk.com 으로 핑을 날려보자.

“`
$ ping alpha.pkpk.com
PING alpha.pkpk.com (192.168.0.8) 56(84) bytes of data.
64 bytes from 192.168.0.8: icmp_seq=1 ttl=64 time=0.398 ms
64 bytes from 192.168.0.8: icmp_seq=2 ttl=64 time=0.279 ms
64 bytes from 192.168.0.8: icmp_seq=3 ttl=64 time=0.282 ms
64 bytes from 192.168.0.8: icmp_seq=4 ttl=64 time=0.303 ms

— alpha.pkpk.com ping statistics —
4 packets transmitted, 4 received, 0% packet loss, time 3001ms
rtt min/avg/max/mdev = 0.279/0.315/0.398/0.051 ms
“`

위와 같이 핑테스트가 잘되면 성공이다.

### API

powerdns의 3.4버전부터 api를 사용가능하다.
우분투에서 `apt-get install`로 설치하는 녀석들은 버전이 낮은 경우가 많으니 주의하자.
설정파일에 아래와 같은 부분을 설정하고, powerdns를 재시작 해주면 활성화가 된다.

“`
설정을 업데이트하는 API를 사용하려면, mysql의 설정의 binlog_format을 row로 변경해주어야 한다.
“`

“`
api=yes
api-key=changeme
webserver=yes
“`

### API 사용예제

<`주의`> API를 사용해서 만든 zone 정보만 API를 사용해서 조작할 수 있다. 이점에 유의해야한다.

“`
# zone list
$ curl -H ‘X-API-Key: changeme’ http://192.168.0.44:8081/api/v1/servers/localhost/zones | jq .

# create zone
$ curl -X POST –data ‘{“name”:”example.org.”, “kind”: “Native”, “masters”: [], “nameservers”: [“ns1.example.org.”, “ns2.example.org.”]}’ -v -H ‘X-API-Key: changeme’ http://192.168.0.44:8081/api/v1/servers/localhost/zones | jq .

# show zone info
$ curl -H ‘X-API-Key: changeme’ http://192.168.0.44:8081/api/v1/servers/localhost/zones/pkpk.com | jq .

# change sub domain info
$curl -X PATCH –data ‘{“rrsets”: [ {“name”: “gamedb1.pkpk.com”, “type”: “A”, “ttl”: 0, “changetype”: “REPLACE”, “records”: [ {“content”: “192.168.0.29”, “disabled”: false } ] } ] }’ -H ‘X-API-Key: changeme’ http://192.168.0.44:8081/api/v1/servers/localhost/zones/pkpk.com | jq .

“`
[/markdown]

NCloud에서 AWS로 이전하면서 한 삽질

[markdown]
###왜 변경하나
– 더 기능이 많고 더 싸다
– 오토스케일링 가능
– SSD가 기본 장착이라 IO가 좀 더 많이 나온다
– 돈계산도 복잡하다. 그렇지만, NCloud보다 약간! 싸다

###아쉬운점은
– 고정아이피 할당이 복잡하다
– 속도가 국내 IDC에 비해서는 확실히 느리다
– SSD가 기본 장착이라 용량이 적다
– 기능이 많아서 공부를 많이 해야한다.

###변경되는 점
– 패스워드 & 공용키로 로그인 => AWS에서 제공해주는 키파일로 로그인 (이거 유출되면 큰일남)
– 기존에는 www유저를 생성해서 웹서버를 운영했는데, 기본 ubuntu유저로 해도 되지 않을까라는 안이한 생각이 든다.
– 방화벽 관련 코드는 실행하면 안된다. (에러남)

###하면서 삽질한 거
– 기존의 방화벽 관련 코드를 다 삭제해야 했다.
– root로 로그인 하던 것들을 모두 수정해야했다
– 자동으로 로그인 하는 코드를 삭제
– chef server 설치중 메모리가 모자라서 인터럽트 걸림 (1기가에서 2기가로 올리니 괜찮아짐)
– chef server 설치후 레시피 업로드 중 용량이 부족하여 인스턴스를 끄고 이미지를 뜬후 용량을 증설하여 다시 시작.
– terminate했는데, 인스턴스가 바로 안 없어져서 당황
– 고정아이피는 VPS 설정을 해야만 설정할 수 있어서 또 당황
– 가입시 기본 인스턴스 생성 가능 숫자제한이 있음 (20개)
– 고정아이피도 할당 가능한게 제한이 있음(5개)
– fabric에서 리모트 명령 실행시 root로 실행해야 하는게 있는데, 기존 방식과 달라져서 sudo 옵션을 찾기까지 또 삽질

###VPC설정 (해야할게 많다)
– 인터넷 게이트웨이 설정
– 서브넷 설정
– 라우팅 테이블 설정
[/markdown]

Chef 서버 설치하고 테스트해보기

Chef 서버 설치하고 테스트해보기

vagrant + virtualbox로 5대의 멀티 인스턴스 올리기

Chef 서버의 환경을 이해해 보려면 3개이상 가상머신을 설치해서 해보는게 좋다.
Vagrant로 5대의 가상머신을 올려보자.
Vagrant를 설치하고 VagrantFile에 아래와 같이 설정한 후

vagrant up을 실행하면 된다.

vagrant 사용법은 아래의 링크를 참고 하자.

Chef의 테스트 환경을 만드는데 매우 적합한 툴 – Vagrant (http://gyus.me/?p=326)

 

VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.define :chef_server do |cfg|
cfg.vm.box = "base"
cfg.vm.network :private_network, ip: "192.168.30.10"
cfg.vm.host_name = "chef-server"
end
config.vm.define :workstation do |cfg|
cfg.vm.box = "base"
cfg.vm.network :private_network, ip: "192.168.30.20"
cfg.vm.host_name = "workstation"
end
config.vm.define :node01 do |cfg|
cfg.vm.box = "base"
cfg.vm.network :private_network, ip: "192.168.30.21"
cfg.vm.host_name = "node01"
end
config.vm.define :node02 do |cfg|
cfg.vm.box = "base"
cfg.vm.network :private_network, ip: "192.168.30.22"
cfg.vm.host_name = "node02"
end
config.vm.define :node03 do |cfg|
cfg.vm.box = "base"
cfg.vm.network :private_network, ip: "192.168.30.23"
cfg.vm.host_name = "node03"
end
end

 

chef server 설치

아래 사이트에서 패키지를 다운 받아서 설치

http://www.getchef.com/chef/install/

[code lang=text]
wget https://opscode-omnitruck-release.s3.amazonaws.com/ubuntu/12.04/x86_64/chef-server_11.0.6-1.ubuntu.12.04_amd64.deb
[/code]

[code lang=text]
sudo dpkg -i chef-server.deb
[/code]

설치 완료후 chef-server-ctl로 Chef Server를 설정함

[code lang=text]
sudo chef-server-ctl reconfigure
[/code]

위 커맨드를 실행하면 서버를 기동시키고, nginx가 HTTPS 443포트를 바인드한다.

Chef의 각종 파일은 /opt 디렉토리에 인스톨된다.

knife 설정

[code lang=text]
knife configure
[/code]

실행하면 아래와 같은 설정 항목들이 나옴 걍 엔터.

[code lang=text]
Where should I put the config file? [/home/vagrant/.chef/knife.rb]
Please enter the chef server URL: [https://chef-server:443]
Please enter an existing username or clientname for the API: [vagrant]
Please enter the validation clientname: [chef-validator]
Please enter the location of the validation key: [/etc/chef-server/chef-validator.pem]
Please enter the path to a chef repository (or leave blank):
[/code]

임의의 클라이언트가 처음 Chef Server와 통신을 할경우, 디지털서명이 없기 때문에,
최초 한번, chef-validator라는 Client등록작업만을 전문으로 하는 클라이언트 에서 인증서를 빌려서 Chef Client의 등록작업을 하게됨. 이 작업이 완료되면 이후는 클라이언트 쪽에서 작성한 디지털서명에 의해 통신이 이루어지도록 된다.

dep패키지로 Chef Server를 설치하면 /etc/chef-server 디렉토리에 아래와 같은 파일이 있음. knife configure로 knife에게 이러한 인증서의 패스를 정확히 설정할 필요가 있다.
우선은 서버와 같은 호스트의 knife가 잘동작하도록 하고, 후에 workstation에 인증서를 전송하는 순서로 설치를 하겠음.
일단은 /etc/chef-server이하의 pem파일을 홈디렉토리로 카피함.

  • chef-validator.pem : chef-validator용의 디지털 인증서 파일
  • admin.pem : 관리자용의 클라이언트 인증서 파일(이 것을 사용하는 클라이언트 만 chef-validator를 통하지 않고 미리 작성되어 있음)

[code lang=text]
vagrant@chef-server:/$ sudo knife configure
Please enter the chef server URL: [https://chef-server:443] https://192.168.30.10
Please enter an existing username or clientname for the API: [vagrant] admin
Please enter the validation clientname: [chef-validator]
Please enter the location of the validation key: [/etc/chef-server/chef-validator.pem] ~/.chef/validation.pem
Please enter the path to a chef repository (or leave blank):
[/code]

위의 설정에서
* server URL : https://192.168.30.10
* clientname : admin
* validation key : /etc/chef-server/chef-validation.pem
을 설정함. 이것으로 해당 서버의 knife는 클라이언트의 인증서가 있는 ~/.chef/admin.pem을 이용해서 통신을 하게끔 된다. 한번 시험해봅시다.

[code lang=text]
$ knife client list
[/code]

Work Station의 셋업

새로운 Chef Client를 셋업 할 경우, 인증서의 생성과 클라이언트를 서버에 등록하는 것이 필요하다. 이것도 knife로 하게됨. 서버에 설치한 knfie를 사용해 보도록 하자.

knife client create를 실행하면 에디터에서 메타데이터의 편집을 요구하기때문에, EDITOR의 환경변수를 미리 설정해둠. knife client create 옵션의 -a 는 관리권한을 가진 클라이언트의 작성, -f는 인증파일의 저장소 지정. Vagrant를 사용하는 경우는 가상머신의 /vagrant는 공유 디렉토리로 마운트되어 있어서 다른 가상서버로의 파일전송이 편리하다. 거기에 저장을 하도록 해보자.

[code lang=text]
$ export EDITOR=vi
$ knife client create workstation -a -f /vagrant/workstation.pem
[/code]

Work Station의 knife에도 validation.pem을 저장해두면 나중에 편하니 거기에도 카피해두자.

그리고 여기서 부터는 Work Station에서 작업해야한다. 우선은 Work Station에 Chef Solo를 설치할때 사용한 Opscode Omnibug Packaging의 인스톨스크립트를 실행해서 Chef를 설치한다.

[code lang=text]
$ vagrant ssh workstation
$ curl -L https://www.opscode.com/chef/install.sh | sudo bash
$ chef-client -v
Chef: 11.8.2
[/code]

이 다음으로는 서버에서 한것과 동일하게 knife를 설정해야한다.

[code lang=text]
$ cp /vagrant/workstation.pem ~/.chef/
$ cp /vagrant/validation.pem ~/.chef/
$ knife configure
WARNING: No knife configuration file found
Where should I put the config file? [/home/vagrant/.chef/knife.rb]
Please enter the chef server URL: [https://workstation:443] https://192.168.30.10
Please enter an existing username or clientname for the API: [vagrant] workstation
Please enter the validation clientname: [chef-validator]
Please enter the location of the validation key: [/etc/chef-server/chef-validator.pem] ~/.chef/validation.pem
Please enter the path to a chef repository (or leave blank):
[/code]

서버의 URL과 방금 설정한 인승키의 패스를 설정.
제대로 설정을 했다면 knife client list로 출력이 되고 새로운 Client로 workstation이 등록된다.

[code lang=text]
### Chef Server에서 작업
$ knife client list
chef-validator
chef-webui
workstation
[/code]

<h3>Chef Client의 설치</h3>
Chef Server와 Work Station이 완료된 후에는 Client를 작업하자.
관리 대상이 되는 노드를 Chef Client로 셋업하자.

클라이언트측의 Chef인스톨도 Opscode Omnibus Packaging의 인스톨 스크립트를 실행하면 된다.

우분투를 클린상태로 설치했다면, 몇가지 패키지를 설치해야하니 다음 순서로 설치해보자.

[code lang=text]
### Chef Client에서 실행함.
$ sudo apt-get update
$ sudo apt-get install curl vim -y
$ curl -L https://www.opscode.com/chef/install.sh | sudo bash
$ chef-client -v
$ sudo mkdir -p /etc/chef
$ sudo cp /vagrant/validation.pem /etc/chef/validation.pem
[/code]

위의 스크립트를 한줄 한줄 실행해도 되고 귀찮은 사람은 파일로 만들어서 한방에 실행해도 된다.

노드에서 chef-client를 실행해서 해당 노드를 서버에 등록하자. –server로 서버의 URL을 지정하고, -N으로 노드명을 지정할 수 있다.(생략하려면 /etc/chef/client.rb를 설정하면 된다. 자세히 알고 싶으면 매뉴얼을 보도록 하자.)

[code lang=text]
$ sudo chef-client –server https://192.168.30.10 -N node01
[/code]

최초의 Client실행 때에 /etc/chef/client.pem에 클라이언트용 인증서가 생성되고, 이후의 통신은 validation.pem이 아닌 클라이언트용 인증서를 사용하게 된다.

Chef Server에 노드가 등록되었는지 Work Station의 knife에서 확인가능하다.

[code lang=text]
### Work Station에서 실행
$ knife client list
chef-validator
chef-webui
node01
workstation
[/code]

node02, node03에는 추후에 따로 세팅을 할테니 우선 두자.

헉헉헉…길다…
<h3>레시피 실행하기</h3>
잘동작하는지 테스트용 레시피를 작성후 실행해보자.
테스트로는 해당노드에 대한 각종 정보를 가지고 있는 ohai를 확인해 보는 레시피를 작성하도록 하자.
Work Station에서 쿡북을 작성하고 Server에 업로드 한 뒤 클라이언트에 적용해보자.
<h4>쿡북의 작성</h4>

[code lang=text]
$ knife cookbook create sample -o ~/chef-repo/cookbooks
[/code]

<h4>
레시피의 작성</h4>

[code lang=text]
$ vi ~/chef-repo/cookbooks/recipes/default.rb

bash "print ohai info" do
user 'vagrant'
group 'vagrant'
cwd '/home/vagrant'
environment "HOME" => '/home/vagrant'
code < /tmp/ohai.txt
EOC
creates "/tmp/ohai.txt"
end
[/code]

<h4>쿡북의 업로드</h4>

[code lang=text]
$ knife cookbook upload -a -o ~/chef-repo/cookbooks
[/code]

<h4>Node Object의 run_list 레시피 추가</h4>

[code lang=text]
$ knife node run_list add node01 'recipe[sample]'
[/code]

<h4>Node Object를 에디터에서 편집하고 싶은 경우</h4>

[code lang=text]
$ knife node edit node01
[/code]

이제 서버에 필요한 정보의 등록은 완료됐다.
노드 쪽에서 chef-client를 실행하고 생성된 파일을 확인해 보자.

[code lang=text]
$ sudo chef-client –server https://192.168.30.10 -N node01
$ cat /tmp/ohai.txt | head
{
"languages": {
"ruby": {
"platform": "x86_64-linux",
"version": "1.8.7",
"release_date": "2012-02-08",
"target": "x86_64-unknown-linux-gnu",
"target_cpu": "x86_64",
"target_vendor": "unknown",
"target_os": "linux",

[/code]

knife bootstrap 으로 노드 설정하기

가상머신으로 실행중인 경우 Work Station에서 knife bootstrap 명령을 원격으로 실행 가능하도록, 몇가지 선행되어야하는 작업이 있는데 다음과 같다.

  • 가상서버에 ssh로그인 가능하도록 호스트 OS의 ~/.vagrant.d/insecure_private_key를 Work Station의 ~/.ssh/id_rsa에 카피

[code lang=text]
### 호스트 OS에서 작업
$ scp ~/.vagrant.d/insecure_private_key worksstation:~/.ssh/id_rsa
[/code]

  • 가상서버에 설치되어 있는 옛날 버젼의 Chef가 설치시 에러를 일으킬 수 있으므로 제거. /usr/bin 디렉토리의 chef-* 파일을 어딘가로 이동해두면 된다.

[code lang=text]
### Work Station에서 작업
$ mv /usr/bin/chef-* /tmp/
[/code]

  • Work Station의 /etc/hosts에 각 노드의 IP주소를 등록해둔다.

[code lang=text]
# /etc/hosts

192.168.30.21 node01
192.168.30.22 node02
192.168.30.23 node03
[/code]

위의 설정은 knife ssh가 호스트로의 통신을 FQDN(Fully Qualified Domain Name)으로 실행하기 위한 것이다.

정리

설치와 실행이 매우 길고 좀 복잡해 보이는데, 차근차근 따라해보면 그렇지도 않다. 관리하는 서버가 10대를 넘어가면 Chef Server를 고려해 보는 것이 좋은 것 같다.

맥에서 쟝고개발환경 만들기 (Django, pip, virtualenv and homebrew)

이번에 맥북을 사면서 파이썬 개발환경을 구축했습니다.
구축하는 중에 정리한 내용을 공유합니다.

아래 링크에서 거의 대부분 참고 했습니다.
http://www.tlswebsolutions.com/mac-os-x-lion-setting-up-django-pip-virtualenv-and-homebrew/
따라하는 겸 저도 따로 정리했습니다.(대부분 비슷한데 약간 다릅니다.)
위 링크에는 xcode대신에 gcc를 설치하는데요, 저는 xcode가 설치된 상태였기에 gcc를 설치하지 않았습니다.
xcode를 설치하지 않으신 분들중에 제대로 안되시는 분들은 알려주시면 감사드리겠습니다~

업데이트가 필요해진 부분들도 새로 정리했으니 영어가 귀찮은신분들은 참고하시면 좋을것 같아요.
설치하게 될 라이브러리, 프레임웤은 아래와 같습니다.

  • Pyhon2.7
  • Django1.3
  • Git
  • Homebrew > 맥 OSX의 패키지 관리자
  • xcode Command Line Tools
  • Pip -> package install for python
  • PIL -> python imaging library
  • Virtualenv -> 파이썬의 버추얼 환경을 위한 프로그램

homebrew 설치하기

homebrew설치는 아래 사이트에서 확인가능하십니다.
http://mxcl.github.com/homebrew/

아래와 같이 쉡에 입력하시면 homebrew의 설치는 끝납니다.
매우 간단하죠? ^^

$ ruby -e “$(curl -fsSkL raw.github.com/mxcl/homebrew/go)”

설치중 아래와 같은 경고가 떠서
Warning: Install the “Command Line Tools for Xcode”: http://connect.apple.com

애플 디벨로퍼 사이트에 가서 Command Line Tools 를 다운로드 받았습니다.  (용량이 110메가!)

https://developer.apple.com/downloads/index.action

다운로드 하는 동안 brew가 잘 되는지 확인 해보죠.

아래와 같이 입력합니다.

$ brew

터미널에 사용법이 찍혀 나온다면 성공한것입니다.

git인스톨하기

이제 본젹적으로 brew를 이용해서 인스톨을 해보아요.
먼저 git을 설치해보겠습니다.

$ brew install git

인스톨하는데 아래와 같은 에러가 떳습니다.

Warning: You have not agreed to the Xcode license.

xcode를 한번도 실행하지 않아서 뜨는 에러인것 같아서
xcode를 실행하니 라이센스에 동의하라고 나옴니다.
이거구나 싶군요!
‘동의’를 누르니 개발자 툴 다운받을래? 라고 뜹니다.
받는다고 설정하고 다운로드를 완료했습니다.
xcode설정하는 중에 git도 설치가 완료 됐군요!

git도 테스트 해보겠습니다.

$ git help

해서 사용법이 주르륵~~ 나오면 잘 되는 것입니다.

이제 파이썬을 설치해 봅시다.
아래 커맨드는 파이썬에서 필요한 라이브러리들을 설치하는 커맨드입니다.

$ brew install readline sqlite gdbm

이제 파이썬을 설치해보아요.

$ brew install python –universal –framework

–universal과 –framework 옵션은 제가 대충만 찾아봐서 확실히 알지는 못하오니 궁금하시다면,

homebrew python formula로 구글에서 검색해보시길 바랍니다.

그 와중에 xcode Command Line Tools의 다운로드가 끝났네요.

xcode Command Line Tools를 설치해보죠~

xcode Command Line Tools를 설치

다운로드 받으신 파일(아래와 같은 파일이요.)을 더블클릭하시면 창이뜹니다.

그리고, 아래와 같은 화면에서 ‘계속’등등을 누르셔서 그저 다음으로 넘어가시기만 하면 됩니다.

너무 간단하네요. ^^;

이제 파이썬의 패키지 관리를 해야하니 pip를 설치해봐요.

$ easy_install pip

실행중에 에러가 났습니다. 권한이 없다고 나오는군요.
[Errno 13] Permission denied: ‘/Library/Python/2.7/site-packages/test-easy-install-42582.write-test’

관리자 권한으로 실행을 해야될 것 같네요.
관리자 권한을 활성화 시키는 법은 아래 링크를 참고하세요~

http://support.apple.com/kb/HT1528?viewlocale=ko_KR&locale=ko_KR 

관리자 권한을 활성화 시키셨으면 다시 pip를 설치해봅시다.

관리자 권한으로 실행가능하도록 sudo를 사용하겠습니다.

$ sudo easy_install pip

이제 pip로 파이썬의 패키지들을 인스톨 할 수 있습니다.
python가상환경을 만들어주는 virtualenv를 설치해봐요.

virtualenv설치

Virtualenv는 파이썬 개발에 필요한 환경을 맥 머신에 기본 설치되어 있는
파이썬 환경과는 별도의 환경으로 완전히 구별하고 싶을때 사용합니다. (영어로는 고립시킨다고 되어있네요.)

아래 명령을 실행시켜 봅시다.(역시 관리자 권한이 필요합니다. ㅎ)

$ sudo pip install virtualenv

자, 이제 장고를 실행시키기위한 환경을 구축해봐요.

프로젝트의 루트로 사용할 디렉토리를 하나 만드셔야 됩니다.

$ mkdir directory_name

$ cd directory_name

그리고 새로운 버추얼 환경을 만들어 봅시다.

$ virtualenv [버추얼환경 이름] –no-site-packages

아래 커맨드로 새로운 버추얼 환경을 실행할 수 있습니다.

$ source [버추얼환경 이름]/bin/activate

이렇게 하시면 터미널의 앞에 버추얼 환경의 이름이 나오게 됩니다.

저는 django라고 이름을 지었는데요, 이런식으로 나옵니다.

(django) user $ _

버추얼 환경에서 나오시려면 아래의 커맨드를 입력하세요.

$ deactivate

마지막으로 쟝고를 설치해보겠습니다~

$ pip install django

이제 쟝고개발환경이 다 준비되었습니다! 와우!

만약에 MySQL을 지원하고 싶으시다면 MySQL서버와 MySQL-python라이브러리를 설치해야해요.

아래의 명령어로 간단히 가능합니다. (brew를 실행해야하니 버추얼 환경에서 나와주세요.)

brew install mysql

#아래 두줄은 붙여서 써주세요~
sudo pip install http://downloads.sourceforge.net/project/mysql-python/mysql-python-test/1.2.3c1/MySQL-python-1.2.3c1.tar.gz?use_mirror=cdnetworks-us-2

PIL이라는 파이썬 이미지 라이브러리도 설치해봅시다.

pip install PIL

이제 필요한 것은 다 준비 되었습니다.

쟝고프로젝트를 개발하실 수 있습니다.

버추얼 환경으로 설치했기에 기존의 맥 환경에는 전혀 영향을 주지 않습니다~!

이제 쟝고 프로젝트를 시작하는 것만 남았군요!

버추얼 환경으로 들어가셔서 쟝고 프로젝트를 생성하는데 까지 해보겠습니다.

source django/bin/activate

쟝고 프로젝트를 생성하는 커맨드는 아래와 같습니다.

django-admin.py startproject project_name

project_name에는 여러분이 만드실 프로젝트명을 넣으세요~ ^^

아..그리고 한가지 빼먹게 있습니다만, mysql설정인데요.

mysql설정은 따로 해주셔야됩니다. 다른 좋은 분들의 링크만 소개하겠습니다.
(저는 공식사이트가 젤 낫긴 하더라구요.)

그럼 재미나는 프로그래밍 하시길 바랍니다. ^^

http://dev.mysql.com/doc/refman/5.6/en/binary-installation.html

http://calflove.tistory.com/334

http://bluexmas.tistory.com/216

덧, 버추얼 환경이라고 하니 용어가 조금 헷갈립니다만,
nodejs나 루비를 아시는 분들이라면 nodejs의 nvm 이나 ruby의 rvm을 생각하시면 좀 더 이해하기 쉬울것 같습니다.
virtualenv는 nvm또는 rvm이 하는 역활들을 해주는 녀석입니다.
각 버전별로 패키지를 따로 설정할 수 있는데요. 가상 환경 이름을 붙이기에 같은 버전이라도
얼마든지 용도에 따라 만들 수 있습니다.

자바개발자를 위한 이클립스 세팅 + 플러그인 설치 for eclipse4.2

자주 하는일은 아니지만,
하게 될때 시간도 많이 걸리고,
엄청나게 귀찮은게 바로 환경세팅이다.

다른 것보다 헷갈리기가 쉬운게
이클립스의 플러그인 설정인데,
안까먹기위해서 정리.

1. 이클립스 다운로드

이클립스는 많은 버전이 있고,
플러그인이 미리 설치되어있는 버전이 있느데 javaee개발을 위한 이클립스를 다운받아서
자기 컴터의 어딘가의 적당한 곳에 압축을 푼다.

나의 경우는 D:\eclipse[버전] 의 형식으로 푼다.
이번에는 4.2버전이므로
「D:\eclipse4.2」가 되겠다.

아래는 다운로드 페이지 링크
http://www.eclipse.org/downloads/packages/eclipse-ide-java-ee-developers/junor

받고나서 적당한 폴더에 압축을 풀텐데
이클립스를 돌릴때에 메모리 부족으로 이클립스가 뻗는경우가 종종있다.
이클립스 압축을 푼 폴더로 이동해서 eclipse.ini파일을 수정해서 메모리를 좀 올려주자.
XXMaxPermSize, Xms, Xmx의 설정만 변경해주면 된다.
수치는 너무 크지 않게 적당히 정하면 된다.

--launcher.XXMaxPermSize
512M
--launcher.XXMaxPermSize
512m
-Dhelp.lucene.tokenizer=standard
-Xms512m
-Xmx1024m

2. JDK설정

– 이클립스에서 기본적으로 사용할 java환경을 설정하자.
Window -> Preferences를 클릭하면 팝업창이 뜨는데 아래와 같다.
팝업창에서 Java -> Installed JERs를 클릭 하면 아래와 같은 창이 나오는데
Add를 누른다.

그러면 Installed JRE Types: 라고 JRE의 타입을 선택하는 페이지가 나오는데,
그냥 「Standard VM」으로 하고 Next를 클릭

아래와 같은 화면이 나오면 Directory를 선택하고 JDK를 설치한 경로를 선택후 Finish를 눌러준다.

잘 설정됐다!

3. WAS서버(톰캣 설정)

Window -> Preferences의 Server를 클릭하면 다음과 같이 된다.

Add를 클릭

톰캣의 버전을 선택하는 부분이 나오는데,
자신의 PC에 인스톨한 톰캣을 선택(나중에 더 추가가능)
나는 우선 6.x로 선택.

Browse를 눌러서 자신이 인스톨한 톰캣폴더를 지정

Finish를 누르면 톰캣이 추가되어있다~

4. 디폴트 인코딩 설정

Window -> Preferences에 들어가서

General -> Workspace에들어가면 하단에 Text file encoding이 있는데 여기서
Ohter를 선택해주고 UTF-8을 선택하자.

————————————————————————–
이제부터 필요한 플러그인들을 설치해보자.

내가 꼭 필요로 하는 플러그인으로는 아래의 플러그인 들이 있는데,
어떻게 설치하는지 알기위해 SVN과 Spring Tool Suite만 설치해보자.
그외 플러그인은 각자 필요한 대로 설치하면 된다.

Subversion플러그인 설치 (Subclipse를 설치하겠삼)

Subversive와 Subclipse가 있으니, 좋은쪽으로 설치하면 된다.
Subversive는 eclipse공식 플러그인이라,
Help → Install New Software → 「Juno – http://download.eclipse.org/releases/juno」의 리스트에있다.
Subclipse는 Update Site에 http://subclipse.tigris.org/update_1.8.x을 설정해서 인스톨한다.

아래와 같이 subclipse와 SVNKit을 둘다 설치해야된다.

이제 next, 라이센스계약에 오케, finish로 설치를 시작해보자.

인스톨하는 중간에 검증되지 않은 프로그램이라고 나오는데 그래도 설치할래?
라는 메세지가 나온다. 무조건 설치하자.
그리고 이클립스를 재시작한다.

Spring Tool Suite 플러그인 설치

help → Install New Software에 들어간다음 Work with: 에 아래와 같은 주소를 넣어주자.
「http://dist.springsource.com/release/TOOLS/update/e4.2」
그중에 필요한걸 알아서 설치하면된다.

나는

Atlassian Connector
Core / Eclipse Integration Commons
– Eclipse Integration Commons
– SpringSource Tool Suite Dashboard
Core / Groovy/Grails Tool Suite
Core / Spring IDE
Core / STS
Extensions (Incubation) / Spring IDE
Extensions / Spring IDE
– Spring IDE Maven Support
Uncagegorized
– AspectJ Development Tools
정도를 설치했다. 설치하고 싶은 내용은 사람마다 다를테니 잘 보고 설치하자.

여기서 「Next」→ 「동의」→「Finish」이다.

추천 플러그인들.
아래 링크는 누군가가 이클립스의 플러그인을 정리해놓은 것이다.
http://www.fromdev.com/2012/01/25-best-free-eclipse-plug-ins-for-java.html

위의 플러그인에 없는것중에 내가 사용하는 것으로는
JUnit과 연동되어서 테스트를 조금 더 편하게 개발할 수 있게 해주는
MoreUnit
MoreUnit소개 – by Outsider

클래스도나 시퀀스 다이어그램을 그려주는 공짜 플러그인인 AmaterasUML

힙덤프, 메모리덤프를 분석할 수 잇는 Memory Analyzer (MAT)등이 있다.

설치방법은 위에 나왔던 SVN이나 Spring Tool Suite와 별다르지 않으므로 큰 문제없이 설치할 수 있을 것이다.

그럼 이클립스로 즐겁게 개발합시다~~~