[Coursera 2코스]Using Python to Interact with the Operating System qwiklabs answer
#!/usr/bin/env python3 import subprocess import csv import re import operator def report_error(): error_dic = {} error_list = subprocess.check_output(["grep","ERROR","syslog.log"]).decode() error_list = error_list.split('\n') for i in range(len(error_list)-1): line = error_list[i] value = re.search(r"ticky: ERROR ([\w ]*) ", line).group(1) if value in error_dic: error_dic[value]+=1 else: error_d..
2020.02.13
no image
[기사 번역]Terraform vs Ansible?? 어떤 것을 써야할까?
Terraform vs Ansible, Ansible vs Terrafom- 구글에서 자주 검색되는 질문들입니다. 그러나 이게 맞는 말일까요? Terraform과 ansible이 경쟁 관계에 있고 우리는 둘 중 하나만 사용할 수 있을까요? 아니면 사실 둘은 훌륭한 조합이고 함께 사용하거나 함께 사용해야 합니까? 이 기사는 Terraform vs Ansible에 대한 해답을 얻는 것을 목표로 합니다. 이 기사는 개발자의 주관적인 의견을 기반으로 합니다. Terraform Terraform 웹사이트에 따르면 Terraform은 infrastructure의 building, changing, and versioning을 안전하고 효과적으로 할 수 있는 툴입니다. Terraform은 기존의 인기있는 서비스 제공..
2020.02.12
no image
[module] psutil 사용하기 (python system and process utilitis)
psutil은 주로 시스템 모니터링, 프로파일링, 프로세스 리소스 제한 및 실행중인 프로세스 관리에 유용합니다. psutil은 기본적으로 제공되는 모듈이 아닙니다. pip를 이용해 설치하여야 합니다. 1. 시스템 관련기능(System related fuctions) - CPU psutil.cpu_times(percpu=False) cpu 시간을 튜플로 리턴합니다. percpu가 True로 되면 시스템의 각 cpu에 대해서 튜플로 리턴합니다. psutil.cpu_percent(interval=None, percpu=False) 현재 시스템의 전체 cpu 사용률을 백분율로 리턴해줍니다. interval 옵션의 경우 최소 0.1에서 몇초간 호출하는 것을 추천합니다. 0이나 none의 경우 의미없는 값을 리턴합..
2020.02.09
no image
[module] shutil 모듈 사용하기 (High-level file operations)
shutil 모듈은 파일 또는 디렉토리에 대한 복사, 이동, 삭제 등에 관한 기능을 제공합니다. 복사하기 shutil.copy(src, dst) 파일 src 를 파일 또는 디렉토리 dst 에 복사 합니다. src 와 dst 는 문자열이어야합니다. copy()는 파일 데이터와 파일의 권한 모드를 복사합니다. 파일의 생성 및 수정 시간과 같은 다른 메타 데이터까지 복사할려면 copy2()를 대신 사용하면 됩니다. (버전 3.8 이후) 파일을 더 효율적으로 복사하기 위해서 플랫폼 별 fast-copy syscall을 사용할 수 있습니다. 파일 복사와 관련된 모든 기능 ( copyfile(), copy(), copy2(), copytree(), move()) 에서 fast-copy를 사용할 수 있습니다. fas..
2020.02.09
no image
VIM 단축키
출처 https://blog.insightbook.co.kr/
2020.02.09
Mac Os 터미널에서 사용자 이름 숨기기
vi ~/.bashrc #아래 명령어 추가 DEFAULT_USER="$(whoami)" #저장후 source ~/.bashrc
2020.02.09
no image
zsh syntax hightlight 적용하기
zsh syntax hightlight를 설치하면 명령어가 초록색으로 변하는데 사용할 수 없는 명령어는 빨간색으로 표시해 줍니다. 설치방법은 간단합니다. //brew를 통해 설치해줍니다. brew install zsh-syntax-highlighting //플러그인을 적용합니다. source /usr/local/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
2020.02.09
Mac Os에서 iterm2와 zsh 설치하기
기본적으로 terminal과 bash가 설치되어 있지만 iterm2와 zsh에서 좀 더 많은 기능을 제공하기 때문에 개발을 좀 더 편하게 하기 위해 설치하기로 했습니다. 설치하기 brew install iterm2 brew install zsh #oh_my_zsh 설치 sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)" #기본쉘 변경하기 echo $SHELL chsh -s `which zsh` #기존의 ~/.bashrc에 추가한 내용이 있다면 ~/.zshrc에도 적어주도록 합니다. 추가로 현재 디렉토리에서 Git의 상태를 알려주는 agnoster테마로 변경시켜 줍니다. vi ~/.zshrc #..
2020.02.09
#!/usr/bin/env python3

import subprocess
import csv
import re
import operator

def report_error():

  error_dic = {}
  error_list = subprocess.check_output(["grep","ERROR","syslog.log"]).decode()
  error_list = error_list.split('\n')

  for i in range(len(error_list)-1):
    line = error_list[i]
    value = re.search(r"ticky: ERROR ([\w ]*) ", line).group(1)

    if value in error_dic:
      error_dic[value]+=1
    else:
      error_dic[value]=1

  error_dic = sorted(error_dic.items(), key = operator.itemgetter(1), reverse=True)
  error_dic.insert(0,('Error', 'Count'))

  with open("error_message.csv", 'w', newline='') as file:
    writer = csv.writer(file)
    for row in error_dic:
      writer.writerow(row)

def report_user():
  user_dic = {}
  user_list = subprocess.check_output(["cat","syslog.log"]).decode()
  user_list = user_list.split('\n')

  for i in range(len(user_list)-1):
    line = user_list[i]
    user = re.search(r"[(](.*)[)]$", line).group(1)
    type = re.search(r"ticky: (\w*)", line).group(1)

    if user in user_dic:
      if type == 'ERROR':
        user_dic[user][1] += 1
      else:
        user_dic[user][0] += 1
    else:
      if type == 'ERROR':
        user_dic[user] = [0,1]
      else:
        user_dic[user] = [1,0]

  user_dic = sorted(user_dic.items(), key=operator.itemgetter(0))

  user_dic.insert(0,('Username', 'INFO', 'ERROR'))
  with open("user_statistics.csv", 'w', newline='') as file:
    writer = csv.writer(file)
    for row in user_dic:
      row = [row[0], row[1][0], row[1][1]]
      writer.writerow(row)

report_error()
report_user()

Terraform vs Ansible, Ansible vs Terrafom- 구글에서 자주 검색되는 질문들입니다. 그러나 이게 맞는 말일까요? Terraform과 ansible이 경쟁 관계에 있고 우리는 둘 중 하나만 사용할 수 있을까요? 아니면 사실 둘은 훌륭한 조합이고 함께 사용하거나 함께 사용해야 합니까? 이 기사는 Terraform vs Ansible에 대한 해답을 얻는 것을 목표로 합니다.

 

이 기사는 개발자의 주관적인 의견을 기반으로 합니다.

 

Terraform

Terraform 웹사이트에 따르면

 

Terraform은 infrastructure의 building, changing, and versioning을 안전하고 효과적으로 할 수 있는 툴입니다. Terraform은 기존의 인기있는 서비스 제공 업체와 맞춤형 사내 솔루션을 관리 할 수 있습니다.

 

Terraform은 Slack, Twitch(독자적인 인프라 관리 툴 Cloud Formation을 가진 아마존의 소유), Uber, Startbucks같은 회사에서 사용중 입니다. Terraform은 CloudFare, Heroku, Microsoft Azure 이나 Google Compute 엔진과 통합될 수 있습니다.

 

Ansible

Ansible은 IT infrastructure와 app을 자동화하고 구성하는 가장 간단한 방법입니다. Ansible은 당신이 기업에서 어떤 자동화 플랫폼을 사용하든 상관이 없습니다.(원문 : An enterprise automation platform for the entire IT organization, no matter where you are in your automation journey.)

 

Ansible은 9gag, Zalando 그리고 Revolut같은 회사에서 사용되고 있습니다. Ansible은 Docker, Amazon Ec2 나 쿠버네티스와 같이 사용될 수 있습니다.

 

Who's the best?

우선, 어느 것이 더 좋은지 명확히 결정하기는 어렵습니다. 왜냐하면 둘은 비슷하지만 다른 목적으로 만들어 졌기 때문입니다.

 

Terrform은 orchestration tool이고 Ansible은 configuration management tool이지만 중복되는 몇몇 기능들이 있습니다. 하지만 그런 기능들은 제외되지않고 같이 사용할 수 있습니다.

저는 이 부분을  '음악가들의 오케스트레이션'에 비유해 설명 해보겠습니다. 여기서 terraform은 올바른 수의 악기들이 연주되고 소리가 올바르게 나는지 보장하는 지휘자입니다.

문제가 있을 경우 지휘자는 문제가 있는 악기를 교체합니다. 오케스트레이션 도구는 최종 결과에 중점을 두고 환경이 특정 상태로 유지되도록 할 수 있습니다. 따라서 Terraform은 환경을 정상인 상태로 유지시켜주는데 탁월한 기능을 제공합니다.

 

Ansible은 상황에 따라 다르게 동작하는 configuration management tool입니다. Ansible은 아까와 같은 상황(악기가 고장난)에서 악기를 교체하는 작업 대신 악기를 수리하기 위해 동작합니다. 물론 Ansible이 orchestration 작업을 수행할 수는 있지만 Terraform이 orchestration을 위해 더 advanced 하고 더 나은 옵션을 제공합니다.

 

Terraform에는 스레드에서 리소스 세트(종속 트리 내부)를 만들 수 있는 parallel mechanisms이 있습니다. Ansible에서 동일한 결과를 얻으려면 async와 poll을 창의적으로 사용해야 하므로 대기 시간이 있는 async blocks를 사용해야 할 것입니다.

(원문 : Terraform has built-in parallel mechanisms which allow creating a set of resources (within dependency tree) in threads. To achieve the same, Ansible would require to creatively use async and poll, which would probably make you do async blocks with a wait period between them.)

 

----Asynchronous(비동기식) : system call이 완료되지 않아도 나중에 완료가 되면 그때 결과물을 가져온다.(주로 callback 함수를 통해 결과물을 가져온다)

 

절차적(Procedural) 아니면 선언적(Declarative)?

DevOps 도구로의 또 다른 관점의 분류로는 절차적(procedural)과 선언적(Declarative)로 볼 수 있습니다. 이러한 분류는 tool이 어떻게 동작하는지 설명합니다. 여기서 Terraform은 선언적 그룹에 속합니다. 이 부분이 의미하는 것은 만약 현재 정의된 환경이 변경되었다면 그것은 Terraform에 의해서 수정된 것입니다.

 

오케스트라의 비유로 돌아가서 설명하자면 Terraform은 더 많거나 적은 악기를 선언해야합니다. 따라서 만약 당신에게 5개의 악기가 있고 5개의 악기가 더 필요하다면 코드에 그것을 배치하면 됩니다. 더 적게 필요한 경우 코드에서 당신이 원하는 만큼 삭제하면 됩니다.

 

반면 Ansible은 하이브리드로 인식됩니다. Ansible은 절차적 스타일 구성이나 선언적으로 수행하는 모듈을 사용하여 두가지 스타일 모두 수행할 수 있습니다. 그래서 문서를 읽고 예상되는 동작을 이해하는 것이 매우 중요합니다.

 

즉, Terraform은 클라우드 인프라 구성에 적합하고 Ansible은 인프라 내의 서버 구성에 사용됩니다. Terraform에는 Ansible용 provisioning plugin이 없지만 많은 사람들이 Terraform으로 서버를 만들고 Ansible로 서버를 구성합니다. Terraform내에서 필요한 Ansible role들을 호출할 수도 있습니다.

 

그러나 stackshare.io의 통계를 살펴보면 Ansible은 stackoverflow의 12k이상의 점수를 기록하고 github의 41k의 star를 가진 Terraform보다 훨씬 인기가 많습니다.

 

결론

Terraform은 불변성(immutability)를 염두에 두고 설계 되었습니다. 변하지 않는 infrastructure를 기본적인 방식으로 처리하는 provisioning tool입니다. 따라서 configuration management tool들을 거부할 때 가장 좋은 선택으로 볼 수 있습니다. Terraform은 더 직관적인 infrastructure orchestration을 위해 만들어 졌으며 Terraform의 모든 업데이트는 이 직관적인 infra를 위해 전념중이기 때문입니다.

Ansible은 configuration management에 최적화 되어 있습니다. Ansible이 orchestration을 수행할 수는 있지만 주어진 환경에 가장 적합한(가장 빠른) tool을 사용하는 것이 좋습니다.

 

Terraform과 Ansible은 모두 독립적인 도구로 작용하거나 함께 작동 될수 있지만 주어진 작업에 항상 올바른 도구를 사용해야 하는 것을 기억해야합니다.

 

기사 원문:

https://selleo.com/blog/terraform-vs-ansible?fbclid=IwAR0Ip2mrSo4NUME1c2004mpPqvxvHwRS5749FYVmbY4sLZ_760MahQQ7038

'Ansible' 카테고리의 다른 글

AWS에서 ansible을 사용하여 ec2 추가하기  (0) 2020.01.11

psutil은 주로 시스템 모니터링, 프로파일링, 프로세스 리소스 제한 및 실행중인 프로세스 관리에 유용합니다.

psutil은 기본적으로 제공되는 모듈이 아닙니다. pip를 이용해 설치하여야 합니다.

 

1. 시스템 관련기능(System related fuctions) - CPU

psutil.cpu_times(percpu=False)

cpu 시간을 튜플로 리턴합니다. percpu가 True로 되면 시스템의 각 cpu에 대해서 튜플로 리턴합니다.

 

 

psutil.cpu_percent(interval=None, percpu=False)

현재 시스템의 전체 cpu 사용률을 백분율로 리턴해줍니다. interval 옵션의 경우 최소 0.1에서 몇초간 호출하는 것을 추천합니다. 0이나 none의 경우 의미없는 값을 리턴합니다. percpu가 True로 되면 시스템의 각 cpu의 사용률을 백분율로 리턴해줍니다.

 

psutil.cpu_times_percent(interval=None , percpu=False) 

cpu시간에 대한 사용율을 리턴합니다.

 

psutil.cpu_count(logical=True)

logical 플래그가 False라면 물리적 코어의 수를 리턴하고 True면 논리적 코어의 수를 리턴한다. 

 - Memory

psutil.virtual_memory()

시스템 메모리 사용량을 바이트 단위로 다음 항목을 포함하여 튜플로 리턴합니다.

total : 총 메모리

available : 시스템을 스왑하지 않고 프로세스에 즉시 제공할 수 있는 메모리. 실제 메모리 사용량을 모니터링 하는데 사용됩니다.

used : 사용되는 메모리, 플랫폼에 따라 다르게 계산됩니다. total - used 메모리가 반드시 free 메모리와 일치하지는 않습니다.

free : 실제 메모리 여유량.

active : 현재 사용중이거나 최근에 사용된 메모리

inactive : 사용중이 아닌 메모리

buffers : 파일 시스템, 메타 데이터와 같은 것들을 위한 캐시

shared : 여러 프로세스에서 동시에 액세스 가능한 메모리

slab : 커널 내부 데이터 구조 캐시

wired : 항상 ram에 남아있는 것으로 표시되는 메모리

 

psutil.swap_memory()

시스템 스왑 메모리 사용량을 다음 항목을 포함하여 튜플로 리턴합니다.

total : 총 스왑 메모리

used : 사용중인 스왑 메모리

free : 사용가능한 스왑 메모리

percent : 사용량

sin : 시스템이 디스크에서 스왑한 바이트 수 (누적)

sout : 시스템이 디스크에서 스왑한 바이트 수 (누적)

 - Disks

psutil.disk_partitions(all=False)

마운트된 모든 디스크 파티션을 "df" 명령어와 유사하게 장치, 마운트지점 및 파일 시스템 유형을 포함한 튜플로 리턴합니다.

 

psutil.disk_usage(path)

total, used, free, percent 항목을 포함하여 튜플로 반환합니다.

사용 예

https://github.com/giampaolo/psutil/blob/master/scripts/disk_usage.py

 

 

 - Network

psutil.net_connections(kind='inet') 

시스템 전체 소켓 연결을 튜블로 리턴합니다. 

fd : socket file descriptor, 윈도우와 sunOS에서는 항상 -1

family : address family

type : address type

laddr : local address

raddr : remote address

status : TCP 연결의 상태

pid : 소켓이 연결된 process id

 

psutil.net_if_addrs()

key가 NIC 이름이고 값이 NIC에 할당된 주소인 튜플 목록인 딕셔너리로 리턴합니다.

family : address family

address : 기본 NIC 주소

netmask : netmask 주소

broadcast : broadcast 주소

ptp : 포인트 투 포인트 주소(일반적으로 VPN)

 

psutil.net_if_stats()

key가 NIC 이름이고 값이 NIC에 할당된 주소인 튜플 목록인 딕셔너리로 리턴합니다.

isup : NIC가 작동중인지 여부를 나타냄

duplex : duplex 통신 유형

speed : MB로 표시되는 NIC 속도

mtu : 바이트 단위로 표시되는 NIC의 최대 전송 단위

 

2. Process

psutil.pids()

현재 실행중인 PID를 정렬해 리턴합니다.

 

psutil.process_iter(attrs=None, ad_value=None, new_only=False) 

사용법 예:

>>> import psutil
>>> for proc in psutil.process_iter(attrs=['pid', 'name', 'username']):
...     print(proc.info)
...
{'name': 'systemd', 'pid': 1, 'username': 'root'}
{'name': 'kthreadd', 'pid': 2, 'username': 'root'}
{'name': 'ksoftirqd/0', 'pid': 3, 'username': 'root'}
...

딕셔너리로 데이터 구조 생성 예:

>>> import psutil
>>> procs = {p.pid: p.info for p in psutil.process_iter(attrs=['name', 'username'])}
>>> procs
{1: {'name': 'systemd', 'username': 'root'},
 2: {'name': 'kthreadd', 'username': 'root'},
 3: {'name': 'ksoftirqd/0', 'username': 'root'},
 ...}

이름으로 필터링 :

>>> import psutil
>>> [p.info for p in psutil.process_iter(attrs=['pid', 'name']) if 'python' in p.info['name']]
[{'name': 'python3', 'pid': 21947},
 {'name': 'python', 'pid': 23835}]

새로운 프로세스만 가져오기 :

>>> import psutil
>>> for proc in psutil.process_iter(attrs=['pid', 'name'], new_only=True):
...     print(proc.info)
...

 

psutil.pid_exists(pid) 

pid가 현재 프로세스 목록에 있는지 확인합니다. 

 

psutil.wait_procs(procs, timeout=None, callback=None) 

 

 

 

출처

https://psutil.readthedocs.io/en/latest/

shutil 모듈은 파일 또는 디렉토리에 대한 복사, 이동, 삭제 등에 관한 기능을 제공합니다.

 

복사하기

shutil.copy(src, dst)

 

파일 src 를 파일 또는 디렉토리 dst 에 복사 합니다. src  dst 는 문자열이어야합니다.

copy()는 파일 데이터와 파일의 권한 모드를 복사합니다. 파일의 생성 및 수정 시간과 같은 다른 메타 데이터까지 복사할려면 copy2()를 대신 사용하면 됩니다.

 

(버전 3.8 이후) 파일을 더 효율적으로 복사하기 위해서 플랫폼 별 fast-copy syscall을 사용할 수 있습니다.

파일 복사와 관련된 모든 기능 ( copyfile(), copy(), copy2(), copytree(), move()) 에서 fast-copy를 사용할 수 있습니다. fast-copy는 작업이 커널 내에서 발생하여 "outfd.write(infd.read())"와 달리 Python userspace buffers 사용을 피할 수 있습니다.

macOS에서는 fcopyfile linux는 os.sendfile()이 사용됩니다.

fast-copy가 실패하고 데이터가 기록되지 않은 경우 shutil은 copyfileobj() 내부적으로 덜 효율적인 기능을 사용하여 자동으로 풀백됩니다.

 

shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy,
                ignore_dangling_symlinks=False, dir_exist_ok=False)

copytree는 src를 루트로 하는 전체 디렉토리 트리를 dst에 복사합니다.

dir_exist_ok는 dst의 누락된 상위폴더가 이미 존재하는 경우 예외를 발생시킬지 여부를 체크합니다.

symlink가 True면 src 디렉토리에 있는 심볼릭링크 들은 dst 디렉토리에 심볼릭 링크로 생성됩니다.

symlink가 False면 src 디렉토리에 심볼릭링크에 연결된 파일이 dst 디렉토리로 복사됩니다.

symlink가 False이고 심볼릭링크에 연결된 파일이 없을때 error가 발생하는데 이 때 ignore_dangling_symlinks 플래그를 True로 설정하면 error메세지가 발생하지 않습니다.

 

shutil.rmtree(path, ignore_errors = False, onerror = None)

path 디렉토리를 삭제합니다. ignore_errors가 True라면 삭제 실패시 발생하는 에러는 무시됩니다. ingore_errors가 False거나 생략되면 onerror에 지정된 핸들러를 호출하여 처리하거나 예외를 발생시킵니다.

 

shutil.move(src, dst, copy_function = copy2)

src의 파일 또는 디렉토리를 dst로 이동하고 리턴합니다.

dst의 대상이 이미 존재하는 디렉토리라면 src가 해당 디렉토리 안으로 이동합니다. 또는 대상이 이미 존재하지만 디렉토리가 아니라면 덮어 쓸수도 있습니다.

 

shutil.disk_usage(path)

path에 대한 디스크 사용량 통계를 total, used 및 free 속성을 가진 튜플을 바이트 단위로 리턴합니다. 

 

shutil.which(cmd)

cmd가 호출된 경우 cmd의 경로 디렉토리를 반환합니다.

 

출처

https://docs.python.org/3/library/shutil.html

VIM 단축키

NewProduct
|2020. 2. 9. 17:02

출처

https://blog.insightbook.co.kr/

vi ~/.bashrc

#아래 명령어 추가
DEFAULT_USER="$(whoami)"

#저장후
source ~/.bashrc

 

'개발환경' 카테고리의 다른 글

VIM 단축키  (0) 2020.02.09
zsh syntax hightlight 적용하기  (0) 2020.02.09
Mac Os에서 iterm2와 zsh 설치하기  (0) 2020.02.09
Mac Os에서 Tmux 설치 & 사용법  (0) 2020.02.09
Mac Os에서 ctags 설치 & 사용법  (0) 2020.02.09

zsh syntax hightlight를 설치하면 명령어가 초록색으로 변하는데 사용할 수 없는 명령어는 빨간색으로 표시해 줍니다.

 

설치방법은 간단합니다.

 

//brew를 통해 설치해줍니다.
brew install zsh-syntax-highlighting

//플러그인을 적용합니다.
source /usr/local/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh

'개발환경' 카테고리의 다른 글

VIM 단축키  (0) 2020.02.09
Mac Os 터미널에서 사용자 이름 숨기기  (0) 2020.02.09
Mac Os에서 iterm2와 zsh 설치하기  (0) 2020.02.09
Mac Os에서 Tmux 설치 & 사용법  (0) 2020.02.09
Mac Os에서 ctags 설치 & 사용법  (0) 2020.02.09

기본적으로 terminal과 bash가 설치되어 있지만 iterm2와 zsh에서 좀 더 많은 기능을 제공하기 때문에 개발을 좀 더 편하게 하기 위해 설치하기로 했습니다.

설치하기

brew install iterm2
brew install zsh

#oh_my_zsh 설치
sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

#기본쉘 변경하기
echo $SHELL
chsh -s `which zsh`

#기존의 ~/.bashrc에 추가한 내용이 있다면 ~/.zshrc에도 적어주도록 합니다.

 

추가로 현재 디렉토리에서 Git의 상태를 알려주는 agnoster테마로 변경시켜 줍니다.

vi ~/.zshrc

#zsh테마 항목을 "robyrussell"에서 "agnoster"로 변경시켜 줍니다.
ZSH_THEME=”agnoster”

변경후 폰트가 깨지게 되는데 iterm의 폰트를  https://github.com/naver/d2codingfont에서 받은 폰트로 변경시키면 해결됩니다.