#!/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 tocreatively use async and poll, which would probably make you doasync blockswith 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은 모두 독립적인 도구로 작용하거나 함께 작동 될수 있지만 주어진 작업에 항상 올바른 도구를 사용해야 하는 것을 기억해야합니다.
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의 사용률을 백분율로 리턴해줍니다.
>>> 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)
...
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() 내부적으로 덜 효율적인 기능을 사용하여 자동으로 풀백됩니다.