1. !! - 쌍느낌표 (Double exclamation)

바로 직전에 사용한 명령어를 실행합니다.

$ cat file1
1111111111111111111111
22222222222222222
end
$ !!
cat file1 # 이전에 실행된 명령어를 보여줌
1111111111111111111111
22222222222222222
end

!!:^, !!:$, !!:* 응용

^, $, * 에 대한 설명은 아래에서 확인할 수 있습니다.

$ echo '1' '2' '3' 
1 2 3
$ echo !!:^ # !!= 이전명령어 , := ~의, ^= 첫 번째 argument 즉 이전명령어의 첫 번째 argument를 호출
echo '1'
1
$ echo !!:$ # !!= 이전명령어 , := ~의, $= 마지막 argument 즉 이전명령어의 마지막 argument를 호출
echo '3'
3
$ echo !!:* # !!= 이전명령어 , := ~의, *= 전체 argument 즉 이전명령어의 전체 argument를 호출
echo '1' '2' '3'
1 2 3

2. ! - 느낌표 (Exclamation)

!history의 고유번호

history 명령어를 입력하면 고유의 식별번호가 존재하는데 느낌표+식별번호를 입력하면 해당 번호의 명령어가 실행됩니다.

$ history
...
1721  sudo su
1722  ll
1723  cat file1
1724  history
 
$ !1723
cat file1 # 1723번에 존재하는 명령어 실행
1111111111111111111111
22222222222222222
end

!-history의 고유번호 순번

!-2의 의미는 마지막 명령어로부터 뒤로 두번 째 명령어를 재호출 한다는 의미입니다.

$ !-2
cat file1 # history의 마지막에서 두 번째 명령어 실행
1111111111111111111111
22222222222222222
end

!^, !$, !* 이전 명령어의 argument 실행

!^: 이전 명령어의 첫 번째 argument

!$: 이전 명령어의 마지막 argument

!*: 이전 명령어의 전체 argument

$ ls -la company
total 20
drwxr-xr-x 5 root root 4096 Dec 12 09:12 .
drwxr-xr-x 8 root root 4096 Mar 14 20:06 ..
drwxr-xr-x 2 root root 4096 Dec 12 09:12 bin
drwxr-xr-x 3 root root 4096 Jan 20 09:52 pkg
drwxr-xr-x 6 root root 4096 Jan 20 09:52 src
 
$ ls !*
ls -la company # 전체 argument 실행
total 20
drwxr-xr-x 5 root root 4096 Dec 12 09:12 .
drwxr-xr-x 8 root root 4096 Mar 14 20:06 ..
drwxr-xr-x 2 root root 4096 Dec 12 09:12 bin
drwxr-xr-x 3 root root 4096 Jan 20 09:52 pkg
 
$ ls !^
ls -la # 첫 번째 argument 실행
total 32912
drwxr-xr-x  8 root     root         4096 Mar 14 20:06 .
drwxr-xr-x 23 root     root         4096 Mar 14 13:28 ..
drwxr-xr-x  5 root     root         4096 Dec 12 09:12 company
-rw-r--r--  1 root     root     32976929 Jan 20 10:01 company.tar.gz
 
$ ls !$
ls company # 마지막 argument 실행
bin  pkg  src

![keyword] 이전 명령어의 keyword로 실행

keyword로 실행된 명령어 중 가장 최근 명령어를 찾아서 재 실행합니다.

$ ls company
bin pkg src
$ vi aaaa
...
$ !ls
bin pkg src

3. {} - 중괄호 (Brace)

커맨드라인에서 콤마는 파일명을 나열하고 명령에게 인수로 전달합니다. 

$ sudo mkdir test{1,2,3}
$ ll
...
drwxr-xr-x  2 root     root         4096 Mar 14 20:54 test1/
drwxr-xr-x  2 root     root         4096 Mar 14 20:54 test2/
drwxr-xr-x  2 root     root         4096 Mar 14 20:54 test3/

4. ? - 물음표 (Question)

파일명을 생성하게 하는 특수문자입니다. 이 문자는 기존의 파일명에 있는 문자 하나에 해당됩니다.

$ echo test?
test1 test2 test3

5. * - 별표 (Asterisk)

물음표와 비슷한 기능을 수행하지만 어떤 개수의 문자열에도 대응할 수 있습니다.

$ echo test*
test test1 test1123 test2 test3

6. [] - 대괄호 (Square bracket)

문자 주위를 둘러싼 괄호 기호 []는 각각의 문자를 포함하는 파일명을 검색하게 합니다.

$ echo test[13]
test1 test3
$ echo test[1-3]
test1 test2 test3 


'서버' 카테고리의 다른 글

[Linux] CPU 개수 확인하기  (0) 2017.03.15
[Linux] 용량 확인 명령어  (0) 2017.03.15
[Linux] 커맨드라인 특수문자 명령어  (0) 2017.03.14
[Linux] pushd, popd  (0) 2017.03.14
[Linux] Confluence WiKi 설치  (0) 2017.03.14
루프백 아이피  (0) 2017.03.08

pushd 명령어를 사용해 사용자가 입력한 디렉토리 위치를 저장하고 해당 위치로 이동합니다. popd를 사용하여 pushd에 저장되어 있는 위치로 이동하는 명령어입니다.

/home$ pushd /home/test/test1 /home /home/test/test1 /home/test/test1$ cd /var/log /var/log$ popd /home/test/test1 /home/test/test1$


'서버' 카테고리의 다른 글

[Linux] 용량 확인 명령어  (0) 2017.03.15
[Linux] 커맨드라인 특수문자 명령어  (0) 2017.03.14
[Linux] pushd, popd  (0) 2017.03.14
[Linux] Confluence WiKi 설치  (0) 2017.03.14
루프백 아이피  (0) 2017.03.08
Puppet, Chef, Ansible, Saltstack 비교  (0) 2017.02.18

환경

2Core 2GB  Ubuntu 16.04 LTS

PostgreSQL 9.5.6 

openjdk version 1.8.0_121

tomcat8

atlassian-confluence-6.0.6

1. jdk 설치

$ sudo apt-get update 
$ sudo apt-get upgrade
$ sudo apt-get install default-jdk 
$ sudo apt-get install default-jre
 
# 설치확인
$ java -version
java version "1.8.0_77"
...

2. tomcat 설치

$ sudo apt-get install tomcat8
 
# 설치가 완료되면 8080포트가 활성화됨
$ netstat -tnlp
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:5432          0.0.0.0:*               LISTEN      -
tcp6       0      0 :::8080                 :::*                    LISTEN      -
...
 

3. Tomcat (JVM) Heap memory 설정

$ sudo vi /etc/default/tomcat8


.... 
JAVA_OPTS="-Djava.awt.headless=true -Xmx128m -XX:+UseConcMarkSweepGC"
....
 
# 위 부분을 주석처리 후 아래 붙여넣기
....
JAVA_OPTS="-Djava.awt.headless=true" HEAP="-Xms2048m -Xmx2048m" NEW="-XX:NewSize=256m -XX:MaxNewSize=256m" RMIGC="-Dsun.rmi.dgc.client.gcInterval=600000 -Dsun.rmi.dgc.server.gcInterval=600000" PGC="-XX:+UseParallelGC" PERM="-XX:PermSize=256m -XX:MaxPermSize=256m" DEBUG="-verbose:gc -XX:+PrintTenuringDistribution" DUMP="-XX:+HeapDumpOnOutOfMemoryError" SERVER="-server" JAVA_OPTS="-Djava.awt.headless=true $HEAP $NEW $RMIGC $PGC $PERM $DEBUG $DUMP $SERVER" 
....
 
# :wq로 저장 후 톰캣 재실행
$ sudo service tomcat8 restart

힙 메모리 설정 후 톰캣이 재시작되는데 다소 시간이 걸립니다. 브라우저에 ip주소:8080을 입력해놓고 기본페이지가 나올때까지 기다리면 됩니다. (잘못한 건줄 알고 몇시간동안 헤맴..)

4. atlassian confluence 압축풀기

서버로 파일을 옮기는데에 여러 방법이 존재하는데 저는 아래와 같이 로컬에 압축파일을 받은 다음, scp 명령어를 통해 서버로 전송했습니다.

# wiki 서버
$ sudo mkdir test
$ sudo chmod 777 test
 
# 로컬
$ scp atlassian-confluence-6.0.6.tar.gz wiki@10.10.10.10:/home/test


다음 아래와 같이 압축을 해제합니다.

$ tar -zxvf atlassian-confluence-6.0.6.tar.gz

5. confluence-init.properties 파일 설정

백업이나 첨부파일들이 저장될 장소를 지정하는 파일인데 예로 들어놓은 파일을 그대로 사용합니다.

$ cd cd atlassian-confluence-6.0.6/confluence/WEB-INF/classes/
$ vi confluence-init.properties
...
# - For example:
confluence.home=/var/confluence # <- 해당 주석 해제
...
 
# :wq 저장 후 위 지정한 폴더 권한 수정
 
$ sudo chmod 777 /var/confluence

6. Tomcat에 context descriptor만들기.

 tomcat/conf/Catalina/localhost 디렉토리에 confluence.xml 파일을 만들어 아래 설정을 추가합니다.

$ cd /etc/tomcat8/Catalina/localhost
$ vi confluence.xml
 
# 아래 추가
<Context path="/confluence" docBase="압축을 해제한 폴더경로/confluence" debug="0" reloadable="true">
<Logger className="org.apache.catalina.logger.FileLogger"
prefix="atlassian-confluence." suffix=".log" timestamp="true"/>
</Context>
 
# :wq로 저장 후 톰캣 재실행
$ sudo service tomcat8 restart

docBase 부분에 압축을 해제한 폴더 경로를 작성한 다음 저장하고 톰캣을 재시작합니다.

7. confluence setup

http://10.10.10.10:8080/confluence에 접속하면 라이센스 키를 입력하라는 창이 나옵니다. Atlassian 홈페이지에 가서 받은다음 입력하시면 됩니다.

추가적으로 기능을 선택할 것이 없으면 바로 Next를 누릅니다.

8. DB 연결

내장 DB와 외장 DB를 선택할 수 있습니다. 외장 DB에는 mysql, PostgreSQL등이 있는데 여기서는 PostgreSQL을 선택하여 진행합니다.


9. PostgreSQL 설정

아래 URL에 들어가 설정한 후 confluence 란 이름의 DB를 생성합니다.

10. 연결정보설정


먼저 PostgreSQL Driver Class Path가 잡힌 곳에 postgresql.jar 파일이 존재해야 합니다.

$ cd /home/test/atlassian-confluence-6.0.6/confluence/WEB-INF/lib/
$ ll | grep post
.. postgresql-9.4.1212.jar # 보통 기본으로 존재
# postgresql의 버전이 맞지않아도 그냥 진행이 가능해서 기본 jar파일로 진행


스키마 구성하는데 시간이 다소 소요됩니다. 아래 화면이 나왔으면 사용목적에 맞게 선택하여 진행하면 됩니다.

'서버' 카테고리의 다른 글

[Linux] 커맨드라인 특수문자 명령어  (0) 2017.03.14
[Linux] pushd, popd  (0) 2017.03.14
[Linux] Confluence WiKi 설치  (0) 2017.03.14
루프백 아이피  (0) 2017.03.08
Puppet, Chef, Ansible, Saltstack 비교  (0) 2017.02.18
Saltstack  (0) 2017.02.18

루프백 아이피란?

IPv4 및 IPv6에서, 자기 자신을 가리키기 위한 목적으로 쓰기 위해 예약된 IP 주소입니다. IPv4의 경우 127.0.0.0부터 127.255.255.255 까지 있으며, 보통 127.0.0.1을 사용합니다. 반면 IPv6은 ::1/128, 딱 한 개의 주소만 사용합니다. 보통 시스템에서는 /etc/hosts 파일에 localhost를 127.0.0.1로 연결시켜 두어서, 호스트 이름에 localhost를 입력하면 DNS를 타지 않고 바로 로컬로 연결됩니다.

'서버' 카테고리의 다른 글

[Linux] pushd, popd  (0) 2017.03.14
[Linux] Confluence WiKi 설치  (0) 2017.03.14
루프백 아이피  (0) 2017.03.08
Puppet, Chef, Ansible, Saltstack 비교  (0) 2017.02.18
Saltstack  (0) 2017.02.18
[Linux] sudo command not found 해결법 (Go 권한문제 해결법)  (0) 2017.02.02

'서버' 카테고리의 다른 글

[Linux] Confluence WiKi 설치  (0) 2017.03.14
루프백 아이피  (0) 2017.03.08
Puppet, Chef, Ansible, Saltstack 비교  (0) 2017.02.18
Saltstack  (0) 2017.02.18
[Linux] sudo command not found 해결법 (Go 권한문제 해결법)  (0) 2017.02.02
[Linux] 디렉토리 구조  (0) 2017.01.28

 인프라의 규모가 커질 수록 서버 설치와 설정에 대한 부담이 늘어납니다. 특히 트래픽이 급격히 늘어나는 경우, 이에 빠르게 대처하여 서버를 구축하기 위해서는 자동화가 필수입니다. Saltstack은 이런 대규모 인프라를 관리하기 위한 자동화 관리 시스템입니다.  

장점

빠릅니다. server 와 agent 간 zeromq 를 통해 통신하는데, agent 요청에 대해 비동기 병렬로 처리 하기 때문에 agent가 많아져도 수 초안에 처리가 가능합니다. 1만대 이상 agent 에 명령을 보내고 응답 받는데 2초가 걸리지 않습니다.

구조가 심플합니다. Server-agent 기반의 매우 단순한 구조입니다. 서버의 경우 DB조차 사용하지 않습니다. (DB를 사용하고 싶은 경우 plug-in 구조로 DB를 사용할 수 있게 지원) 보통 이런 시스템을 도입하게 되면 시스템 자체의 운영에 대해 부담감이 있지만 구조가 단순하다면 이런 부담감도 크지 않아 도입하는데 무리가 없습니다.

많은 모듈 지원합니다. 인프라 환경 구성을 위한 거의 대부분의 작업을 지원하는 내장 모듈이 존재합니다. 그리고 이를 이용해 다수의 서버를 프로그래머블하게 제어하는게 가능합니다. (= Infrastructure as a Code )

구조

Salt-Master

Saltstack에서 Server 역할을 담당합니다. Master는 등록된 Minion 에게 명령을 publishing하고 그 결과를 취합하여 보여주는 역할을 합니다. 1대의 single master가 minion 수천대까지 관리가 가능합니다.

Salt-Minion

Agent의 역할이며, 구성 자동화를 하기 위한 대상 서버에 설치하면 됩니다. Master의 명령을 기다리고 있다가 명령이 오면 그에 맞춰 작업을 수행하게 됩니다. 만약, 서버에 minion을 설치하기 어려운 상황이라면 Ansible처럼 SSH로 명령 push가 가능하도록 지원합니다.

ZeroMQ

Salt-master와 Salt-minion 간 통신에 ZeroMQ라는 비동기 메시징 라이브러리를 사용합니다. 따로 설치해야 하는 것은 아니며 Salt-master를 설치하면 zeroMQ도 함께 설치됩니다. publish Port로 4505, Return Port 로 4506을 사용합니다. (포트 수정 가능)

Port 4505는 Publisher로서, 모든 salt-minion 들이 명령을 받기 위해 해당 포트를 listening합니다. salt-master는 이 포트를 통해 명령을 전달하며, 모든 minion은 비동기 형태(asynchronous) 로 동시에 명령을 받아 수행하게 됩니다.

Port 4506은 minion 들이 수행한 작업 결과를 받게 되는 역할로 사용됩니다. 그리고 결과 리턴 뿐만 아니라 minion이 master에게 파일을 요청하거나 minion의 특정 데이터 값(Salt pillar)을 요청하는 포트로도 사용됩니다.

특징 

Python 기반

  • Saltstack 자체가 Python 으로 개발되었으며, Saltstack에서 실행되는 모든 명령 실행 코드는 Python 기반의 Module / Function 으로 구현되어 있습니다. 만약 사용자가 원하는 custom module을 구현하고 싶다면 Python 으로 개발하면 됩니다. 근데 custom module 개발할 필요가 없을 정도로 내장 모듈이 많으며 강력합니다. 

YAML / Jinja2 포맷의 설정 파일

  • 자동화할 작업들을 명세하는 sls 파일들은 YAML 포맷을 기본으로 합니다. 또한 template 파일의 경우, 로직에 대한 처리는 Jinja2 template을 사용합니다. Jinja의 경우 기존에 Django나 Flask 같은 프레임워크에서도 많이 사용된 기술이기 때문에 어렵지 않게 사용이 가능합니다.

ZeroMQ 기반의 메시징 처리

AES 암호화 통신

  • salt-minion이 master에 처음 등록될 때 minion은 master에게 자신의 public key를 전달하게 됩니다. 그리고 master는 이 public key를 저장하고 해당 minion의 등록을 허락하는 절차를 거치게 됩니다. 이후 master와 minion은 ZeroMQ를 통해 통신할 때 public key와 AES key를 이용해 암호화 되어 통신하게 됩니다.


'서버' 카테고리의 다른 글

루프백 아이피  (0) 2017.03.08
Puppet, Chef, Ansible, Saltstack 비교  (0) 2017.02.18
Saltstack  (0) 2017.02.18
[Linux] sudo command not found 해결법 (Go 권한문제 해결법)  (0) 2017.02.02
[Linux] 디렉토리 구조  (0) 2017.01.28
HAProxy  (0) 2017.01.28

+ Random Posts