ansible-vault 커맨드 간단 정리



커맨드

설명

ansible-vault encrypt file.yml

일반 텍스트 파일인 file.yml을 암호화한다

ansible-vault decrypt file.yml


암호화된 file.yml 파일을 해독한다

ansible-vault view file.yml

암호화된 file.yml 파일의 내용을 출력한다

ansible-vault create file.yml

암호화된 새로운 파일 file.yml을 생성한다

ansible-vault edit file.yml

암호화된 파일 file.yml 파일을 수정한다

ansible-vault rekey file.yml

암호화된 파일 file.yml의 암호를 변경한다




앤서블 2.4 버전부터는 커맨드 라인에서 --vault-id를 사용해 볼트 암호 사용을 권장하고 있다.


암호가 ~/password.txt 텍스트 파일에 저장되어 있고 --vault-id 플래그를 사용해 암호 파일의 위치를 ansible-playbook 에게 전달한다.

ansible-playbook --vault-id ~/password.txt secrets.yml


암호화 파일을 해독하려면 --vault-id @prompt 플래그를 사용한다.

ansible-playbook --vault-id @prompt secrets.yml



앤서블 2.4 버전 이전에는 앤서블 실행시 하나의 볼트 암호만 사용할 수 있었었지만 2.4 버전 이후부터 다중 볼트 암호를 사용하여 지원해 --vault-id를 여러 번 제공할 수 있다. 그러나 --vault-id 옵션은 Ansible 2.4 이전 버전을 지원하지 않는다.

여러 볼트 암호가 제공된 경우 기본적으로 앤서블은 커맨드 라인에서 제공된 순서대로 각 볼트 암호를 시도하여 볼트 내용을 해독할 것이다.

예를 들어 특정 파일에 읽은 'dev' 암호를 사용해 'prod' 암호를 입력하라는 메시지를 표시하려면 다음과 같이 사용할 수 있다.

 

ansible-playbook --vault-id dev@dev-password --vault-id prod@prompt secrets.yml



자세한 정보는 https://docs.ansible.com/ansible/latest/user_guide/vault.html에..



Posted by 김용환 '김용환'



13번째 번역책을 내어놓게 되었다. 나에게는 2018년 초 A형 독감을 안겨주었지만, 


아프기도 하고 포기하기도 싶었지만..


인내를 배우고, 또 인내를 배우며.


번역서 기준 1000페이지가 넘는 책을 내어놓게 되었다.




나에게 스칼라, 특히 스파크를 통해 해볼 수 있는 것이 무엇인지 잘 알려준 책이다. 


이미 회사에서 스칼라/스파크 개발을 통해 뼈를 깎는 고통이 무엇인지 알기에.. 이 책을 통해 조금이나마 나와 같은 분들이 그 시간을 빨리 지나가도록 도움을 주면 좋을 것 같다.




Aggregation, 많은 머신러닝 / 통계 책을 보면서 갈급했던 내용들(어떤식으로 엔지니어링(API화)한 것이 무엇인지)이 참 좋았다. 



머신 러닝에 대한 내용들이 조금 어렵긴 하지만 좋은 가이드를 주는 좋은 책이라 생각된다. 파이팅!!


엔지니어, 프로그래머도 스파크를 통해 머신 러닝/추천 시스템을 쉽게 개발할 수 있으리라 믿는다. 





http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9791161752402&orderClick=LET&Kc=#N





★ 옮긴이의 말 ★ 

하둡 맵리듀스(Hadoop MapReduce) 프로그래밍은 최근 몇 년 동안 잘 사용되고 있습니다. 또한 데이터가 저장된 하둡 분산 파일 시스템을 기반으로 하는 분석, 추천 프로그래밍은 하둡 내부에서만 가능했기에 개발자들이 하둡 인터페이스를 사용해 개발해야 했습니다. 그러나 일반 개발자가 이해하기 어려운 개념과 인터페이스가 있어 하둡과 하둡 맵리듀스를 잘 이해하는 개발자가 전문적으로 개발하곤 했습니다. 일반 개발자들이 쉽게 분석할 수 있도록 아파치 하이브(Hive) 등 다양한 하둡 관련 프레임워크가 사용되기 시작했습니다. 그러나 여전히 유연하지 않을 뿐 더러 하둡 맵리듀스 개발은 변화되지 않았고, 테스트 코드 개발 역시 쉽지 않았습니다. 하둡 프로그래밍의 약점은 대용량 데이터에 대한 실시간 처리입니다. 따라서 하둡 대신 실시간 데이터를 처리하는 메시징 큐(예, 카프카)를 사용하고 있습니다. 그러다 보니 스트리밍 처리를 처리하기 위해 아파치 스톰(Apache Storm), 스파크 스트리밍(Spark Streaming), 아파치 플링크(Apache Flink) 등 많은 오픈 소스가 쓰이고 있습니다. 
저는 현업 개발자이지만 다양한 NoSQL, 대용량, 비즈니스에 관심이 많습니다. 저는 스칼라/스파크를 사용해 애플리케이션을 개발했고, 메소스/마라톤 및 쿠버네티스에서 애플리케이션에서도 애플리케이션을 개발했습니다. 따라서 하둡 맵리듀스 프로그래밍은 스파크로 대체될 것이라는 굳은 믿음이 있습니다. 누구나 스칼라를 제대로 알 수 있다면 하둡 맵리듀스 프로그래밍을 스칼라 기반의 스파크 프로그래밍으로 대체 및 보완할 수 있을 것이라 확신합니다. 
저뿐 아니라 많은 개발자가 하둡 맵리듀스 프로그래밍, 기존 파이프라인 프로그래밍 및 머신 러닝 프로그래밍을 점차 스파크 프로그래밍으로 대체되고 보완하고 있습니다. 스트리밍 처리, 대용량 분석 처리, 추천 시스템 개발, 인메모리 병렬처리, 머신 러닝까지 여러 분야의 애플리케이션을 스파크 하나만 알면 어느 정도 진행할 수 있습니다. 따라서 람다 아키텍처를 스파크로 쉽게 처리할 수 있습니다. 스파크는 CNN과 같은 딥러닝을 지원하지 않지만 텐서플로(Tensorflow)와 쉽게 연동할 수 있습니다. 그리고 스파크는 자바, 스칼라, 파이썬, R 언어를 지원하기 때문에 언어에 대한 부담이 가장 덜합니다. 
특히 스칼라의 함수형 언어의 특징과 데이터프레임을 추상화한 스칼라 기반의 스파크를 활용함으로써 빅데이터를 논리적인 프로그래밍으로 쉽게 처리할 수 있습니다. 많은 개발자가 스스로 공부하며 빅데이터, 머신 러닝의 영역으로 진입하고 있는데 그에 함께 가고 싶습니다. 
이 책은 전반적으로 설명이 많고 그림이 풍부합니다. 특히, 집계 부분은 중요한 내용을 잘 설명하고 있습니다. 저는 이전부터 통계와 머신 러닝을 공부하고 있었는데 실제 스파크 애플리케이션에서 어떻게 연동되는지는 이 책을 통해 잘 이해하게 됐습니다. 머신 러닝을 처음 도전하시는 분에게는 이 책이 좀 어렵다고 느낄 수 있겠지만 많은 도움이 될 것입니다. 빅데이터 분석과 머신 러닝에 대한 많은 내용을 포함한 ‘전과' 같은 이 책이 여러분들에게도 현업에서 큰 도움이 되면 좋겠습니다. 
이 책은 원서와 달리 최신 2.3.2 버전으로 작성됐습니다. 기존의 원서에서 제공하는 코드의 오타와 호환성을 수정해 옮긴이의 github 저장소(https://github.com/knight76/Scala-and-Spark-for-Big-Data-Analytics)를 제공하고 있으니, 참고하시기 바랍니다.




원서  : Scala and Spark for Big Data Analytics: Explore the concepts of functional programming, data streaming, and machine learning

https://www.amazon.com/Scala-Spark-Big-Data-Analytics/dp/1785280848








Posted by 김용환 '김용환'




금융권 클라우드 이용 확대 방안 (pdf)


https://www.fsc.go.kr/downManager?bbsid=BBS0030&no=127829




요약:


Posted by 김용환 '김용환'




네이버에서 송창현 이사님이랑 함께 일해서 참 좋았다. 


JVM 성능 / 튜닝 관련해서 함께 얘기하고 대화하며 먼가를 더 깊이 파보고(토론)


더 깊이 알고 했던 젊은 날의 나에게 좋은 형 같은 분이었다.



그리고 성장에 관심이 많으신 분이셨다.


이제 네이버를 그만두지만 또 다른 도전을 하시리라 생각된다.





좋은 리더십을 보여주신 분으로 기억한다. 새로운 출발에 파이팅!!








http://www.bloter.net/archives/166736



‘스스로 원하는’ 개발자가 되는 게 중요

송창현 연구센터장은 이 때 얻은 경험을 바탕으로 현재 네이버 개발자들을 가르친다. 2008년 네이버에 입사해 기술혁신센터를 비롯해 다양한 개발 조직을 이끌면서, 개발자들이 최대한 자유롭고 즐겁게 개발하면서 동시에 열정적인 개발자가 될 수 있는 환경을 조성하려고 노력했다. 실제로 그가 수장이 돼 운영하는 네이버랩스실 한 쪽 벽면에는 다음과 같은 글이 적혀 있다.

1. 팀이 없는 것처럼 협업하라. 같이 일을 하게 되면 자리를 옮겨서 같이 해라.
2. 지시하지 말고 토론하라.
3. 자신이 무엇을 하고 있고, 무엇을 잘 하는지, 무엇을 하고 싶어하는지 알려라.
4. 핵심기능·기술에만 먼저 집중하여 작게 시작하여 완성하고, 자신을 성장시키며 제품도 같이 성장시켜라
5. 자신보다 더 똑똑한 사람을 뽑아라. 단 팀플레이어만.
6. 자신과 생각이 다른 사람들과 가까이 하라. 불편함을 우정으로 풀어라.
7. 빠른 성장과 진행을 위해 팀을 작게 만들어라.
8. 잘못되어 가는 것이 보이면 빨리 뒤집어라. 고칠것이 있으면 자신이 고쳐라.
9. 자신이 만들고 있는 것이 어떤 유저의 어떤 문제를 해결하는지 자신에게 물어라
10. 항상 유저를 찾고 그들과 소통하라
11. 지식 공유를 하지 않는다는 것은 자신이 성장하고 있지 않다는 이야기다.
12. 결코 어른이 되지 마라. 기술에 대한 열정과 마음은 그대로 남아 있어라.


Posted by 김용환 '김용환'

tmux 사용 방법

Tool 2018.12.19 19:23


<자주 사용하는 tmux 사용 방법>



1. 세션 열기


$ tmux new -s [이름]

예) tmux new -s screen1



$ tmux new -s foo -d

(데몬으로 뜸)



$ tmux
(그냥 tmux 세션으로 들어감)





2. 세션 목록 보기


[~]  tmux ls

foo: 1 windows (created Wed Dec 19 20:39:30 2018) [80x24]

screen1: 1 windows (created Wed Dec 19 20:31:49 2018) [154x71] (attached)






3.  세션 들어가기 (attach)


$ tmux a -t [name] 

예) tmux a -t foo




4.  세션 나가기  (detach)

ctrl + b을 누르고 d를 누른다.


(ctrl + b) + d






5. 세션 종료하기


$ tmux kill-session -t [name]

예) tmux kill-session -t screen1




6.  세션에서 윈도우 (탭) 실행하기


(ctrl + b) + c


(개인적으로 이것보다는 pane이 편함)





7. 세션에서 panel 작업하기


horizontal split : (ctrl + b) + "

vertical split : (ctrl + b) + %

pane 이동하기 : (ctrl + b) + 방향키

pane 닫기 : (ctrl +d)




Posted by 김용환 '김용환'



https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/#customresourcedefinitions


ThirdPartyResource 가 1.8부터 custom resource definition으로 대체되었다.


관련 예시이다.


 


$ vi crd.yaml

apiVersion: apiextensions.k8s.io/v1beta1

kind: CustomResourceDefinition

metadata:

  name: crontabs.training.lfs458.com

    # This name must match names below.

    # <plural>.<group> syntax

spec:

  scope: Cluster #Could also be Namespaced

  group: training.lfs458.com

  version: v1

  names:

    kind: CronTab #Typically CamelCased for resource manifest

    plural: crontabs #Shown in URL

    singular: crontab #Short name for CLI alias

    shortNames:

    - ct #CLI short name




$ kubectl create -f crd.yaml



$  kubectl get crd

NAME                           AGE

crontabs.training.lfs458.com   4m



$ kubectl describe crd crontab

Name:         crontabs.training.lfs458.com

Namespace:

Labels:       <none>

Annotations:  <none>

API Version:  apiextensions.k8s.io/v1beta1

Kind:         CustomResourceDefinition

Metadata:

  Creation Timestamp:  2018-12-18T05:49:45Z

  Generation:          1

  Resource Version:    3992526

  Self Link:           /apis/apiextensions.k8s.io/v1beta1/customresourcedefinitions/crontabs.training.lfs458.com

  UID:                 b92d0073-0288-11e9-9a46-fa163e964181

Spec:

  Group:  training.lfs458.com

  Names:

    Kind:       CronTab

    List Kind:  CronTabList

    Plural:     crontabs

    Short Names:

      ct

    Singular:  crontab

  Scope:       Cluster

  Version:     v1

Status:

  Accepted Names:

    Kind:       CronTab

    List Kind:  CronTabList

    Plural:     crontabs

    Short Names:

      ct

    Singular:  crontab

  Conditions:

    Last Transition Time:  2018-12-18T10:49:45Z

    Message:               no conflicts found

    Reason:                NoConflicts

    Status:                True

    Type:                  NamesAccepted

    Last Transition Time:  2018-12-18T10:49:45Z

    Message:               the initial names have been accepted

    Reason:                InitialNamesAccepted

    Status:                True

    Type:                  Established

Events:                    <none>


$ vi  new-crontab.yaml

apiVersion: "training.lfs458.com/v1"

  # This is from the group and version of new CRD

kind: CronTab

  # The kind from the new CRD

metadata:

  name: new-cron-object

spec:

  cronSpec: "*/5 * * * *"

  image: some-cron-image

    #Does not exist



$ kubectl create -f new-crontab.yaml



$ kubectl get CronTab

NAME              AGE

new-cron-object   4m


$ kubectl get ct

NAME              AGE

new-cron-object   4m


$ kubectl describe ct


Name:         new-cron-object

Namespace:

Labels:       <none>

Annotations:  <none>

API Version:  training.lfs458.com/v1

Kind:         CronTab

Metadata:

  Cluster Name:

  Creation Timestamp:  2018-12-18T10:52:21Z

  Resource Version:    3992891

  Self Link:           /apis/training.lfs458.com/v1/new-cron-object

  UID:                 16295359-0289-11e9-9a46-fa163e964181

Spec:

  Cron Spec:  */5 * * * *

  Image:      some-cron-image

Events:       <none>



$ kubectl delete -f crd.yaml

$ kubectl get CronTab
No resources found.

$ kubectl get ct

No resources found.


Posted by 김용환 '김용환'



<로그 파일 위치>



kubernetes의 마스터(master) 노드에서 로그 위치는 다음과 같다.


1. API : /var/log/kube-apiserver.log

2. 스케줄 : /var/log/kube-scheduler.log

3. 복제 관리 : /var/log/kube-controller-manager.log

4. 컨테이너 로그 : /var/log/containers/

5. pod : /var/log/pods/



워커(worker) 노드의 로그는 다음과 같다.


1. 노드에서 실행 중인 컨테이너 : /var/log/kubelet.log

2. 서비스 로드 밸런싱 : /var/log/kube-proxy.log





<pod bash 연결>

$ kubectl exec <POD-NAME> -c <CONTAINER-NAME> -- <COMMAND>
$ kubectl run -it --rm --restart=Never busybox --image=busybox /bin/bash





<pod 로그 보기>


$ kubectl get po --all-namespaces

...

kube-apiserver-k8s-master1

...

$ kubectl -n kube-system logs kube-apiserver-k8s-master1

..



이외 디버깅 방법


https://kubernetes.io/docs/tasks/debug-application-cluster/debug-service/


https://kubernetes.io/docs/tasks/debug-application-cluster/determine-reason-pod-failure/


Posted by 김용환 '김용환'




Label

- 개체의 메타 데이터를 설정 : Kubernetes 클러스터에서 개체를 그룹화/목록/작업 용

- Pod과 ReplicaSet 등의 Kubernetes 개체에 부여하는 키-값 쌍.



Annotation

- Label과 마찬가지로 키-값, 개체의 메타 데이터를 저장 : 자동화 툴 또는 클라이언트 라이브러리에서 사용하는 메타 데이터를 저장하는 키-값 스토어.객체에 대한 임의의 정보를 저장

- 식별 정보는 아니다. 따라서 히스토리, 스케줄 정책, 부가 정보 등등을 저장한다

Posted by 김용환 '김용환'



앤서블 설치 방법


1. 패키지 관리자 (brew나 pip 등)를 사용한다.


$ sudo pip install ansible



2. virtualenv에 연동할 수 있다.


$ wget https://raw.githubusercontent.com/mitsuhiko/pipsi/master/get-pipsi.py 

$ python get-pipsi.py 

$ pipsi install ansible





Posted by 김용환 '김용환'



쿠버네티스에서 데몬셋에 대한 히스토리(history)를 확인할 수 있고, 롤백도 가능한다.




아래는 데몬셋 ds-one에 nginx 이미지를 1.7.9로 했다가 1.8.1-alpine으로 변경했고 이를 변경 전 버전으로 롤백하는 예시이다.



$ kubectl rollout history ds ds-one

daemonsets "ds-one"

REVISION CHANGE-CAUSE

1 <none>

2 <none>      



$ kubectl rollout history ds ds-one --revision=1

daemonsets "ds-one" with revision #1

Pod Template:

Labels: system=DaemonSetOne

Containers:

nginx:

Image: nginx:1.7.9

Port: 80/TCP

Environment: <none>

Volumes: <none>



$ kubectl rollout history ds ds-one --revision=2

....

Image: nginx:1.8.1-alpine



$ kubectl rollout undo ds ds-one --to-revision=1

daemonset.extensions/ds-one rolled back


Posted by 김용환 '김용환'