2019년 10월 28일 월요일

ansible roles 작성

처음 ansible 시작은 
누가 하라고해서 한게 아니다. 
내가 해야할 작업량이 많고, 반복적인 작업을 
각각 서버마다 하려다 보면 시간도 많이 소비되고, 
그것만큼 흔히 말하는 노가다(?) 작업이 따로 없다. 

그래서 나는 기존에 ansible을 약간 알고 있었지만, 써야 할 필요성을 느꼈다.
왜냐면, 컴퓨터는 나보다 더 일을 잘하기 때문에!!!

무작정 시작하였다. 지금 보면 너무 무식한 방법이였던 것 같다. 
ex) 톰캣을 설치하는 playbook 

---
- hosts: localhost
remote_user: root
vars_prompt:
- name: version
prompt: "Please select Tomcat connector Version Default="
private: no
default: 1.2.46

tasks:
- name: download archive
get_url:
url: http://mirror.apache-kr.org/tomcat/tomcat-connectors/jk/tomcat-connectors-{{ version }}-src.tar.gz
dest: /tmp/tomcat-connectors-{{ version }}-src.tar.gz

- name: Unarchive tomcat-connectors-{{ version }}-src.tar.gz
unarchive:
src: /tmp/tomcat-connectors-{{ version }}-src.tar.gz
dest: /tmp/
- name: find apxs
command: find /home/ansible/ -name apxs -exec readlink -f {} \;
register: find_contents
- name: Tomcat Connector Source Compile
command: "{{ item }} chdir=/tmp/tomcat-connectors-{{ version }}-src/native"
with_items:
- ./configure --with-apxs={{ find_contents.stdout }}
- /bin/make
- /bin/make install




위와 같은 yaml 파일을 매번 만들어야 했고 
나중엔 파일이름이 헛갈리고 관리가 안되었기 때문에 
재사용성과 관리를 고려해 

roles 기반으로 작성하기로 하였다.
이름대로 roles(역할) 기반으로 바꾸는 작업이다. 

동일한 소스는 아니지만 다음과 같이 변경하였다.

roles
└── installation
    ├── files
    │   ├── catalina.properties
    │   ├── server.xml
    │   ├── shutdown.sh
    │   └── start.sh
    ├── tasks
    │   ├── init_dir.yml
    │   ├── main.yml
    │   ├── rm_dir.yml
    ├── templates
    │   └── env.sh
    └── vars
        └── main.yml

위에는 files, tasks, templates, vars 밖에 없지만 기본적인 roles로 작성시 아래와 같은 구조를 가진다.

default: 기본 변수 설정
files: 노드에 배포할 파일 위치
handlers: service module 을 처리하며 notify와 함께 사용 가능
meta: roles에 대한 정보, 호환버전 등 메타 데이터 정의
tasks: 수행할 작업의 목록 (각 노드에 처리해야할 작업들)
templates: 노드에 배포할 템플릿 파일 위치 (jinja2 사용하지만 다른 것도 가능한 거 같음)
vars: 작업 수행 시 사용할 변수들에 대한 정의

main.yml 파일을 호출하여 사용되며, 

roles
└── installation <-- 여기에 제품이름을 넣는 것이 편함 (개인차이있음)


roles을 처음에 사용할 때는 더 어려웠다. 
하지만 지금은 roles 로만 테스트한다. 

처음 접근이 어려워도 한번 해보는것을 추천

끝 감사합니다. 



Today expression

I arrive at my office at around 9 am.
=> 나는 사무실에 9시쯤 도착한다.

I really dont feel hungry.
=> 나는 정말 배고프지 않다.

I know what these words mean.
=> 나는 그 단어들을 안다.

I am always work hard.
=> 나는 항상 일을 열심히 한다.

early bird / a lark = a morning person.
=> 아침형 인간

hit the sack = to go to bed.
=> 잠자리에 들다, 잠을 청하다.

They often make me laugh out loud.
=> 그들은 나를 웃게 만든다.

2019년 10월 1일 화요일

jenkins 설치 및 기동 종료 스크립트

jenkins는 오픈소스 application을 빌드하기 위한 툴이다.
jenkins를 잘 활용 한다면 자동화 및 Continuous Integration (CI) / Continuous Delivery (CD)를 유용하게 사용할 수 있다. (지속적인 통합, 자동 배포 의미)

설치는 상당히 쉽다
https://jenkins.io/doc/pipeline/tour/getting-started/

문서의 내용을 살펴보면

하드웨어는 램 256mb, 디스크 10gb 정도이,
java 8 이상 버전, 컨테이너로 만드려면 docker가 필요하다

난 java로 띄워서 사용할 것이기 때문에 docker는 스킵한다.

1. http://mirrors.jenkins.io/war-stable/latest/jenkins.war 파일을 다운로드 받는다. wget으로 받는 방법, ftp로 업로드 하는 방법 선택하면 된다.
2. jenkins를 기동할 서버에 접속하여 jenkins.war 파일을 올려둔 경로로 이동한다.
3. java는 설치 했다 가정하고 아래의 명령어를 실행한다. (나같은 경우 openjdk 8설치)
   java -jar jenkins.war --httpPort=8080
4. 브라우저 열어서 http://serverip:8080 접속한다.
5. 브라우저 시키는대로 하면 끝

위와 같이 설치가 끝났다.
jenkins는 재기동 할일이 거의 없다. 하지만 하다보면 재기동할 경우도 많기 때문에 매번 java -jar ..... 이렇게 실행 시킬순 없다. 또한 종료는 어떻게 해야하는건지 내용은 안보인다.
사실 jenkins wiki에 있지만, 잘안된다. (jenkins wiki: https://wiki.jenkins.io/display/JENKINS/Administering+Jenkins)

그래서 기동 스크립트를 만들고 종료의 경우에는 jenkins-cli.jar 를 사용 해보려고 한다.
 jenkins-cli.jar 파일은 $JENKINS_HOME/war/WEB-INF 경로에 있다.

java -jar jenkins-cli.jar -s http://localhost:8080/ help
위와 같이 실행하면 옵션들이 보인다.
Options:
 -s URL              : the server URL (defaults to the JENKINS_URL env var)
 -http               : use a plain CLI protocol over HTTP(S) (the default; mutually exclusive with -ssh)
 -ssh                : use SSH protocol (requires -user; SSH port must be open on server, and user must have registered a public key)
 -i KEY              : SSH private key file used for authentication (for use with -ssh)
 -noCertificateCheck : bypass HTTPS certificate check entirely. Use with caution
 -noKeyAuth          : don't try to load the SSH authentication private key. Conflicts with -i
 -user               : specify user (for use with -ssh)
 -strictHostKey      : request strict host key checking (for use with -ssh)
 -logger FINE        : enable detailed logging from the client
 -auth [ USER:SECRET | @FILE ] : specify username and either password or API token (or load from them both from a file);
                                 for use with -http.
                                 Passing credentials by file is recommended.
                                 See https://jenkins.io/redirect/cli-http-connection-mode for more info and options.

난 -auth 를 사용했다.
java -jar jenkins-cli.jar -s http://localhost:8080/ -auth admin:admin 

위와 같이 하게 되면 명령어 리스트가 보인다 여기서 shutdown이 있기 때문에 이걸 사용한다.
java -jar jenkins-cli.jar -s http://localhost:8080/ -auth admin:******** shutdown 

명령어 실행시 정상적으로 종료가 되는 것을 확인 할 수 있다.

그럼 이것을 토대로 쉘스크립트를 작성하겠다.

start.sh 스크립트

nohup java -jar -Xms2048m -Xmx2048m  /opt/jenkins/bin/jenkins.war --httpPort=8080 >> jenkins.out 2>&1 &


shutdown 스크립트

java -jar /opt/jenkins/war/WEB-INF/jenkins-cli.jar -s http://localhost:8080/ -auth admin:******** shutdown

잘 동작하는 것 같다.