2019년 6월 28일 금요일

apache tomcat deployments 방식

apache tomcat deployments 방식은 archive or unarchive(exploded) 형태이다.

eclipse에서 Export 선택할수 있다. (이 내용은 skipped)

deployments 방식에 잠시 가물가물해서 확인해봤더니 내용이 너무 방대하고 구체적인 설명이 없는 것 같이 테스트를 해보았다.

1. webapps 에 파일을 복사 ( archive or unarchive 상관없이) tomcat server.xml default 설정

기본적으로 tomcat을 설치한 후 webapps에 application을 복사하면 기동 될때 배포가 된다.

INFO: Deploying web application archive [/was/servers/tomcat8/webapps/test2.war]
INFO: Deployment of web application archive [/was/servers/tomcat8/webapps/test2.war] has finished in [823] ms

여기서 호기심,
webapps는 어떻게 인식을 하는 것일까?
apache.tomcat 엔진 홈 경로에 bin/catalina.sh 파일을 보면
CATALINA_BASE라는 환경변수가 있고 이 CATALINA_BASE 하위에 webapps경로를 바라보고 있다 

      <Host name="localhost"  appBase="webapps"  <<- CATALINA_BASE/webapps 라는 뜻(full path)
            unpackWARs="true" autoDeploy="true">
      </Host>

이렇게 deploy를 하게 되면 application 명을 따라 간다.
CATALINA_BASE/webapps 경로를 확인해보면 archive 파일이 unarchive 파일이 되어있다.
내가 만든 application 명은 test2.war이고, context는 test2가 된다. 
예를 들어 호출해보면 위와 같이 deploy 했을 경우 http://localhost:8080/test2/index.jsp 


2. 다른 경로에 파일을 deploy하고 싶고 archive 파일인 경우
 Context를 추가해주면 된다. 간단하다.

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="false">
      <Context path="" docBase="/app/test2.war" /> ( "/"  </Context> 와 동일)
      </Host>
위와 같은 경우에는 webapps(정확히는 CATALINA_BASE/webapps) 파일을 복사하지 않고
CATALINA_BASE/webapps 이외 별도 file or exploded 형태 application을 사용 하겠다는 의미이다.

/app/test2.war 파일을 확인해 보니 archive 는 있는데 unarchive는 없다.
unarchive가 없는 게 아니라 <host>에 appBase="webapps"가 기본적으로 설정되어 있기 때문에 ROOT 라는 directory 가 있을 것이고 unpackWARs="true" 이기 때문에 unarchive 파일이 만들어 졌다.

driectory가 ROOT 인 것은 path=""
즉, context가 필요 없는 경우 이렇게 설정 한다.
호출 예) http://localhost:8080/index.jsp 

3. deploy는 하는데 archive 파일만 사용하고 싶은 경우

      <Host name="localhost"  appBase="webapps"
            unpackWARs="false" autoDeploy="false">
      <Context path="" docBase="/app/test2.war" />
      </Host>

 unpackWARs="false" 하면 된다.
 unarchive 파일(ROOT)은 어디에도 없다. 하지만 deploy는 잘된다. 

tomcat에 Context 설정은 문서를 참고하면 많은 옵션을 확인 할 수 있다.

http://tomcat.apache.org/tomcat-8.5-doc/config/context.html






2019년 6월 25일 화요일

shell script 자동 배포 (auto deploy)

목적
1. 첫 번째(이하 배포서버) 서버에 배포를 한 후 순차적으로 늘어나는 서버에들에 대해서는 자동 배포
2. 자동 배포하였을 시에 ip 기반으로 순차적으로 늘어 난다는 가정
3. 배포 완료 후 재기동 까지 해야 정상 처리

아래에 스크립트를 보면 복잡해 보이지만 그렇지 않다. (단순 tomcat deploy)
단순히 배포 서버에 디플로이가 정상이 되면 그 이후부터는 ping테스트하여 복제되는 서버에 대해서는 자동으로 배포 후 끝나는 것이 목표 였다.

주석을 쉬운 영어로 표기 했으니 이정도면 이해가 어렵진 않을 것 같다. 


#/bin/bash

DATE=`date +%Y%m%d%H%M%S`
sub1=192; sub2=168; sub3=15; sub4=100
USER=wasuser
PASSWD=wasuser
WARNAME="test.war"

APPDIR="/opt/was/app"
SERVER_BASE="/opt/was/servers/tomcat8_21"
SSHOPTION="-oStrictHostKeyChecking=no"

SOURCE=$sub1.$sub2.$sub3.$sub4;
TARGET=$SOURCE
echo "#############################################################";
echo "# INFO result [0] = SUCCESS or result [NOT 0] = FAIL ";
echo "# 0-0 $SOURCE SERVER APPLICATION GET THIS SERVER";
sshpass -p $PASSWD scp $USER@$SOURCE:/tmp/$WARNAME /tmp/$WARNAME ;
echo "# 0-0 Result: $?";
echo ""
echo "#############################################################";
echo "# CHECK WITH PING TO TARGET SERVER ";
echo "#############################################################";

while true
do
  cnt=1;
  sub4=`expr $sub4 + 100`;
  TARGET=$sub1.$sub2.$sub3.$sub4;
    ping -c 1 -w 1  $TARGET >/dev/null 2>&1;
    if [ $? -ne 0 ]; then
    echo "#############################################################";
    echo "# NO LONGER TARGET: $TARGET ";
    echo "#############################################################";
        sleep 1;
      break;
    else
    echo "# TARGET [$cnt]: $TARGET ";
    echo "";
   
    echo "# TASKS Start ";
   
    echo "# 1-1 TARGET $TARGET [$cnt] APPLICATION BACKUP[move] ";
    sshpass -p $PASSWD  ssh $SSHOPTION $USER@$TARGET mv $APPDIR/test.war $APPDIR/test.war.$DATE;
    echo "# 1-2 Result: $?";
    echo ""
   
    echo "# 2-1 THIS SERVER to $TARGET [$cnt] SERVER APPLICATION COPY ";
    sshpass -p $PASSWD  scp /tmp/$WARNAME $USER@$TARGET:$APPDIR/$WARNAME;
    echo "# 2-2 Result: $?";
    echo ""
   
    echo "# 3-1 $TARGET [$cnt] SERVER Shutdown ";
    sshpass -p $PASSWD  ssh -t $SSHOPTION $USER@$TARGET "cd $SERVER_BASE/bin; sudo -u $USER ./kill.sh";
    echo "# Result: $?";
    echo ""
   
    echo "# 4-1 $TARGET [$cnt] SERVER Startup ";
    sshpass -p $PASSWD  ssh -t $SSHOPTION $USER@$TARGET "cd $SERVER_BASE/bin; sudo -u $USER ./start.sh notail";
    echo "# Result: $?";
    echo ""
    echo "# TASKS END";
        sleep 1;
      cnt=$((cnt + 1));
    fi
  echo "-------------------------------------------------------------";
    sleep 1;
   
done

2019년 6월 24일 월요일

shell script ip address 순차 증가 후 리모트서버 실행 스크립트

내가 원하는 것은 2가지 였다

1. ip address 를 입력해서 순차적으로 ip address 시퀀스를 하나씩 증가
2. ip address가 연결이 가능할 경우 스크립트를 실행 하도록 명령어 실행

 #!/bin/sh

suba=192
subb=168
subc=23
subd=100

ipaddr=$suba\.$subb\.$subc\.$subd     # ip addr 이 잘 찍히는지 확인

echo "##########################" # 스크립트 시작 알림

while true  # ip addr 가 얼만큼 있을지 모르니 계속 증가
do

  subd=`expr $subd + 1`;    # 변수 초기화에서 늘어 나는 ip submask로 증가
  ipaddr=$suba\.$subb\.$subc\.$subd
  echo "subd = $subd";
  echo "ipaddr = $ipaddr";
  sleep 1;
  PING="`ping -c 1 -w 1 $ipaddr`";   # 핑 테스트 결과가 0 or 1 (0이 성공)

  if [ $? -eq 0 ]; then              # 핑 테스크가 성공 했을 경우
    ipaddr=$suba\.$subb\.$subc\.$subd
    echo "Prepared $ipaddr";
    CMD=`sshpass -proot scp ./ip_get.sh root@$ipaddr:/tmp/`;  # 원격서버에 파일 복사 (put)임
    $CMD
    sleep 1;
    echo "deployed $ipaddr";
  else
    echo "stopped  $ipaddr";   
    break        # 핑 테스크가 실패 했을 경우 빠저나옴
  fi

done

 echo로 디버깅을 해서 프로그램에 문제점을 찾았다


--------------------------------------------------------------------------------------------------
지난 버전
--------------------------------------------------------------------------------------------------
#!/bin/sh

suba=192 # subnet a
subb=168 # subnet b
subc=23  # subnet c
subd=100 # subnet d

ipaddr=$suba\.$subb\.$subc\.$subd   # ip address를 하나로 묶는다.

#echo $ipaddr
echo "##########################"

#CMD=`sshpass -proot scp ./ip_get.sh root@$ipaddr:/tmp/`

while true         # ip adress 를 계속 증가 시키기 위한 반복문
do
  echo "$ipaddr OK"
  NETTEST=`ping -c 1 -w 1 $ipaddr`  # ping을 통해서 서버가 살아 있는지 죽었는지 확인 한다.
  if [ $? -ne 0 ]; then             # ping에 대한 결과 값을 0, 1로 확인이 가능하고 0일 경우(정상) 반복 실행
    echo "NO $ipaddr "
    break
  fi
    subd=`expr $subd + 1`;         # 1씩 증가
    sleep 1;
    ipaddr=$suba\.$subb\.$subc\.$subd  # ip address 증가
    CMD=`sshpass -proot scp ./ip_get.sh root@$ipaddr:/tmp/` #scp를 통해서 리모트서버에 파일 복사
    $CMD

done

이게 정답이 아닌거 같은 느낌이 들지만

그래도 일단 써보고 개선 해야 겠다.

2019년 6월 21일 금요일

openjdk에서 JAVA_HOME 설정 스크립트

구글을 하면 openjdk 사용 시 JAVA_HOME 설정 하는 정보가 많다. (sunjava 해당 안됨)

스크립트가 아닌 수작업으로 해도 된다.

예를 들면 which javac 해서 readlink -f 해서 Ctrl + c  Ctrl -v 해서 지정해도 되지만,

좀더 편리하게 해보는게 어떤 방법이 있을까 고민을 했다.

그래서 일단 생각해봤다
get_javahome.sh 파일 내용

#!/bin/sh

JAVAC=`which javac`              # PATH에 있는 javac를 찾음
echo "JAVAC PATH = $JAVAC"

READLINK=`readlink -f $JAVAC`  # javac 실제 경로를 가져오고
echo "READLINK PATH = $READLINK"

# 여기서 문제다
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64/bin/javac

javac 디렉토리를 찾긴 했는데  실제 java_home은
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64 
여기까지다

dirname, awk, cut, sed 등등 명령어들이 생각 났지만 조합하기가 너무 어려웠다.

몇번의 테스트를 통해서 잘 안된 후 생각보다 심플 한 방법을 찾았다


DIR_NAME1=`dirname $READLINK`
echo "DIR_NAME1 PATH = $DIR_NAME1"

DIR_NAME2=`dirname $DIR_NAME1`
echo "DIR_NAME2 PATH = $DIR_NAME2"

JAVA_HOME=$DIR_NAME2
echo "JAVA_HOME PATH = $JAVA_HOME"


dirname으로 내가 원하는 디렉토리 정보를 추출 한 후 JAVA_HOME을 export

심플하고 쉽다.

2019년 6월 20일 목요일

ansible playbook apache httpd source compile

아파치를 단순 패키지 설치해서 사용 할 수도 있지만,
소스컴파일을 할 경우 ansible playbook 을 만들어 보았다
서버가 웹이 연결된다는 가정 하에 작성하였다.

---
- hosts: localhost
  remote_user: root
  vars_prompt:  # 버전을 선택하기 위해 사용
    - name: version
      prompt: "Please select Apache HTTPD Version Default="
      private: no
      default: 2.4.39

    - name: prefix # 설치 경로를 지정하는 부분
      prompt: "Please select Apache install directory?"
      private: no

  tasks:
  - name: download archive # 파일을 다운로드 하는 부분
    get_url:
      url: http://archive.apache.org/dist/httpd/httpd-{{ version }}.tar.gz
      dest: /tmp/httpd-{{ version }}.tar.gz


  - name: Unarchive /tmp/httpd-{{ version }}.tar.gz # 아카이브 파일을 다운로드 받았다면  아카이브 파일을 푼다.    
      unarchive:
      src: /tmp/httpd-{{ version }}.tar.gz
      dest: /tmp/httpd-{{ version }}

  - name: Apache Source Compile # 소스 컴파일 하는 부분인데 기본적으로 /tmp 경로에 파일을 만든다.


    command: "{{ item }} chdir=/tmp/httpd-{{ version }}"
    with_items:
    - ./configure --prefix={{ prefix }} --enable-expires --enable-headers --enable-mime-magic --enable-proxy --enable-rewrite --enable-so --enable-ssl --enable-vhost-alias
    - /bin/make
    - /bin/make install




서버에 따라 인스톨 과정이 좀 다를 거고, /tmp경로 이외 다른 경로는 하드코딩해야한다.

2019년 6월 19일 수요일

Ansible-playbook 패키지, 계정, 그룹 추가 플레이 북

서버 대수가 적으면 크게 문제가 되진 않지만 대수가 많으면 명령어 각각 치는 것도 어려운 뿐더러, 휴먼 에러(오타)가 발생하는 경우가 많다.
그래서 ansible playbook을 통해 한번에 처리 한다.


---
- hosts: localhost
  remote_user: root
  vars_prompt:  # 패키지 설치 할것인지 아닌지 확인
    - name: select
      prompt: "Do you want to install(present) packages? default="
      private: no
      default: present

    - name: group_name # 그룹을 추가할 것인지 아닌지 확인
      prompt: "Do you want to create group? default group_name="
      private: no
      default: mwadm

    - name: user_name # 계정을 생성할지 말지 확인
      prompt: "Do you want to create user? default user_name="
      private: no
      default: mwadm

    - name: user_home # 계정 생성이 후 계정 홈 경로 설정 할지 확인
      prompt: "Do you want to {{ user_name }} home diretory? default user_home= "
      private: no
      default: /home/{{ user_name }}

  tasks:
  - name: install packages = apr-devel, apr-util-devel, openssl-devel, pcre-devel
    yum:
      name:
          - apr-devel
          - apr-util-devel
          - openssl-devel
          - pcre-devel
      state: "{{ select }}"

  - name: Add the group
    group:
      name: "{{ group_name }}"
      state: "{{ select }}"

  - name: Add the user
    user:
      name: "{{ user_name}}"
      password: "{{ user_name}}"
      group: "{{ group_name }}"
      state: "{{ select }}"
      shell: /bin/bash
      createhome: yes
      home: "{{ user_home }}"
      remove: yes

프롬프트에 present를 입력하면 전체가 다 실행되고, absent를 입력하면 rollback 된다. 하지만 완벽하지 않기 때문에 보완이 필요하다.





2019년 6월 18일 화요일

Ansible 시작

Ansible을 시작한 이유는

서버에 설치와 설정을 동일하게 여러번 반복 작업 시 효율 적이다.

Ansible은 ssh 기반으로 동작하기 때문에  에이전트를 설치하거나 특정 포트를 오픈 하지 않아도 된다.

구조를 간단하게 살펴 보면

Control 노드, Managed 노드로 구분이 되며,

Controll 노드에서는 작업을 정의하고 Managed 노드에 ssh를 통해 한번에 수행 한다.

Ansible 설치 방법은 간단하다. rhel 기반으로 설명하면

yum install ansible -y 하면 끝 (설치는 생략)

설치가 완료 되었으면 Controll 노드에서 Managed 노드에 네트웍이 연결 된 것을 확인 하기 위해 핑 테스트를 해본다.

$ ansible node -m ping -i hosts

192.168.23.101 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
192.168.23.102 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}


ansible node[호스트에 등록된 그룹명] -m ping -i hosts [/etc/ansible/hosts 파일이 아닌 다른 파일]

이정도가 되면 이제 playbook를 사용하여 반복작업을 최소화 할 수 있다.

2019년 6월 17일 월요일

English expression 20190617


He is painting a smile picture.

They are riding bikes on the street.

I am in a cafe

Can you start from page ten?

Similar....
scared - afraid

learned from Mariam.