어떤 도구를 설치해보려고 했는데,

필요 조건이 MongoDB가 이미 설치되어 있어야 한단다.

 

그래서 부랴부랴 MongoDB 설치를 해보고자 한다.

 

 

# Environment

 

  - 기본 환경은 아래와 같다.

 

$ lsb_release -a

No LSB modules are available.

Distributor ID: Ubuntu

Description:    Ubuntu 18.04.4 LTS

Release:        18.04

Codename:       bionic

 

$ uname -a

Linux chani1804 4.15.0-88-generic #88-Ubuntu SMP Tue Feb 11 20:11:34 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

 

 

 

# install

 

  - 그냥 바로 apt-get으로 설치하면 된다.

 

$ sudo apt-get install mongodb

Reading package lists... Done

Building dependency tree

Reading state information... Done

The following additional packages will be installed:

  libboost-filesystem1.65.1 libboost-iostreams1.65.1 libboost-program-options1.65.1 libboost-system1.65.1 libgoogle-perftools4 libpcrecpp0v5 libsnappy1v5 libstemmer0d

  libtcmalloc-minimal4 libyaml-cpp0.5v5 mongo-tools mongodb-clients mongodb-server mongodb-server-core

The following NEW packages will be installed:

  libboost-filesystem1.65.1 libboost-iostreams1.65.1 libboost-program-options1.65.1 libboost-system1.65.1 libgoogle-perftools4 libpcrecpp0v5 libsnappy1v5 libstemmer0d

  libtcmalloc-minimal4 libyaml-cpp0.5v5 mongo-tools mongodb mongodb-clients mongodb-server mongodb-server-core

0 upgraded, 15 newly installed, 0 to remove and 0 not upgraded.

Need to get 53.5 MB of archives.

After this operation, 217 MB of additional disk space will be used.

Do you want to continue? [Y/n]

 

 

 

# check status

 

  - 설치를 완료하게 되면 바로 서비스로 실행이 된다.

  - 서비스 상태를 확인해보자.

 

$ systemctl status mongodb.service

● mongodb.service - An object/document-oriented database

   Loaded: loaded (/lib/systemd/system/mongodb.service; enabled; vendor preset: enabled)

   Active: active (running) since Tue 2020-03-10 22:58:24 KST; 4min 31s ago

     Docs: man:mongod(1)

 Main PID: 3334 (mongod)

    Tasks: 23 (limit: 2318)

   CGroup: /system.slice/mongodb.service

           └─3334 /usr/bin/mongod --unixSocketPrefix=/run/mongodb --config /etc/mongodb.conf

 

 3월 10 22:58:24 chani1804 systemd[1]: Started An object/document-oriented database.

 

 

  - 버전과 접근 정보를 확인해보자.

 

$ mongo --eval 'db.runCommand({ connectionStatus: 1 })'

MongoDB shell version v3.6.3

connecting to: mongodb://127.0.0.1:27017

MongoDB server version: 3.6.3

{

        "authInfo" : {

                "authenticatedUsers" : [ ],

                "authenticatedUserRoles" : [ ]

        },

        "ok" : 1

}

 

 

 

# 자동 실행

 

  - 재부팅할 때 자동으로 실행되도록 설정해보자.

 

$ sudo systemctl enable mongodb.service

Synchronizing state of mongodb.service with SysV service script with /lib/systemd/systemd-sysv-install.

Executing: /lib/systemd/systemd-sysv-install enable mongodb

 

 

 

# 간단한 사용

 

  - 동작을 하는 것인지 확인만 해보자.

 

$ mongo

MongoDB shell version v3.6.3

connecting to: mongodb://127.0.0.1:27017

MongoDB server version: 3.6.3

Welcome to the MongoDB shell.

For interactive help, type "help".

For more comprehensive documentation, see

        http://docs.mongodb.org/

Questions? Try the support group

        http://groups.google.com/group/mongodb-user

Server has startup warnings:

2020-03-15T04:12:20.040+0900 I STORAGE  [initandlisten]

2020-03-15T04:12:20.040+0900 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine

2020-03-15T04:12:20.040+0900 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem

2020-03-15T04:12:26.952+0900 I CONTROL  [initandlisten]

2020-03-15T04:12:26.952+0900 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.

2020-03-15T04:12:26.952+0900 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.

2020-03-15T04:12:26.952+0900 I CONTROL  [initandlisten]

 

> show dbs

admin   0.000GB

config  0.000GB

local   0.000GB

 

> use tutorial

switched to db tutorial

 

> show dbs

admin   0.000GB

config  0.000GB

local   0.000GB

 

> db.book.insert({"name": "Tutorial", "author": "whatwant"});

WriteResult({ "nInserted" : 1 })

 

> show dbs

admin     0.000GB

config    0.000GB

local     0.000GB

tutorial  0.000GB

 

> ^C

bye

 

 

반응형


docker-compose를 사용할 일이 있어서

docker 설치 후에 바로 docker-compose를 실행하려고 했더니 안되는 것이다.


알고보니 docker-compose는 별도로 설치를 해야한단다.


기본 레퍼런스는 아래 링크이다.

    - https://docs.docker.com/compose/install/


1. dependency packages


$ sudo apt-get install python-pip python-dev libffi-dev libssl-dev gcc libc6-dev make



2. download and setting


$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

$ sudo chmod +x /usr/local/bin/docker-compose

$ docker-compose --version


최신 버전은 직접 확인해보고 진행해보시길...


반응형


오랜만에 ubuntu에서 docker를 설치하려고 했는데...

Ubuntu 14.04 환경에서 설치가 안되었다. 이런... (https://www.whatwant.com/863)

뭐 이젠 14.04를 놓아줄 때도 된 것 같아서 ... 이를 극복하기 보다는 16.04 환경에서 진행해보기로 했다.

추가로 18.04에서도 해봤다.



공식 홈페이지 가이드를 따라서 진행했다.

- https://docs.docker.com/engine/installation/linux/ubuntu/



※ 이 블로그를 계속 봐오신 분들은 아시겠지만... 아래 내용은 직접 실행해보면서 작성한 것입니다.

※ VirtualBox를 이용하여 해당 OS를 설치하고 update까지만 마친 상태에서 진행하였습니다.




1. Ubuntu version

    - Ubuntu 14.04는 이제 지원하지 않는 것으로 보인다.

    - 특히, 64bit 만 지원한다! 32bit 안된다!



2. Binary 확인

    - 웹으로 다운로드 받을 버전을 확인하자.




3-1. Download 받기 (16.04)


$ wget https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/amd64/containerd.io_1.2.6-3_amd64.deb

$ wget https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/amd64/docker-ce-cli_18.09.7~3-0~ubuntu-xenial_amd64.deb

$ wget https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/amd64/docker-ce_18.09.7~3-0~ubuntu-xenial_amd64.deb


3-2. Download 받기 (18.04)


$ wget https://download.docker.com/linux/ubuntu/dists/bionic/pool/stable/amd64/containerd.io_1.2.6-3_amd64.deb

$ wget https://download.docker.com/linux/ubuntu/dists/bionic/pool/stable/amd64/docker-ce-cli_18.09.7~3-0~ubuntu-bionic_amd64.deb

$ wget https://download.docker.com/linux/ubuntu/dists/bionic/pool/stable/amd64/docker-ce_18.09.7~3-0~ubuntu-bionic_amd64.deb



4-1. Docker 설치하기 (16.04)


$ sudo dpkg --install ./containerd.io_1.2.6-3_amd64.deb

$ sudo dpkg --install ./docker-ce-cli_18.09.7~3-0~ubuntu-xenial_amd64.deb

$ sudo dpkg --install ./docker-ce_18.09.7~3-0~ubuntu-xenial_amd64.deb


4-2. Docker 설치하기 (18.04)


$ sudo dpkg --install ./containerd.io_1.2.6-3_amd64.deb

$ sudo dpkg --install ./docker-ce-cli_18.09.7~3-0~ubuntu-bionic_amd64.deb

$ sudo dpkg --install ./docker-ce_18.09.7~3-0~ubuntu-bionic_amd64.deb




5. Hello World


$ sudo docker run hello-world

Unable to find image 'hello-world:latest' locally

latest: Pulling from library/hello-world

1b930d010525: Pull complete 

Digest: sha256:41a65640635299bab090f783209c1e3a3f11934cf7756b09cb2f1e02147c6ed8

Status: Downloaded newer image for hello-world:latest


Hello from Docker!

This message shows that your installation appears to be working correctly.


To generate this message, Docker took the following steps:

 1. The Docker client contacted the Docker daemon.

 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.

    (amd64)

 3. The Docker daemon created a new container from that image which runs the

    executable that produces the output you are currently reading.

 4. The Docker daemon streamed that output to the Docker client, which sent it

    to your terminal.


To try something more ambitious, you can run an Ubuntu container with:

 $ docker run -it ubuntu bash


Share images, automate workflows, and more with a free Docker ID:

 https://hub.docker.com/


For more examples and ideas, visit:

 https://docs.docker.com/get-started/



끝~



반응형



회사에서 업무로 Splunk를 도입해서 사용하는 것을 보면서...

Linux 및 OpenSource 매니아로써... 왠지 ELK 조합에 대해서 공부를 해봐야겠다라는 생각이 불끈~!!



다들 알겠지만... 추구하는 방향은 다음과 같다.


   - 오픈소스 구성

   - Ubuntu 환경

   - 패키지 설치보다는 다운로드 방식으로



이번 포스팅에서는 일단 한 번 실행해보는 것으로 만족하겠다.

다음번 포스팅을 하게 되면 그 때 조금 더 실용적인(?) 방향으로 공부해보겠다.




1. [ ElasticSearch ] 다운로드


    - 현재 가장 최신 버전은 6.5.0 이다.

    - 이름에서 보는바와 같이 메인이 되는 놈이다.


$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.0.tar.gz


$ tar zxvf ./elasticsearch-6.5.0.tar.gz





2. [ LogStash ] 다운로드


    - 일단 다운로드는 받아보는데... 이번에는 아직 안써먹을거다.

    - 로그들을 받아서 분석하는 놈 같은데... 이번엔 생략


$ wget https://artifacts.elastic.co/downloads/logstash/logstash-6.5.0.tar.gz


$ tar zxvf ./logstash-6.5.0.tar.gz






3. [ Kibana ] 다운로드


    - 결과물을  보여주는 웹 페이지를 제공해주는 놈이다.


$ wget https://artifacts.elastic.co/downloads/kibana/kibana-6.5.0-linux-x86_64.tar.gz


$ tar zxvf ./kibana-6.5.0-linux-x86_64.tar.gz






4. [ ElasticSearch ] 실행환경 설정 - ulimit


    - 프로세스가 사용할 수 있는 자원의 한도 값을 정해주는 ulimit 설정을 해야 한다고 한다.

    - 그런데, ubuntu 설치하고 별도로 설정하지 않았는데, 기본 설정값으로 충분하네?!


$ ulimit -Hn

1048576


    - 보통 4096 정도의 기본값이라고 하던데.... 이미 충분하네!? 그러면 스킵~





5. [ ElasticSearch ] 실행환경 설정 - mmapfs


    - ElasticSearch에서 index 저장 공간으로 mmapfs 을 사용한다고 한다 (기본값)

    - 그런데 기본적으로 주어진 값이 작은 경우 문제가 있을 수 있으니...



$ sudo sysctl -a | grep vm.max_map_count


sysctl: reading key "net.ipv6.conf.all.stable_secret"

sysctl: reading key "net.ipv6.conf.default.stable_secret"

sysctl: reading key "net.ipv6.conf.enp0s3.stable_secret"

sysctl: reading key "net.ipv6.conf.enp0s8.stable_secret"

sysctl: reading key "net.ipv6.conf.lo.stable_secret"

vm.max_map_count = 65530


    - 65530 값은 작다 !! "262144" 로 올려줘야 함


$ sudo nano /etc/sysctl.conf


...

vm.max_map_count=262144


$ sudo reboot


    - 재부팅을 해야 적용이 된다.








6. [ ElasticSearch ] 설정파일 셋팅 - host


    - 접근할 때 사용할 주소를 설정하자


$ cd elasticsearch-6.5.0


$ nano ./config/elasticsearch.yml


...

network.host: 192.168.56.103

...


    - 필자의 경우에는 내부 IP 값을 설정했지만, DNS가 있으면 DNS를 사용하면 된다.


    - localhost 를 사용하지는 말자. 나중에 뭔가 꼬인다.






7. [ ElasticSearch ] 설정파일 셋팅 - JVM Heap


    - 서버의 메모리가 충분히 크다고 하면 별도 설정하지 않아도 된다고 한다.


    - 필자의 경우는 VirtualBox로 사용하는 아이라서 메모리가 충분하지 않다보니...


$ cd elasticsearch-6.5.0


$ nano ./config/jvm.options


...

#-Xms1g

#-Xmx1g

-Xms128m

-Xmx128m

...


    - 2개 값은 동일하게 설정하는 것이 좋단다. 음... 너무 작게 하는 것이 않은가 싶기는 하지만...






8. [ LogStash ] 설정파일 셋팅 - JVM Heap


    - 하는김에 LogStash 의 설정도 이어서 해버리자.


$ cd logstash-6.5.0


$ nano ./config/jvm.options


...

#-Xms1g

#-Xmx1g

-Xms128m

-Xmx128m

...








9. [ Kibana ] 설정파일 셋팅 - host


    - 주소값을 맞춰서 넣자.

$ cd kibana-6.5.0-linux-x86_64/

$ nano ./config/kibana.yml

server.host: "192.168.56.103"
elasticsearch.url: "http://192.168.56.103:9200"

    - server.host는 Kibana의 주소값을 넣는 것이고,
    - elasticsearch.url 값은 말 그대로 elasticsearch의 주소값을 넣어야 한다.
    - 실제로 elasticsearch에서 설정한 값 그대로 넣어야 한다. 주소가 같다고 localhost 등을 넣으면 접속이 안된다.






10. [ ElasticSearch ] 실행


    - 일단은 그냥 무조건 실행해 보자

$ cd elasticsearch-6.5.0

$ ./bin/elasticsearch

    - 데몬으로 실행하고 싶으면 "-d" 옵션을 붙이면 된다 ("-f" 옵션이 디폴트로 적용이 되어 있다)

    - 실행 결과는 http://192.168.56.103:9200 주소로 붙어보면 아래와 같이 나온다.


    - 주소가 같다고 하여 http://localhost:9200 으로 접속하면 제대로 나오지 않는다.






11. [ Kibana ] 실행


    - 단독으로 실행되지 않는다. ElasticSearch가 실행된 상태에서 실행해야 한다.


$ cd kibana-6.5.0-linux-x86_64/


$ ./bin/kibana


    - http://192.168.56.103:5601/ 주소로 접속해보면 아래와 같이 잘 나온다.



    - 뭔가 나오긴 하지만... 집어넣은 데이터가 없으니 볼게 없다.

    - 그나마 Monitoring 기능을 On 시키면 아래와 같은 화면을 볼 수 있다.



    - 이걸론 뭔가 썰렁하니 서버 정보를 밀어 넣어서 화면으로 볼 수 있게 해보자.







12. [ MetricBeat ] 다운로드


    - 일종의 플로그인처럼, 편하게 사용할 수 있도록 제공해주는 아이들을 Beat라고 부른다.

    - 그 중에서 서버 정보 등을 지표처럼 관리할 수 있게 해주는 것이 MetricBeat 이다.


$ wget https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-6.5.0-linux-x86_64.tar.gz


$ tar zxvf ./metricbeat-6.5.0-linux-x86_64.tar.gz







13. [ MetricBeat ] 환경설정 - host


    - 지금은 같은 서버에 설치를 하고 있지만, 본래 MetricBeat는 모니터링을 할 아이에게 설치를 하는 것이다.

    - Kibana와 ElasticSearch 등의 정보를 알려주자.

$ cd ./metricbeat-6.5.0-linux-x86_64


$ nano ./metricbeat.yml


...


#============================== Kibana =================================


setup.kibana:


  host: "192.168.56.103:5601"



#============================== Outputs =================================


#-------------------------- Elasticsearch output ------------------------------


output.elasticsearch:


  hosts: ["192.168.56.103:9200"]


    - 앞에서 설정한 값들을 참조하여 제대로 알려주면 된다.






14. [ MetricBeat ] 초기 셋업 그리고 실행


    - Kibana에 Dashboard 등을 제대로 반영할 수 있도록 셋업 작업을 해줘야 한다.


$ ./metricbeat setup -c metricbeat.yml


    - 셋업이 완료되면 이제 실행하자.


$ ./metricbeat -e


    - Kibana 에 접속해서 Management 항목을 들어가보면 아래와 같이 Create Index Pattern을 해야한다고 나온다.

    - 하단에 있는 "metricbeat.*"을 눌러버리자.



    - 이제 Dashboard를 보면 뭔가 주르륵 나온다.



    - 지금 뭔가 돌리고 있는 서버가 아니라서.... System Overview 항목을 선택해보자.



    - 뭔가 그럴듯해졌다.




아직은 내가 마음먹은대로 사용하기에는 아는게 부족한 상태다.

임의의 데이터도 집어넣고 임의로 데이터를 뽑아내고 그래야할텐데...



일단 뭔가 나오도록은 했으니... 하나씩 계속 내걸로 만들어야겠다.







아래 사이트를 통해서 많은 도움을 받았다.

    - https://github.com/higee/elastic/wiki/Elastic-Stack-%EC%84%A4%EC%B9%98-%EB%B0%8F-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95.



반응형


앞에서 playbook을 사용하는 것을 살짝 맛봤는데,

이번에는 조금 더 진보된 playbook을 작성해서 사용해보자.





1. 새로운 playbook 작성


    - "apt-get upgrade"를 실행시키기 위한 playbook이다.


$ nano ./apt-upgrade.yml


- hosts: all

  tasks:

    - name: Update and upgrade apt packages

      become: true

      apt:

        upgrade: yes

        update_cache: yes

        cache_valid_time: 86400 #One day




2. 설명....


    - hosts: all → hosts 파일에 등록된 모든 아이들에게 실행하라는 의미

    - tasks → 해야할 일을 적겠다라는 의미

    - name → 해야할 일을 설명? 하기 위해서 적어주는 내용

    - become: true → sudo 권한으로 일을 하겠다라는 의미

    - apt: → apt와 관련된 모듈을 사용하겠다라는 의미

    - upgrade: yes → "apt-get upgrade" 명령과 같은 의미

    - update_cache ... cache_valid_time → "apt-get update"를 실행하는데, 하루 이내라면 생략~




3. apt 모듈과 관련되어서 더 알고 싶다면 아래 링크 참조


    - http://docs.ansible.com/ansible/apt_module.html




4. 그러면 일단 실행 !!!


$ ansible-playbook ./apt-upgrade.yml 


PLAY [all] *************************************************************************************


TASK [Gathering Facts] ***********************************************************************

ok: [192.168.100.105]


TASK [Update and upgrade apt packages] **************************************************

fatal: [192.168.100.105]: FAILED! => {"changed": false, "failed": true, "msg": "Could not find aptitude. Please ensure it is installed."}

to retry, use: --limit @/srv/workspace/ansible/apt-upgrade.retry


PLAY RECAP **********************************************************************************

192.168.100.105            : ok=1    changed=0    unreachable=0    failed=1


    - 어?! 에러가 발생했다. "Could not find aptitude. Please ensure it is installed."





5. aptitude가 필요한 노예 !!!


    - 주인의 말을 제대로 알아듣기 위해서는 노예(slave)에게 aptitude 패키지를 설치해줘야 한다.


$ sudo apt-get install


    - 아니면 이마저도 ansible을 통해 설치해볼 수도 있다.



$ nano ./install-aptitude.yml


- hosts: all

  tasks:

    - name: install aptitude

      raw: sudo apt-get -y install aptitude


$ ansible-playbook ./install-aptitude.yml 


PLAY [all] *************************************************************************************


TASK [Gathering Facts] ***********************************************************************

ok: [192.168.100.105]


TASK [install aptitude] ************************************************************************

changed: [192.168.100.105]


PLAY RECAP **********************************************************************************

192.168.100.105            : ok=2    changed=1    unreachable=0    failed=0   





6. 이제 다시 실행해보자.


$ ansible-playbook ./apt-upgrade.yml 


PLAY [all] *************************************************************************************


TASK [Gathering Facts] ***********************************************************************

ok: [192.168.100.105]


TASK [Update and upgrade apt packages] **************************************************

ok: [192.168.100.105]


PLAY RECAP **********************************************************************************

192.168.100.105            : ok=2    changed=0    unreachable=0    failed=0  




이제서야 ansible 에 대해서 조금 감이 온다!

여러분도???? ^^



이제 실무에 사용하기 위해서 필요한 것들이 뭔가 더 없을지 알아봐야겠다.



반응형


Server 관리를 위해 이것저것 보다가 발견한 Ansible,

그런데, Docker 관련하여 시스템 환경 셋팅을 할 일이 있어서 알아보다가 다시 만난 Ansible


생각보다 나온지는 꽤 된 놈이다. 무려.... 2012년...


아는 사람들은 꽤 오래전부터 사용해왔던듯.




Ubuntu에서 패키지로도 제공은 해주지만,

개인적인 취향으로 (그리고 폐쇄된 망을 사용해야하는 경우를 위해)

직접 Source를 내려받아서 package를 만들어서 설치하는 방법으로 알아보겠다.




1. 필요한 패키지들을 좀 설치해야 한다.


$ sudo apt-get install python-setuptools python-dev libffi-dev libssl-dev python-yaml python-paramiko python-jinja2 cdbs debhelper dpkg-dev reprepro asciidoc devscripts pbuilder sshpass




2. 소스코드는 GitHub로부터 다운로드를 받아야 한다. (당연히 git이 미리 설치되어 있어야 한다)


$ git clone git://github.com/ansible/ansible.git --recursive





3. dep 패키지를 만들어보자.



$ cd ./ansible


$ make deb-src


$ cd ./deb-build/unstable/ansible-2.4.0/


$ dpkg-buildpackage -us -uc -rfakeroot





4. 만들어 놓은 것을 이제 설치해보자.


$ cd ..


$ ls -al

합계 8072

drwxrwxr-x  3 u14 u14    4096  7월 16 20:15 ./

drwxrwxr-x  3 u14 u14    4096  7월 16 19:52 ../

drwxrwxr-x 11 u14 u14    4096  7월 16 20:14 ansible-2.4.0/

-rw-r--r--  1 u14 u14     792  7월 16 20:14 ansible_2.4.0-100.git201707151558.1a27546.devel~unstable.dsc

-rw-rw-r--  1 u14 u14 5845022  7월 16 20:14 ansible_2.4.0-100.git201707151558.1a27546.devel~unstable.tar.gz

-rw-r--r--  1 u14 u14 2387746  7월 16 20:15 ansible_2.4.0-100.git201707151558.1a27546.devel~unstable_all.deb

-rw-rw-r--  1 u14 u14    1620  7월 16 20:15 ansible_2.4.0-100.git201707151558.1a27546.devel~unstable_amd64.changes

-rw-r--r--  1 u14 u14    2375  7월 16 19:52 ansible_2.4.0-100.git201707151558.1a27546.devel~unstable_source.build

-rw-r--r--  1 u14 u14    1240  7월 16 19:52 ansible_2.4.0-100.git201707151558.1a27546.devel~unstable_source.changes


$ sudo dpkg --install ./ansible_2.4.0-100.git201707151558.1a27546.devel~unstable_all.deb




5. 버전 확인하기


$ ansible --version

ansible 2.4.0

  config file = /etc/ansible/ansible.cfg

  configured module search path = [u'/home/u14/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']

  ansible python module location = /usr/lib/python2.7/dist-packages/ansible

  executable location = /usr/bin/ansible

  python version = 2.7.6 (default, Oct 26 2016, 20:30:19) [GCC 4.8.4]



엄청 쉽다~!!!



반응형


DevOps 트렌드에 발맞추기 위해서 이런 저런 도구들을 찾아보면,

최근 가장 유명한 것은 Chef 아니면 Puppet 이라는 이름이 검색되곤 한다.


하지만, Ansible도 나름 유명한 도구라는...

그래서 계속 더 공부해보기로 했다.



1. hosts 파일

    - 앞에서는 임의의 위치에 hosts 파일을 만들어서 "-i" 옵션을 통해 직접 파일을 지정해주었다.

    - 하지만, 기본 경로에 해당 파일을 위치시키면 아주 편하게 사용할 수 있다.


$ sudo mkdir /etc/ansible

$ sudo nano /etc/ansible/hosts


[staging]

192.168.100.105



2. playbook 작성

    - 어떤 서버에게 어떤 일을 시킬 것인지를 적어놓는 파일을 playbook 이라고 한다.

    - ping을 하는 것을 하나 만들어보자.


$ nano ./ping-test.yml


- hosts: all

  tasks:

    - name: ping

      action: ping



3. playbook 실행

    - 앞에서 작성한 hosts 파일과 playbook을 이용하여 일을 시켜보자.


$ ansible-playbook ./ping-test.yml


PLAY [all] ***********************************************************************************************************


TASK [Gathering Facts] ********************************************************************************************

ok: [192.168.100.105]


TASK [ping] ********************************************************************************************************

ok: [192.168.100.105]


PLAY RECAP *********************************************************************************************************************

192.168.100.105            : ok=2    changed=0    unreachable=0    failed=0



혹시 노예(Slave)가 말을 잘 듣지 않는 경우라면... 주인의 키를 노예에게 알려주지 않은 것이 아닌지 확인해보자.

    - http://www.whatwant.com/395




Ansible 관련 문서나 가이드들이 꽤 많이 검색이 되지만,

나처럼 멍청한 사람을 위한 친절하고 쉬운 가이드가 없어서 고생하고 있다.


일단, 위의 가장 단순한 형태의 Sample로 playbook을 이용하는 방법을 맛보자!


다음 기회에 한 발 더 걸음을 내딪어보자.


반응형

 

Docker에서는 이미 주어진 Image들을 다운로드 받아서 사용하고 있다.

그러면, 이러한 Image들은 어디에 있는 것일까?!

 

"Docker Hub"라는 공식적으로 운영하고 있는 Image Server가 바로 그 곳이다.

 

이름에서 떠오르는 것과 같이.... GitHub와 같은 역할을 하는 아이다.

소스코드가 아닌 Docker Image를 저장하는 그 곳!

명령어도 유사하다~

 

 

 

 

 

그런데, 우리는 (나 혼자만?) 공식적인 것 말고.... 사적인 것, 나만의 것을 갖고 싶은 욕구가 있다.

즉, 나만의 Docker Hub를 운영하고 싶으면 어떻게 해야할까?

 

 

 

이럴 때 필요한 구글신께 외치는 주문~!!!

   - Docker Registry Server Install

 

그러면, 게시를 내려주시는 우리의 구글신님~!!!

   - https://docs.docker.com/registry/deploying/

 

 

 

 

우리가 지금부터 해야할 것은 "Docker Registry Server"를 구축하는 것이다.

 

 

 

 

 

Docker와 관련이 있는 것이니만큼, Docker Registry Server 역시 Docker 이미지로 배포가 된다.

즉, 별도의 설치과정 없이 이미지를 다운로드 받아서 실행하면 된다는...

 

하지만, 언제나처럼 제대로 사용하기 위해서는 공부를 해야하고, 시행착오를 겪어야 한다는... ^^

 

 

 

 

 

일단, Docker를 설치해야한다.

   - [ Docker Install (Ubuntu 14.04 - 64bit) - using Download ] : http://www.whatwant.com/863

 

 

 

이제 우리가 필요한 Registry Server의 이미지를 땡겨오자.

 

$ sudo docker pull registry
Using default tag: latest
latest: Pulling from library/registry
90f4dba627d6: Pull complete
3a754cdc94a5: Pull complete
0756a217635f: Pull complete
f82b9495c796: Pull complete
154ef19ddee6: Pull complete
Digest: sha256:5eaafa2318aa0c4c52f95077c2a68bed0b13f6d2b464835723d4de1484052299
Status: Downloaded newer image for registry:latest

 

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
registry              latest              c2a449c9f834         3 days ago          33.2 MB
hello-world         latest              1815c82652c0        2 weeks ago         1.84 kB

 

 

 

 

실행은 간단하다.

 

$ sudo docker run --name my-registry -d --restart=always -p 5000:5000 registry
0af462462b05ea13191470dff48ab52edf2206b65c885d2d82fd5c319daca63a

 

$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
0af462462b05        registry            "/entrypoint.sh /e..."   9 seconds ago       Up 8 seconds        0.0.0.0:5000->5000/tcp   my-registry

 

"--name" 옵션 뒤에 앞으로 사용할 Container 이름을 임의로 지어주면 되고...

"-d" 옵션을 통해서 Daemon으로 실행하고 싶다고 알려주고~

"--restart=always" 옵션을 통해서 Container 안에서 프로세스가 죽더라도 항상 재시작을 하도록 하고~

"-p" 옵션으로 포트 매핑을 해주면 된다.

 

제일 뒤에는 원본(?)으로 사용할 이미지를 지정해준다.

 

ps를 통해서 실행되고 있는 모습을 확인해볼 수 있다.

 

 

 

 

 

지금 실행해 놓은 Registry를 실험해보기 위해서, 등록해볼 마루타를 하나 만들어보자.

 

 

 

Dockerfile을 하나 만들어보자.

 

$ nano ./Dockerfile

 

FROM busybox
MAINTAINER whatwant <whatwant@gmail.com>
CMD /bin/echo "hi-world!!"

 

방금 만든 마루타의 Dockerfile을 빌드해서 이미지로 만들어보자.

 

$ sudo docker build -t hi-world .
Sending build context to Docker daemon 2.048 kB
Step 1/3 : FROM busybox
 ---> c30178c5239f
Step 2/3 : MAINTAINER whatwant <whatwant@gmail.com>
 ---> Running in 6115aa49c789
 ---> efaf526395ee
Removing intermediate container 6115aa49c789
Step 3/3 : CMD /bin/echo "hi-world!!"
 ---> Running in b57e417ec463
 ---> 0983858cdd37
Removing intermediate container b57e417ec463
Successfully built 0983858cdd37

 

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hi-world            latest              0983858cdd37     14 seconds ago       1.11 MB
registry             latest              c2a449c9f834        3 days ago           33.2 MB
busybox            latest              c30178c5239f        2 weeks ago         1.11 MB
hello-world       <none>           1815c82652c0        2 weeks ago         1.84 kB

 

 

 

이미지를 만들었으면, 이제는 우리의 Registry Server에 등록을 해보자.

 

$ sudo docker tag hi-world localhost:5000/hi-world


$ sudo docker push localhost:5000/hi-world
The push refers to a repository [localhost:5000/hi-world]
3a1dff9afffd: Pushed
latest: digest: sha256:b182254942f5ffeb903b7125c4693e12c2330db6c16a75681e76c633535edade size: 527

 

잘 등록되었는지 확인도 해보자.

 

$ curl -X GET http://localhost:5000/v2/_catalog
{"repositories":["hi-world"]}

 

$ curl -X GET http://localhost:5000/v2/hi-world/tags/list
{"name":"hi-world","tags":["latest"]}

 

 

 

 

이번에는 Registry Server를 제대로 사용할 수 있는지 확인해보자.

그런데, 이미 가지고 있는 이미지들이 있으니 테스트를 위해서 확인하고 지워놓자.

 

$ sudo docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
hi-world                  latest              81d1537591cc        32 minutes ago      1.11 MB
localhost:5000/hi-world   latest              81d1537591cc        32 minutes ago      1.11 MB
registry                  latest              c2a449c9f834        3 days ago          33.2 MB
busybox                   latest              c30178c5239f        2 weeks ago         1.11 MB
hello-world               latest              1815c82652c0        2 weeks ago         1.84 kB

 

hi-world, localhost:5000/hi-world 2개의 이미지가 있다. 지우자!

 

$ sudo docker rmi hi-world
Untagged: hi-world:latest


$ sudo docker rmi localhost:5000/hi-world
Untagged: localhost:5000/hi-world:latest
Untagged: localhost:5000/hi-world@sha256:410ad4c96024f632bde893190d71a3c10457419c50375ab1d878f2ad67d76775
Deleted: sha256:81d1537591cc43e879aeed3e0556788f9b6b75ab6377fd1db6c9266472f27f09
Deleted: sha256:358acd2e8b9f52adffcdd2870487bdc36d7842677d602ffdf533776ac55a7574

 

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
registry            latest              c2a449c9f834        3 days ago          33.2 MB
busybox             latest              c30178c5239f        2 weeks ago         1.11 MB
hello-world         latest              1815c82652c0        2 weeks ago         1.84 kB

 

hi-world 이미지가 없는 것을 확인했다.

이제 땡겨오자.

 

 

$ sudo docker pull localhost:5000/hi-world
Using default tag: latest
latest: Pulling from hi-world
27144aa8f1b9: Already exists
Digest: sha256:410ad4c96024f632bde893190d71a3c10457419c50375ab1d878f2ad67d76775
Status: Downloaded newer image for localhost:5000/hi-world:latest

 

$ sudo docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
localhost:5000/hi-world   latest              81d1537591cc        33 minutes ago      1.11 MB
registry                  latest              c2a449c9f834        3 days ago          33.2 MB
busybox                   latest              c30178c5239f        2 weeks ago         1.11 MB
hello-world               latest              1815c82652c0        2 weeks ago         1.84 kB

 

잘 받아온 것을 확인했다.

 

 

동작이 잘되는지도 확인해보자.

 

$ sudo docker run localhost:5000/hi-world
hi-world!!

 

물론 잘된다.

 





혹시 아래와 같은 에러가 발생할 경우에는...


$ sudo docker pull xxx.xxx.xx.xx:5000/asdf

Using default tag: latest

Error response from daemon: Get https://xxx.xxx.xxx.xxx:5000/v1/_ping: http: server gave HTTP response to HTTPS client



아래와 같이 환경설정을 해주면 된다.


$ sudo nano /etc/default/docker

 

...

# Use DOCKER_OPTS to modify the daemon startup options.

#DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"

DOCKER_OPTS="--insecure-registry xxx.xxx.xxx.xxx:5000"

...


$ sudo service docker restart

 



 

기본적인 사항은 여기까지 해서 살펴보았지만...

아직 사용하기에는 문제가 많이 있는 상태이다.

 

당장 인증 관련한 부분에 있어서 문제가 있다. 아무나 쓸 수 있도록 한다면 뭐 무방하지만.... ^^

LDAP과 같은 계정서버와의 연계라던지 아니면 로드밸런싱이라던지... 등 알아봐야할게 아직 많다.

 

뭐 일단, 이번 포스트는 여기까지~

 

반응형

+ Recent posts