반응형
반응형

virtualBox guest addition를 설치한다.

1
2
$ apt-get update
$ apt-get install virtualbox-guest-additions-iso


설치 후 /usr/share/virtualbox 디렉토리에 가보면 VBoxGuestAdditions.iso 파일이 있을 것이다.


이 파일을 아래 명령어를 쳐서, /mnt 경로에 mount시켜준다. 

1
$ mount -t iso9660 -o loop /usr/share/virtualbox/VBoxGuestAdditions.iso /mnt/


이미지가 마운트되었으니, 해당 경로로 가서 실행파일을 실행시켜준다.

1
2
$ cd /mnt
$ ./VBoxLinuxAdditions.run


잘 설치가 되면 좋겠지만, x.org windows driver failed 어쩌고하는 에러가 발생하는 경우가 있는데,

이 경우는 아래 명령어를 이용하여, x.org 관련된 패키지들을 설치한 뒤, 재실행 하면 정상적으로 설치가 된다.

1
$ sudo apt-get install xserver-xorg xserver-xorg-core


설치는 끝났는데, 그래도 안되는 경우에는 

방금 설치한 GuestAdditions 경로를 /usr/lib 밑으로 심볼릭 링크를 잡아주어야 한다.

1
$ sudo ln -s /opt/VBoxGuestAdditions-4.3.10/lib/VBoxGuestAdditions /usr/lib/VBoxGuestAdditions


리붓하면 정상동작한다.

1
$ sudo reboot
반응형
,
반응형

특정 파일 및 폴더를 crontab을 이용하여 원격지 서버에 동기화를 해줘야 하는 경우가 있다.


이런 경우 expect를 설치해서 password입력 부분을 skip하도록 해야 하는데,

아래와 같이 사용을 하면 잘 넘어간다.


1
2
3
4
5
6
7
8
9
10
11
12
spawn rsync -avr -e ssh ORIGIN_DIR root@ip.address:REMOTE_DIR
expect {
      -nocase yes/no {
           send yes\r
           expect eof
      }
      -nocase password: {
           send pw\r
           expect eof
      }
}
exit



보통 다른 사이트에서의 예시를 보면 send 구문 이후에 interact 명령어를 날리는데,

interact를 사용하면, 수동 실행 시에는 정상동작 하지만, crontab으로 돌렸을 때는 동작을 하지 않는다.


이런 경우 interact를 expect eof로 바꾸면, 수동 실행 시에도 잘 되고, crontab으로 실행 시에도 잘된다.


그리고 위 구문 중 -nocase라는게 있는데..

이게 if 문의 역할과 비슷한 역할을 한다.


이게 없으면, 명령어 수행 간 yes/no를 물어보는 부분이 없으면, 이후 진행을 못하게 된다.

따라서, 최초에 실행 시에는 yes/no를 물어보기 때문에 실행이 잘되지만, 그 이후 ssh 키가 원격지에 등록된 상태에서는 yes/no구문을 볼 수 없기 때문에, 동작을 하지 않는 경우가 되버린다.


따라서, expect구문 사용 시에는 -nocase, expect eof를 필수적으로 사용해야 할 것 같다.


send로 명령어 전송 시 \r을 누르는 것도 잊지 말아야 한다.

\r가 빠지면 send 이후 구문에 대해서 입력만 하고, 엔터를 누르지 않기 때문에 미궁에 빠지게 된다. ㅠㅠ

반응형
,
반응형

Jenkins-Slave를 연결하여, windows서버에 파일을 배포할 일이 있어서

xcopy를 검토하였으나, 거지같은 .svn 폴더가 발목을 잡았다.


xcopy의 /EXCLUDE옵션은 명령어 형태가 아닌, 파일 참조 형태로 되어 있어서..그지같음.. ㅠㅠ

이 기회에 xcopy의 강화버전인 robocopy를 사용해 보기로 했다.


자주 사용하는 옵션이 있는데, 아래와 같은 옵션을 사용하였다.

/MIR : 하위 디렉토리까지 tree구조를 유지시킨다.

/XA:H : 숨김파일은 굳이 복사하지 않는다. (.svn 폴더 제외 시 유용함)

/R:횟수 : retry횟수를 몇번으로 할 것인지 정함. (디폴트가 100만번이라고 하니 조절하는 게 정신건강에 좋을듯;)

/W:횟수 : retry시 대기시간 (디폴트 30초)


그리고 Jenkins에서는 현재 디렉토리를 기준으로 Target에 옮겨야 하기 때문에,

Batch에서 지원하는 %cd% 명령어를 사용해보았다.


아참, 그리고 배치 스크립트에다가 명령어를 넣고 싶은 경우는,

하단에 EXIT /B 0 이런걸 꼭 넣어줘서 마무리를 시켜주자.


Robocopy의 버그인진 모르겠는데, 다른데서 참조해서 사용하면,

스크립트 종료를 못 시켜줘서 그런지 에러가 난다. 예를 들면.. Jenkins;


RoboCopy 옵션에 대해 제대로 알고 싶은 분은 나무위키를 참조.. 무려 한글임!

https://namu.wiki/w/Robocopy

반응형
,
반응형

테스트용도로 이리저리 지지고 볶는 서버가 한 대 있는데,

희한하게 이것만 SSH접근이 느린거다.


리소스 사용량도 거의 없고, 떠있는것도 없는데 느리길래 원인을 파악해보기로 함.


일단 원인은 DNS lookup이 문제인 경우가 대부분이라고 한다.


네트워크가 복잡한 경우에는 이리저리 많이 왔다갔다할테니...

VPN을 사용하지 않는 환경일 경우는 문제가 없는게 대부분일테지만, VPN 환경에서는 가는 곳마다 한 두 서버는 항상 이런 현상이 있었던 것 같다.


이런경우 SSH 접속 시 DNS lookup을 하지 않는 방향으로 설정을 바꿔버리면 손쉽게 해결이 된다.


/etc/ssh/sshd_config 파일을 열어서

UseDNS no 라는 구문을 추가해주고, ssh를 재시작해주면 해결이 된다.


물론 이걸로 해결이 안될지도 모르지만.. 내가 사용하는 환경에서는 이 옵션이면 다 해결이 되는것 같다.


# 추가

UseDNS를 no로 지정하면, postfix (메일 관련 모듈) 이용 시에 문제가 발생하는 것을 확인하였다.

이런 경우에는 UseDNS옵션은 다시 제거 후, GSSAPIAuthentication no 옵션을 지정하면, 메일 관련 모듈에는 영향 없이 SSH 접속만 빨라진다.


GSSAPIAuthentication 옵션은 인증 관련 프레임워크고, openSSH에서 활용하고 있는 모듈 중 하나라고 한다.

yes로 되어 있으면 좀 더 견고한 보안상태로 ssh를 이용할 수 있는 것 같긴한데, 요즘 acl같은게 앞단에 존재하고 있어서 굳이 ssh접속을 느리게 하면서까지 이 옵션을 켜서 써야되나 싶기는하다.


그래서 난 과감하게 no로 지정..;

물론 ssh접속이 빠른 경우에는 굳이 손을 대지 않는게 맞는 것 같다.

반응형
,
반응형

간혹 3rdParty에서 제공하는 바이너리들을 이용하여 스크립트를 짜다보면, 

배치 스크립트는 분명히 인터프리터 방식으로 동작하는데, 자기꺼만 실행하고, 

이후에 명령어는 무시해버리는 경우가 발생한다.


이런 경우, 3rdPary 바이너리를 이용한 스크립트와, 이후 구문을 Background에서 동작하게끔하면,

동시에 실행이 되어 위의 문제가 해결된다.


단, 동시에 실행이 안되는 경우는, 별도의 배치로 빼서 call 실행할Batch.bat 실행을 하면, 순차적으로도 실행이 가능하다.


일단 본 포스팅은 Background로 명령어 실행하는 게 목적이기 때문에, 아래와 같이 하면 된다.


1
2
@START /b cmd /c 명령어 입력
@START /b cmd /c 명령어2 입력
반응형
,
반응형

기초적인 건데 나중에도 찾아볼까봐 적어둠.

1
SET /p param=입력하세요 :

입력받은 값이 param으로 들어가서, 아래 구문부터 %param% 커맨드로 사용이 가능하다.

반응형
,
반응형

9200번 포트를 외부에 열지 않기 위해, nginx의 proxy를 이용하여 간단히 연결만 해주면 될줄 알았는데,

쪼끄만거 때문에 삽질을 여러번해서 정리함.


[elastic search]

1
2
3
location /elastic {
       proxy_pass http://127.0.0.1:9200/;        // 맨 마지막에 / 를 꼭 넣어주어야 한다.
}

[kibana]

1
2
3
4
location /kibana/ {      // 여기서도 마지막에 / 를 넣어준다.
    rewrite /kibana/(.*) /$1 break;            // 이걸 빼먹으면, url이 /kibana/를 빼고 세팅이 되버려서, 유지하려면 넣어줌.
    proxy_pass http://127.0.0.1:5601/;    // 마찬가지로 / 를 꼭 넣자
}

[elastic search hq]

1
2
3
4
5
location ~ /hq/_site/ {      
         root        /usr/local/elasticsearch-2.3.2/plugins;     // html파일이 들어있는 root 경로 지정
         index       index.html                                     // index 경로
         proxy_pass  http://127.0.0.1:9200/_plugin/hq/_site/;  // 어디로 연결할지 지정
}

분명 다른 방법도 있을거같은데, nginx를 잘 모르고, 더 이상 삽질하기 싫어서

다음 세팅할땐 이렇게 사용하려고 정리함.


다 redirect때문에 발생하는 문제이기 때문에, 왠만하면 그냥 9200포트 열어서 쓰는게 깔끔함;

반응형
,
반응형

vhost설정에서 아래 구문만 추가해주면 된다.

1
RedirectMatch ^/$ /application/
반응형
,
반응형

mongoDB 로그를 filter해서 kibana에서 봐야할 일이 생겼다.


shipper부분에서 filter grok 부분을 작성해줘야되는데, 커스터마이즈가 쉽지 않아서

이리저리 구글링하다가 정상적으로 동작하는 구문을 발견!


대충 아래처럼 적어주고 shipping 하면 redis로 잘 적재되고, elasticsearch가 indexing하는데 문제가 없었다.

mongoDB는 3.0버전을 사용하였고, 2.x버전에서는 잘 안될지도 모르겠다. match 구문에 보면 MONGO3라고 되어있기 때문이지..


[logstash.conf]


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
input {
  file {
    path => "/data/log/mongodb/mongod.log"
    type => mongodb
    start_position => "end" # rotate policy 같은건데, 별 차이 없으므로 default인 end로 그냥 놓는다.
  }
}
 
filter {
  grok {
       match => ["message","%{TIMESTAMP_ISO8601:timestamp}\s+%{MONGO3_SEVERITY:severity}\s+%{MONGO3_COMPONENT:component}%{SPACE}(?:\[%{DATA:context}\])?\s+%{GREEDYDATA:body}"]
  }
  if [body] =~ "ms$"  {
       grok {
        match => ["body",".*\}(\s+%{NUMBER:spend_time:int}ms$)?"]
       }
 }
 date {
   match => [ "timestamp", "ISO8601" ]
   #remove_field => [ "timestamp" ]
  }
}
 
output {
   if [type] == "mongodb" {
     redis {
       host => "서버 host"
       port => "포트"
       data_type => "list"
       key => "redis에 어떤 key로 넣을 것인지"
     }
   }
}
반응형
,
반응형

AWS를 이용중인데, EBS를 추가하는 경우 볼륨을 수동으로 Mount 해주어야 할 일이 있었다. 


아래와 같은 절차로 Mount를 하면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ fdisk -l   # 디스크 목록 확인
$ fdisk [디스크명] # (ex : /dev/xvdb)
Command (m ) : # 이렇게 생긴 창이 나오는데, 다음과 같이 입력한다.
 
n # 새로운 파티션 생성
p # primary
# 이후 계속 물어보는게 나오는데, 사이즈 조절 등이 필요하지 않은 경우 그냥 Enter를 치면 된다. (나눠서 사용하는 것도 가능한것 같은데 해보진 않아서 잘 모름;)
 
w # 물어보는게 끝난 후 저장하여 빠져나옴.
 
$ fdisk -l  # 방금 생성한 파티션명을 확인한다.
 
$ mkfs -t ext4 [파티션명] (ex: /dev/xvdb1) # ext4 형태로 포맷
 
$ mount [파티션명] [연결할 폴더명]  # 마운트 (사전에 폴더가 생성되어 있어야 함)
 
$ echo "[파티션명] [연결할 폴더명] ext4 defaults 1 2" >> /etc/fstab # 영구적으로 마운트 되도록 설정
    # 위에 진행 했던 정보와 동일해야한다.

마운트를 하다가 잘못된 경우, Instance를 새로 만들어야 하니, 주의해야 한다.

반응형
,
반응형