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.

2018년 7월 10일 화요일

tomcat ipv6 옵션 테스트

톰캣 서버에  java.net.preferIPv4Stack  옵션을 적용하면 실제 ipv6로 들어오는 클라이언트가 접근이 가능한지에 대한 테스트를 해보았다

리눅스에서 nic를 확인을 위해서 ifconfig 를 확인 해본다.

        inet6 fe80::22a:4aff:fe16:183  prefixlen 64  scopeid 0x20<link>

위에 보이는 거와 inet6가 보이고
/etc/sysctl.conf 파일에 보면

net.ipv6.conf.all.disable_ipv6 = 0 (disable 0이기때문에 ipv6가 활성화 되었다)
net.ipv6.conf.eth0.disable_ipv6 =  0 (disable 0이기때문에 ipv6가 활성화 되었다)

net.ipv6.conf.all.disable_ipv6 = 1 (disable 0이기때문에 ipv6가 비활성화 되었다)
net.ipv6.conf.eth0.disable_ipv6 =  1 (disable 0이기때문에 ipv6가 비활성화 되었다)

아무 내용 없다면 default 는 0이다

활성화가 되어 있는 상태에서 curl을 통해 톰켓을 호출해본다.

 java.net.preferIPv4Stack  false 경우
$ curl -g -6 "http://[::1]:8180/clientip.jsp"
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>client ip</title>
</head>
<body>
<p>client Addr: 0:0:0:0:0:0:0:1</p><p>client Host: 0:0:0:0:0:0:0:1</p><p>X-Forwarded-For: null</p>


</body>
</html>
호출이 된다.

 java.net.preferIPv4Stack ture 경우

$ curl -g -6 "http://[::1]:8180/clientip.jsp"
curl: (7) Failed connect to ::1:8180; Connection refused


결론적으로  java.net.preferIPv4Stack 을 사용할 경우에는 ipv6는 사용이 불가능하다

설정 예)
        JAVA_OPTS="$JAVA_OPTS -Djava.net.preferIPv4Stack=true"


2018년 6월 19일 화요일

오픈소스 메신저 mattermost 설치

mattermost는 설치형 메신저이고, slack을 대체하는 메신저라는 내용이 나와 있다
설치 방법은 간단하다
일단 서버에 mattermost server, mattermost에서 사용할 DB가 필요하다
DB는 mysql or postgresql 을 사용할 수 있다.

설치 방법은 심플하다
https://mattermost.com/ 에서 Download 로 가면 mattermost server 설치하는게 나와 있는데
mattermost server 종류는 두가지 이다
open source team edition과 enterprise edition 인데
말그대로 오픈소스인지 기업용인지에 대한 선택 할 수 있다.
한마디로 유료, 무료로 나눌수 있다.

그럼 필요한 설치 파일을 다운로드 한 후
서버에 ftp라는가 리눅스면 wget이라는 명령어를 통해서 다운 받을 수 있다.

다운을 받았다면 압축을 푼다.

$ tar xvfz mattermost-team-5.0.0-linux-amd64.tar.gz

압축이 끝났으면 mattermost라는 파일이 생겼을거고 나같은 경우에는
대부분 뒤에 버전을 넣어 둔다.

$ mv mattermost mattermost-5.0

mattermost server 설치는 끝났고 이제 db만 연결하면 된다.

db는 설치 되었다고 가정하고

mattermost-5.0/config/config.json 파일에서
DriverName과 DataSource 를 해당 DB에 맞게 설정한다

자세한 내용은 mattermost document를 확인
https://docs.mattermost.com/install/requirements.html#

설정이 완료 되었으면 기동을 해본다.

$ mattermost-5.0/bin/platform
기동된 상태에서 Ctrl + c를 하게 되면 종료된다. (이부분에 대한 스크립트는 따로 작성)

최초에는 계정을 생성해야하고 이 계정은 admin 계정이 된다.
그 이후 email or username 과 password로 로그인이 가능하다



끝